久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

TensorFlow學(xué)習(xí)筆記:編程模型 和 反向傳播模型

 雪柳花明 2017-04-22

1 計(jì)算圖

在TensorFlow中,,算法都被表示成計(jì)算圖(computational graphs),。計(jì)算圖也叫數(shù)據(jù)流圖,可以把計(jì)算圖看做是一種有向圖,,圖中的節(jié)點(diǎn)表示操作,,圖中的邊代表在不同操作之間的數(shù)據(jù)流動(dòng)。

數(shù)據(jù)流圖

如圖所示,,左邊的圖表示z=x+y,。從圖中可以看到,x y z是圖中的三個(gè)節(jié)點(diǎn),,xy分別有一個(gè)箭頭指到z,,在z節(jié)點(diǎn)的下方有一個(gè)+號(hào),表明是一個(gè)加法操作,,因此最后的輸出結(jié)果就是z=x+y,。右圖是一種相對(duì)復(fù)雜點(diǎn)的情況,隨著計(jì)算圖逐步分析可以得到y^=σ(xTw+b),。

在這樣的數(shù)據(jù)流圖中,有四個(gè)主要的元素:
* 操作(operations)
* 張量(tensors)
* 變量(variables)
* 會(huì)話(sessions)

操作

把算法表示成一個(gè)個(gè)操作的疊加,,可以非常清晰地看到數(shù)據(jù)之間的關(guān)系,,而且這樣的基本操作也具有普遍性。在TensorFlow中,,當(dāng)數(shù)據(jù)流過(guò)操作節(jié)點(diǎn)的時(shí)候就可以對(duì)數(shù)據(jù)進(jìn)行操作,。一個(gè)操作可以有零個(gè)或多個(gè)輸入,產(chǎn)生零個(gè)或多個(gè)輸出,。一個(gè)操作可能是一次數(shù)學(xué)計(jì)算,,一個(gè)變量或常量,一個(gè)數(shù)據(jù)流走向控制,,一次文件IO或者是一次網(wǎng)絡(luò)通信,。其中,一個(gè)常量可以看做是沒(méi)有輸入,,只有一個(gè)固定輸出的操作,。具體操作如下所示:

操作類型 例子
元素運(yùn)算 Add,Mul
矩陣運(yùn)算 MatMul,MatrixInverse
數(shù)值產(chǎn)生 Constant,Variable
神經(jīng)網(wǎng)絡(luò)單元 SoftMax,ReLU,Conv2D
I/O Save,Restore

每一種操作都需要相對(duì)應(yīng)的底層計(jì)算支持,比如在GPU上使用就需要實(shí)現(xiàn)在GPU上的操作符,,在CPU上使用就要實(shí)現(xiàn)在CPU上的操作符,。

張量

在計(jì)算圖中,每個(gè)邊就代表數(shù)據(jù)從一個(gè)操作流到另一個(gè)操作,。這些數(shù)據(jù)被表示為張量,,一個(gè)張量可以看做是多維的數(shù)組或者高維的矩陣。
關(guān)于TensorFlow中的張量,需要注意的是張量本身并沒(méi)有保存任何值,,張量?jī)H僅提供了訪問(wèn)數(shù)值的一個(gè)接口,,可以看做是數(shù)值的一種引用。在TensorFlow實(shí)際使用中我們也可以發(fā)現(xiàn),,在run之前的張量并沒(méi)有分配空間,,此時(shí)的張量?jī)H僅表示了一種數(shù)值的抽象,用來(lái)連接不同的節(jié)點(diǎn),,表示數(shù)據(jù)在不同操作之間的流動(dòng),。
TensorFlow中還提供了SparseTensor數(shù)據(jù)結(jié)構(gòu),用來(lái)表示稀疏張量,。

變量

變量是計(jì)算圖中可以改變的節(jié)點(diǎn),。比如當(dāng)計(jì)算權(quán)重的時(shí)候,隨著迭代的進(jìn)行,,每次權(quán)重的值會(huì)發(fā)生相應(yīng)的變化,,這樣的值就可以當(dāng)做變量。在實(shí)際處理時(shí),,一般把需要訓(xùn)練的值指定為變量,。在使用變量的時(shí)候,需要指定變量的初始值,,變量的大小和數(shù)據(jù)類型就是根據(jù)初始值來(lái)推斷的,。

在構(gòu)建計(jì)算圖的時(shí)候,指定一個(gè)變量實(shí)際上需要增加三個(gè)節(jié)點(diǎn):
* 實(shí)際的變量節(jié)點(diǎn)
* 一個(gè)產(chǎn)生初始值的操作,,通常是一個(gè)常量節(jié)點(diǎn)
* 一個(gè)初始化操作,,把初始值賦予到變量

變量

如圖所示,v代表的是實(shí)際的變量,,i是產(chǎn)生初始值的節(jié)點(diǎn),,上面的assign節(jié)點(diǎn)將初始值賦予變量,assign操作以后,,產(chǎn)生已經(jīng)初始化的變量值v',。

會(huì)話

在TensorFlow中,所有操作都必須在會(huì)話(session)中執(zhí)行,,會(huì)話負(fù)責(zé)分配和管理各種資源,。在會(huì)話中提供了一個(gè)run方法,可以用它來(lái)執(zhí)行計(jì)算圖整體或者其中的一部分節(jié)點(diǎn),。在進(jìn)行run的時(shí)候,,還需要用feed_dict把相關(guān)數(shù)據(jù)輸入到計(jì)算圖。
當(dāng)run被調(diào)用的時(shí)候,,TensorFlow將會(huì)從指定的輸出節(jié)點(diǎn)開(kāi)始,,向前查找所有的依賴界節(jié)點(diǎn),,所有依賴節(jié)點(diǎn)都將被執(zhí)行。這些操作隨后將被分配到物理執(zhí)行單元上(比如CPU或GPU),,這種分配規(guī)則由TensorFlow中的分配算法決定,。


2 執(zhí)行

在執(zhí)行的時(shí)候,TensorFlow支持兩種方式:一種是單機(jī)版本,,可以在單機(jī)上支持多個(gè)計(jì)算設(shè)備,,還有一種是分布式版本,支持多機(jī)多設(shè)備,。在TensorFlow剛出來(lái)的時(shí)候,,只支持第一種方式,后來(lái)開(kāi)源了分布式版本,。

執(zhí)行

當(dāng)client發(fā)出run請(qǐng)求時(shí),,master會(huì)將這個(gè)請(qǐng)求分配到不同的worker上,這些worker負(fù)責(zé)監(jiān)控具體的計(jì)算設(shè)備,。

計(jì)算設(shè)備

所有的計(jì)算任務(wù)最終都將分配到實(shí)際的硬件上執(zhí)行,。除了CPU和GPU之外,TensorFlow也支持自定義硬件,,比如谷歌自己使用的TPU(Tensor Processing Unit),。一個(gè)worker需要管理多個(gè)設(shè)備,所以這些設(shè)備的名稱需要加上worker的名字,,比如/cpu:0表示第一個(gè)CPU,。

任務(wù)分配算法

如何將某個(gè)計(jì)算節(jié)點(diǎn)分配到具體設(shè)備上,TensorFlow提供了分配算法(placement algorithm),。
分配算法首先模擬計(jì)算圖的執(zhí)行,從輸入節(jié)點(diǎn)到輸出節(jié)點(diǎn)進(jìn)行遍歷,,在遍歷過(guò)程中遇到節(jié)點(diǎn)v,,需要決定將這個(gè)節(jié)點(diǎn)分配到設(shè)備D={d1,...,dn}中的某一個(gè)設(shè)備上,具體分配將使用一個(gè)成本模型Cv(d),。這個(gè)成本模型需要考慮四個(gè)方面的信息來(lái)決定最優(yōu)的執(zhí)行設(shè)備d^=argmindDCv(d)

  • 該設(shè)備是否實(shí)現(xiàn)了這個(gè)操作,,比如某個(gè)操作不能在GPU上實(shí)現(xiàn),那么所有的GPU成本都為無(wú)窮大,。
  • 估計(jì)節(jié)點(diǎn)的輸入和輸出數(shù)據(jù)大小
  • 在設(shè)備上執(zhí)行時(shí)間
  • 如果輸入的數(shù)據(jù)在另一個(gè)設(shè)備上,,還需要考慮數(shù)據(jù)在不同設(shè)備間傳輸?shù)某杀?

跨設(shè)備執(zhí)行

如果用戶系統(tǒng)有多個(gè)設(shè)備,任務(wù)分配算法就需要將節(jié)點(diǎn)分配到不同的設(shè)備上,,在這個(gè)分配過(guò)程中,,可能會(huì)出現(xiàn)一個(gè)設(shè)備中的輸入依賴于另一個(gè)設(shè)備上的輸出。此時(shí)就需要設(shè)備之間交叉執(zhí)行,。

交叉執(zhí)行

如圖所示,,設(shè)備A上有節(jié)點(diǎn)ν,,設(shè)備B上有節(jié)點(diǎn)αβ,其中ν的輸出是αβ的輸入,。在計(jì)算圖中,,νανβ就需要跨設(shè)備執(zhí)行。此時(shí),,TensorFlow將會(huì)自動(dòng)在適當(dāng)位置增加sendrecv節(jié)點(diǎn),,在節(jié)點(diǎn)ν后面增加一個(gè)send節(jié)點(diǎn),在αβ前面增加recv節(jié)點(diǎn),,sendrecv節(jié)點(diǎn)之間使用額外的邊進(jìn)行鏈接,。當(dāng)數(shù)據(jù)流過(guò)這兩個(gè)節(jié)點(diǎn)的時(shí)候就需要進(jìn)行設(shè)備間通信,設(shè)備間通信方式包括TCP和RDMA等方式,。此外,,TensorFlow還會(huì)對(duì)recv節(jié)點(diǎn)進(jìn)行進(jìn)一步的優(yōu)化,可以將設(shè)備B上的兩個(gè)recv節(jié)點(diǎn)進(jìn)行合并,,減少通信次數(shù),,如圖(c)所示。


3 優(yōu)化

在編譯的時(shí)候,,TensorFlow還會(huì)進(jìn)行一些優(yōu)化以提高性能,。

子圖消除

在程序中,常常有一些重復(fù)的操作,,可以把這些操作進(jìn)行合并,。可以將反復(fù)進(jìn)行計(jì)算的同一個(gè)子圖進(jìn)行合并,,保存其中的一個(gè)輸出,,在其他地方只需要直接調(diào)用就可以了。

調(diào)度優(yōu)化

節(jié)點(diǎn)的執(zhí)行越晚越好,,這樣的話,,這個(gè)節(jié)點(diǎn)只在內(nèi)存中保留較短的時(shí)間,可以有效降低內(nèi)存的使用量,。合理調(diào)度也能降低sendrecv節(jié)點(diǎn)的網(wǎng)絡(luò)沖突,。

精度優(yōu)化

許多機(jī)器學(xué)習(xí)算法不需要高的浮點(diǎn)精度,比如float32,,只需要16位精度就夠了,,因此可以將32位精度降低為16位精度。當(dāng)需要轉(zhuǎn)換成32位精度時(shí),,只需要將尾部直接補(bǔ)0即可,。


4 反向傳播的計(jì)算圖

在神經(jīng)網(wǎng)絡(luò)訓(xùn)練中,需要使用到反向傳播算法,。在TensorFlow等深度學(xué)習(xí)框架中,,梯度計(jì)算都是自動(dòng)進(jìn)行的,,不需要人工進(jìn)行梯度計(jì)算,這樣只需要使用者定義網(wǎng)絡(luò)的結(jié)構(gòu),,其他工作都由深度學(xué)習(xí)框架自動(dòng)完成,,大大簡(jiǎn)化了算法驗(yàn)證。在TensorFlow中,,梯度計(jì)算也是采用了計(jì)算圖的結(jié)構(gòu),。

梯度計(jì)算

如圖,在神經(jīng)網(wǎng)絡(luò)中常常需要對(duì)權(quán)重w進(jìn)行求導(dǎo),。這樣的函數(shù)前向計(jì)算的式子為:

z=h(y),,y=g(x)x=f(w)
整合一下就可以得到:
z=h(g(f(w)))
使用鏈?zhǔn)角髮?dǎo)法則,,可以得到
dzdw=dzdydydxdxdw
在計(jì)算圖中,,每個(gè)節(jié)點(diǎn)邊上會(huì)自動(dòng)增加梯度節(jié)點(diǎn),然后每個(gè)梯度節(jié)點(diǎn)與前一個(gè)梯度節(jié)點(diǎn)相乘,,最終在右下角可以得到dzdw的值,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多