【Deep Learning with PyTorch 中文手冊】(三)Execution Mode

?Immediate versus Deferred Execution

深度學(xué)習(xí)庫的關(guān)鍵區(qū)別在于是即時執(zhí)行(Immediate Execution)還是延遲執(zhí)行(Deferred Execution)。PyTorch的易用性很大程度上取決于它如何實(shí)現(xiàn)即時執(zhí)行暮顺,因此我們在這里簡要介紹一下。

首先看一個例子,如果需要執(zhí)行勾股定理表達(dá)式,需要定義兩個變量a和b舷蟀,Python實(shí)現(xiàn)過程如下:

>>> a = 3

>>>?b?=?4

>>> c = (a**2 + b**2) ** 0.5

>>> c

5.0

像這樣獲取輸入值(a跃巡、b)后得到輸出值(c)的過程就是即時執(zhí)行。PyTorch就像普通的Python程序一樣洞难,默認(rèn)執(zhí)行方式為即時執(zhí)行(在PyTorch文檔中稱為Eager Mode)。即時執(zhí)行非常有用揭朝,如果在執(zhí)行某個表達(dá)式時出現(xiàn)錯誤队贱,Python的解釋器、調(diào)試器或者其他類似的工具都能夠直接訪問到相關(guān)的Python對象潭袱,并且在執(zhí)行出錯的地方會直接拋出異常柱嫌。

現(xiàn)在討論另一種情況,我們可以先行定義勾股定理表達(dá)式而不必關(guān)心具體的輸入是什么屯换,隨后我們在獲取到具體的輸入時再使用該表達(dá)式得到輸出编丘。我們定義的函數(shù)可以根據(jù)不同的輸入而隨時調(diào)用。比如像這樣:

>>> p = lambda a,b: (a**2 + b**2) ** 0.5

>>> p(1,2)

2.23606797749979

>>> p(3,4)

5.0

在第二個例子中彤悔,我們定義了一系列待執(zhí)行的操作嘉抓,并返回一個輸出函數(shù)(p)。然而直到我們給定了具體的輸入蜗巧,這些操作才會執(zhí)行掌眠。這個例子就是延遲執(zhí)行。延遲執(zhí)行意味著大多數(shù)異常是在函數(shù)調(diào)用時(而不是在函數(shù)定義時)拋出的幕屹。對于普通的Python程序(第二個例子)來說蓝丙,這種實(shí)現(xiàn)方式很不錯。這是因?yàn)樵诔绦虬l(fā)生錯誤時望拖,解釋器和調(diào)試器能夠完全訪問到Python的狀態(tài)渺尘。

然而,如果我們使用具有大量運(yùn)算符重載的專用類说敏,允許那些即時執(zhí)行的操作推遲到后臺運(yùn)行鸥跟,情況就會變得復(fù)雜棘手。這些專用類看上去可能長這個樣子:(作者你又開始暗指某廠了 - -)

>>> a = InputParameterPlaceholder()

>>> b = InputParameterPlaceholder()

>>> c = (a**2 + b**2) ** 0.5

>>> callable(c)

True

>>> c(3, 4)

5.0

通常,在采用上述這種函數(shù)定義形式的庫中医咨,對a和b求平方枫匾、相加再取平方根的操作不會被記錄為高級的Python字節(jié)碼。相反拟淮,這些庫更傾向于將表達(dá)式編譯成靜態(tài)計(jì)算圖(包含基本操作的圖)干茉,這種方式相比于純Python代碼的形式可能會有一些優(yōu)勢(例如出于性能原因?qū)?shù)學(xué)公式直接編譯為機(jī)器代碼)。

計(jì)算圖在某處定義很泊,卻在別處執(zhí)行角虫,這會使得調(diào)試變得更加困難。因?yàn)楫惓Mǔ笔шP(guān)于錯誤的具體信息委造,并且Python的調(diào)試工具也看不到數(shù)據(jù)的中間狀態(tài)戳鹅。另外,靜態(tài)圖通常不能很好地與標(biāo)準(zhǔn)Python控制流融合:它們實(shí)際上是基于宿主語言(本例中是Python)而實(shí)現(xiàn)的針對特定領(lǐng)域的語言昏兆。

接下來枫虏,我們將更具體地研究即時執(zhí)行和延遲執(zhí)行之間的區(qū)別,特別是在與神經(jīng)網(wǎng)絡(luò)相關(guān)的情況下亮垫。在這里我們不會深入地探索這些概念模软,而是在宏觀角度上給讀者介紹一下這些概念中的術(shù)語及其關(guān)系伟骨。理解這些概念及其關(guān)系可以幫助我們理解像PyTorch這種使用即時執(zhí)行的框架與使用延遲執(zhí)行的框架之間的區(qū)別饮潦,盡管這兩種類型框架的底層數(shù)學(xué)原理是相同的。

神經(jīng)網(wǎng)絡(luò)的基本組成單元是神經(jīng)元携狭。大量的神經(jīng)元串在一起構(gòu)成神經(jīng)網(wǎng)絡(luò)继蜡。

下圖中第一行展示的是單個神經(jīng)元典型的數(shù)學(xué)表達(dá)式:

o =?tanh(w * x + b)

在我們解釋下圖中的執(zhí)行模式前,有以下幾點(diǎn)需要說明:

x 是單個神經(jīng)元計(jì)算的輸入逛腿。

w 和 b 是神經(jīng)元的參數(shù)或者說是權(quán)重稀并,根據(jù)需求它們的值可以被更新。

為了更新參數(shù)(生成更接近我們預(yù)期的輸出)单默,我們通過反向傳播將誤差分配給每個權(quán)重碘举,然后相應(yīng)地對每個權(quán)重進(jìn)行調(diào)整。

反向傳播需要計(jì)算輸出相對于權(quán)重的梯度搁廓。

我們使用自動微分來自動計(jì)算梯度引颈,節(jié)省了手工編寫微分計(jì)算的麻煩。

在上圖中境蜕,神經(jīng)元被編譯進(jìn)一個符號圖蝙场,其中每個節(jié)點(diǎn)表示一個獨(dú)立的操作(第二行),并對輸入和輸出使用占位符粱年。然后售滤,在將具體數(shù)字放入占位符中后(在本例中,放入占位符中的數(shù)字是存儲在變量w、x和b中的值)完箩,該計(jì)算圖便進(jìn)行數(shù)值運(yùn)算(第三行)赐俗。輸出結(jié)果相對于權(quán)重的梯度是通過自動微分構(gòu)造的,該自動微分反向遍歷計(jì)算圖并在各個節(jié)點(diǎn)處乘以梯度(第四行)弊知。第五行展示了相應(yīng)的數(shù)學(xué)表達(dá)式秃励。

TensorFlow是深度學(xué)習(xí)框架中主要的競爭對手之一(作者表示我不想暗指了,沒錯就是你吉捶,hiahia)夺鲜,采用類似延遲執(zhí)行的靜態(tài)圖模式。靜態(tài)圖模式是TensorFlow 1.0中的默認(rèn)執(zhí)行模式呐舔。相比之下币励,PyTorch使用了一個按運(yùn)行定義的動態(tài)圖引擎,其中計(jì)算圖是逐節(jié)點(diǎn)構(gòu)建的珊拼,同時代碼是即時執(zhí)行的食呻。

下圖中的上半部分展示了在動態(tài)圖引擎下的計(jì)算操作,這一部分和靜態(tài)圖模式是相同的澎现。計(jì)算操作被分解成獨(dú)立的表達(dá)式仅胞,當(dāng)執(zhí)行到這些表達(dá)式時,它們會即時運(yùn)算剑辫。該程序?qū)@些計(jì)算之間的內(nèi)在聯(lián)系沒有預(yù)先的概念干旧。下圖中的下半部分展示了表達(dá)式的動態(tài)計(jì)算圖的后臺運(yùn)行場景。表達(dá)式仍然被分解為獨(dú)立的操作妹蔽,但是這些操作會即時運(yùn)算求值椎眯,進(jìn)而促使動態(tài)圖逐步建立。自動微分是通過反向遍歷運(yùn)算結(jié)果圖來實(shí)現(xiàn)的胳岂,類似于靜態(tài)計(jì)算圖编整。注意,這并不意味著動態(tài)圖自身就比靜態(tài)圖更有能力乳丰,只是動態(tài)圖通常更容易完成循環(huán)或條件判斷這些操作掌测。

動態(tài)圖在連續(xù)的前向傳遞過程中可能會發(fā)生變化。例如产园,可以根據(jù)前面節(jié)點(diǎn)的輸出情況調(diào)用不同的節(jié)點(diǎn)汞斧,而不需要在圖本身中表示出這些情況,這與靜態(tài)圖模式相比有明顯的優(yōu)勢(有理有據(jù)淆两,加十分)断箫。

目前主要的一些框架都趨向于支持以上兩種操作模式。PyTorch 1.0能夠在靜態(tài)計(jì)算圖中記錄模型的執(zhí)行情況秋冰,或通過預(yù)編譯的腳本語言對其進(jìn)行定義仲义,從而提高了性能并易于將模型部署到工業(yè)生產(chǎn)。TensorFlow也增加了"eager mode",一種新的按運(yùn)行定義的API埃撵,它增加了TensorFlow庫的靈活性赵颅。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市暂刘,隨后出現(xiàn)的幾起案子饺谬,更是在濱河造成了極大的恐慌,老刑警劉巖谣拣,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件募寨,死亡現(xiàn)場離奇詭異,居然都是意外死亡森缠,警方通過查閱死者的電腦和手機(jī)拔鹰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贵涵,“玉大人列肢,你說我怎么就攤上這事”雒” “怎么了瓷马?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長跨晴。 經(jīng)常有香客問我欧聘,道長,這世上最難降的妖魔是什么坟奥? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任树瞭,我火速辦了婚禮,結(jié)果婚禮上爱谁,老公的妹妹穿的比我還像新娘。我一直安慰自己孝偎,他們只是感情好访敌,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著衣盾,像睡著了一般寺旺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上势决,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天阻塑,我揣著相機(jī)與錄音,去河邊找鬼果复。 笑死陈莽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播走搁,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼独柑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了私植?” 一聲冷哼從身側(cè)響起忌栅,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎曲稼,沒想到半個月后索绪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贫悄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年者春,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片清女。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡钱烟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嫡丙,到底是詐尸還是另有隱情拴袭,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布曙博,位于F島的核電站拥刻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏父泳。R本人自食惡果不足惜般哼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惠窄。 院中可真熱鬧蒸眠,春花似錦、人聲如沸杆融。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脾歇。三九已至蒋腮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間藕各,已是汗流浹背池摧。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留激况,地道東北人作彤。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓膘魄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宦棺。 傳聞我的和親對象是個殘疾皇子瓣距,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容