谈谈自动微分(Automatic Differentiation)
?作者 | JermyLu
學(xué)校 | 中國科學(xué)院大學(xué)
研究方向 | 自然語言處理與芯片驗(yàn)證
引言
眾所周知,Tensorflow、Pytorch 這樣的深度學(xué)習(xí)框架能夠火起來,與其包含自動(dòng)微分機(jī)制有著密不可分的聯(lián)系,畢竟早期 Pytorch≈Numpy+AutoGrad,而 AutoGrad 的基礎(chǔ)就是自動(dòng)微分機(jī)制。
常見的梯度求解方法包括:數(shù)值微分(Numerical Differentiation)、符號(hào)微分(Symbolic Differentiation)和自動(dòng)微分(Automatic Differentiation)。
數(shù)值微分
在數(shù)學(xué)中,求解梯度?=?求解函數(shù)偏導(dǎo)數(shù),而導(dǎo)數(shù)是用極限來定義的,如下所示:
其中, 表示參數(shù) 的一個(gè)很小的變化量,上式是導(dǎo)數(shù)的雙邊定義形式。如果函數(shù) 是初等函數(shù),則可使用求導(dǎo)法則得到其導(dǎo)數(shù)。如果不能得到函數(shù)導(dǎo)數(shù)的解析式,則必須使用數(shù)值微分方法求解該函數(shù)在某個(gè)點(diǎn)的導(dǎo)數(shù)。
數(shù)值微分方法簡單,但計(jì)算量巨大,而且會(huì)造成截?cái)嗾`差(Truncation Error)和舍入誤差(Round-off Error)。
當(dāng)用數(shù)值微分方法求解梯度時(shí),需要用極限即無窮過程求解。然而,無窮過程在計(jì)算機(jī)中是不存在的,計(jì)算機(jī)需要將無窮過程求解截?cái)酁橛邢捱^程求解。例如,導(dǎo)數(shù)定義中 是一個(gè)無窮過程,在實(shí)際計(jì)算中 (不能等于 0,等于 0 就不存在變化量了),而可能令 ,這就帶來了截?cái)嗾`差。
舍入誤差是指運(yùn)算得到的精確值無法被計(jì)算機(jī)存儲(chǔ),只能以近似值代替產(chǎn)生的差異。例如,當(dāng)實(shí)數(shù) 超過了雙精度浮點(diǎn)數(shù)可以表示的范圍之后,計(jì)算機(jī)無法精確表示 ,而只能以其近似值 代替,就產(chǎn)生了舍入誤差。因此,數(shù)值微分方法不適用于神經(jīng)網(wǎng)絡(luò)梯度反向傳播。
符號(hào)微分
符號(hào)微分是通過建立符號(hào)表達(dá)式求解微分的方式,即借助符號(hào)表達(dá)式和求導(dǎo)公式,推導(dǎo)出目標(biāo)函數(shù)關(guān)于自變量的微分表達(dá)式,最后代入數(shù)值即可得到微分結(jié)果。例如,對(duì)于表達(dá)式 ,其微分表達(dá)式 ,然后將具體數(shù)值 和 代入,即可得到 。
使用符號(hào)微分方法時(shí),必須將目標(biāo)函數(shù)轉(zhuǎn)為一個(gè)完整的數(shù)學(xué)表達(dá)式,這個(gè)過程中會(huì)出現(xiàn)表達(dá)式膨脹(Expression Swell)的問題,大大增加系統(tǒng)存儲(chǔ)和處理表達(dá)式的負(fù)擔(dān)。
例如 ,則
在深層神經(jīng)網(wǎng)絡(luò)模型中,神經(jīng)元數(shù)量和參數(shù)量極大,完整的損失函數(shù)的表達(dá)式會(huì)非常冗長(比示例復(fù)雜的多得多,長的多得多),不易存儲(chǔ)和管理;再者,完整寫出損失函數(shù)的微分表達(dá)式也是一項(xiàng)龐大的工作量;最重要的一點(diǎn),在神經(jīng)網(wǎng)絡(luò)的梯度反向傳播過程中,只需要微分的(中間)結(jié)果值,而不是微分表達(dá)式。因此,符號(hào)微分方法也不適用于神經(jīng)網(wǎng)絡(luò)梯度反向傳播。
自動(dòng)微分
自動(dòng)微分是一種“原子化”的符號(hào)微分,其將一個(gè)復(fù)雜的數(shù)學(xué)運(yùn)算過程分解為一系列簡單的基本算子,如對(duì)數(shù)函數(shù)、三角函數(shù)等,然后對(duì)這些基本算子進(jìn)行符號(hào)微分得到中間結(jié)果,再應(yīng)用于整個(gè)函數(shù)。
首先,我們了解一下鏈?zhǔn)椒▌t。
單變量函數(shù)鏈?zhǔn)椒▌t:
若 是 的函數(shù), 是 的函數(shù), 是 的函數(shù),則 。
多變量函數(shù)鏈?zhǔn)椒▌t:
若 是 的函數(shù), 都是 的函數(shù),則 , 類似。
接下來,我們以三層全連接層神經(jīng)網(wǎng)絡(luò)為例,解釋自動(dòng)微分機(jī)制。
定義:輸入層輸出為 ;隱層輸出為 ;輸出層輸出為 ;標(biāo)簽為 ,損失函數(shù)使用 范式,即 ;隱層激活函數(shù)為 記為 ,輸出層激活函數(shù)為 記為 。
因此:令 ,則 ;令 ,則 ,為了方便起見,不考慮偏置項(xiàng)。
這個(gè)三層神經(jīng)網(wǎng)絡(luò)中,參數(shù)只包含 和 ,而梯度反傳參數(shù)更新,更新的就是 和 。因此,梯度計(jì)算的目標(biāo)是 與 。
反向傳播是由輸出層開始計(jì)算梯度,之后逆向傳播到每一層網(wǎng)絡(luò),直至到達(dá)輸入層。
輸出層發(fā)生的計(jì)算為 ,即輸出層的輸入 先經(jīng)過線性變換右乘 轉(zhuǎn)換為中間狀態(tài) ,之后 經(jīng)過 激活函數(shù)變?yōu)?。最后, 和 計(jì)算得到損失函數(shù)值 。
該部分網(wǎng)絡(luò)的前向計(jì)算中,上述過程的計(jì)算次序?yàn)?,而反向計(jì)算中節(jié)點(diǎn)訪問次序與之相反。
1. 計(jì)算 ,即計(jì)算損失函數(shù) 關(guān)于網(wǎng)絡(luò)輸出結(jié)果 的梯度,并將梯度向前傳遞。
2. 計(jì)算 記為 , 即 函數(shù)相對(duì)于其輸入 的梯度,并將梯度向前傳遞。
3. 得到 之后,下一步的目標(biāo)是計(jì)算 與 。
? ;
? ;
梯度 需要繼續(xù)向前一層傳遞,用于計(jì)算其他變量的梯度;梯度 會(huì)作為參數(shù) 的梯度計(jì)算結(jié)果,用于模型參數(shù)的更新。
接下來,我們來分析隱藏層發(fā)生的計(jì)算 ,其中 分別表示隱藏層的輸出、中間結(jié)果、輸入和參數(shù)。該部分網(wǎng)絡(luò)的前向計(jì)算中,上述過程的計(jì)算次序?yàn)?,而反向計(jì)算中節(jié)點(diǎn)訪問次序與之相反。
1. 計(jì)算 , 已知,而 即 激活函數(shù)相對(duì)于其輸入 的梯度,有 ,即可獲得該梯度記為 ,并向前傳遞。
2. 得到 之后,下一步計(jì)算 與 :
;
?? ;
?梯度 需要繼續(xù)向前一層傳遞,用于計(jì)算其他變量的梯度;梯度 會(huì)作為參數(shù) 的梯度計(jì)算結(jié)果,用于模型參數(shù)的更新。
綜合輸出層和隱藏層的反向傳播方法,再根據(jù)神經(jīng)網(wǎng)絡(luò)有向計(jì)算圖的拓?fù)浣Y(jié)構(gòu),逆向訪問每一個(gè)節(jié)點(diǎn)執(zhí)行上述梯度計(jì)算過程即可得到神經(jīng)網(wǎng)絡(luò)中任意位置和任意參數(shù)的梯度信息。
總結(jié)
鏈?zhǔn)椒▌t+反向傳播+有向圖拓?fù)浣Y(jié)構(gòu),構(gòu)成了自動(dòng)微分機(jī)制的基礎(chǔ)。
更多閱讀
#投 稿?通 道#
?讓你的文字被更多人看到?
如何才能讓更多的優(yōu)質(zhì)內(nèi)容以更短路徑到達(dá)讀者群體,縮短讀者尋找優(yōu)質(zhì)內(nèi)容的成本呢?答案就是:你不認(rèn)識(shí)的人。
總有一些你不認(rèn)識(shí)的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學(xué)者和學(xué)術(shù)靈感相互碰撞,迸發(fā)出更多的可能性。?
PaperWeekly 鼓勵(lì)高校實(shí)驗(yàn)室或個(gè)人,在我們的平臺(tái)上分享各類優(yōu)質(zhì)內(nèi)容,可以是最新論文解讀,也可以是學(xué)術(shù)熱點(diǎn)剖析、科研心得或競(jìng)賽經(jīng)驗(yàn)講解等。我們的目的只有一個(gè),讓知識(shí)真正流動(dòng)起來。
📝?稿件基本要求:
? 文章確系個(gè)人原創(chuàng)作品,未曾在公開渠道發(fā)表,如為其他平臺(tái)已發(fā)表或待發(fā)表的文章,請(qǐng)明確標(biāo)注?
? 稿件建議以?markdown?格式撰寫,文中配圖以附件形式發(fā)送,要求圖片清晰,無版權(quán)問題
? PaperWeekly 尊重原作者署名權(quán),并將為每篇被采納的原創(chuàng)首發(fā)稿件,提供業(yè)內(nèi)具有競(jìng)爭(zhēng)力稿酬,具體依據(jù)文章閱讀量和文章質(zhì)量階梯制結(jié)算
📬?投稿通道:
? 投稿郵箱:hr@paperweekly.site?
? 來稿請(qǐng)備注即時(shí)聯(lián)系方式(微信),以便我們?cè)诟寮x用的第一時(shí)間聯(lián)系作者
? 您也可以直接添加小編微信(pwbot02)快速投稿,備注:姓名-投稿
△長按添加PaperWeekly小編
🔍
現(xiàn)在,在「知乎」也能找到我們了
進(jìn)入知乎首頁搜索「PaperWeekly」
點(diǎn)擊「關(guān)注」訂閱我們的專欄吧
·
總結(jié)
以上是生活随笔為你收集整理的谈谈自动微分(Automatic Differentiation)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 余跟杨怎么取名字好听?
- 下一篇: NeurIPS 2021 | 港中文周博