1 計(jì)算圖在TensorFlow中,,算法都被表示成計(jì)算圖(computational graphs),。計(jì)算圖也叫數(shù)據(jù)流圖,可以把計(jì)算圖看做是一種有向圖,,圖中的節(jié)點(diǎn)表示操作,,圖中的邊代表在不同操作之間的數(shù)據(jù)流動(dòng)。 如圖所示,,左邊的圖表示 在這樣的數(shù)據(jù)流圖中,有四個(gè)主要的元素: 操作把算法表示成一個(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è)固定輸出的操作,。具體操作如下所示:
每一種操作都需要相對(duì)應(yīng)的底層計(jì)算支持,比如在GPU上使用就需要實(shí)現(xiàn)在GPU上的操作符,,在CPU上使用就要實(shí)現(xiàn)在CPU上的操作符,。 張量在計(jì)算圖中,每個(gè)邊就代表數(shù)據(jù)從一個(gè)操作流到另一個(gè)操作,。這些數(shù)據(jù)被表示為張量,,一個(gè)張量可以看做是多維的數(shù)組或者高維的矩陣。 變量變量是計(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): 如圖所示, 會(huì)話在TensorFlow中,所有操作都必須在會(huì)話(session)中執(zhí)行,,會(huì)話負(fù)責(zé)分配和管理各種資源,。在會(huì)話中提供了一個(gè) 2 執(zhí)行在執(zhí)行的時(shí)候,TensorFlow支持兩種方式:一種是單機(jī)版本,,可以在單機(jī)上支持多個(gè)計(jì)算設(shè)備,,還有一種是分布式版本,支持多機(jī)多設(shè)備,。在TensorFlow剛出來(lái)的時(shí)候,,只支持第一種方式,后來(lái)開(kāi)源了分布式版本,。 當(dāng)client發(fā)出 計(jì)算設(shè)備所有的計(jì)算任務(wù)最終都將分配到實(shí)際的硬件上執(zhí)行,。除了CPU和GPU之外,TensorFlow也支持自定義硬件,,比如谷歌自己使用的TPU(Tensor Processing Unit),。一個(gè)worker需要管理多個(gè)設(shè)備,所以這些設(shè)備的名稱需要加上worker的名字,,比如 任務(wù)分配算法如何將某個(gè)計(jì)算節(jié)點(diǎn)分配到具體設(shè)備上,TensorFlow提供了分配算法(placement algorithm),。
跨設(shè)備執(zhí)行如果用戶系統(tǒng)有多個(gè)設(shè)備,任務(wù)分配算法就需要將節(jié)點(diǎn)分配到不同的設(shè)備上,,在這個(gè)分配過(guò)程中,,可能會(huì)出現(xiàn)一個(gè)設(shè)備中的輸入依賴于另一個(gè)設(shè)備上的輸出。此時(shí)就需要設(shè)備之間交叉執(zhí)行,。 如圖所示,,設(shè)備A上有節(jié)點(diǎn) 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)度也能降低 精度優(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īng)網(wǎng)絡(luò)中常常需要對(duì)權(quán)重
|
|