github開源:https://nndl.github.io/
nndl作者:邱錫鵬
筆記作者:Isaac.(原創(chuàng))
我們主要關(guān)注于采用誤差反向傳播來進(jìn)行學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)睡腿。
神經(jīng)網(wǎng)絡(luò)一般可以看作是一個(gè)非線性模型嘿歌,其基本組成單位為具有非線性激活函數(shù)的神經(jīng)元。
神經(jīng)元之間的連接權(quán)重就是需要學(xué)習(xí)的參數(shù)像吻,可以通過梯度下降方法來進(jìn)行學(xué)習(xí)玛追。
目錄結(jié)構(gòu)
4.1 神經(jīng)元
4.1.1 Sigmoid型激活函數(shù)
4.1.2 修正線性單元
4.1.3 Swish函數(shù)
4.1.4 高斯誤差線性單元
4.1.5 Maxout單元
4.2 網(wǎng)絡(luò)結(jié)構(gòu)
4.2.1 前饋網(wǎng)絡(luò)
4.2.2 記憶網(wǎng)絡(luò)
4.2.3 圖網(wǎng)絡(luò)
4.3 前饋神經(jīng)網(wǎng)絡(luò)
4.3.1 通用近似定理
4.3.2 應(yīng)用到機(jī)器學(xué)習(xí)
4.3.3 參數(shù)學(xué)習(xí)
4.4 反向傳播算法
4.5 自動(dòng)梯度計(jì)算
4.5.1 數(shù)值微分
4.5.2 符號微分
4.5.3 自動(dòng)微分
4.6 優(yōu)化問題
4.6.1 非凸優(yōu)化問題
4.6.2 梯度消失問題
4.7 總結(jié)和深入閱讀
4.1 神經(jīng)元
人工神經(jīng)元(Artificial Neuron)披诗,簡稱神經(jīng)元(Neuron),是構(gòu)成神經(jīng)網(wǎng)絡(luò)的基本單元宰缤,其主要是模擬生物神經(jīng)元的結(jié)構(gòu)和特性颂翼,接受一組輸入信號并產(chǎn)出輸出晃洒。
假設(shè)一個(gè)神經(jīng)元接受 d個(gè)輸入朦乏,令向量 來表示這組輸入球及,并用凈輸入(Net Input)z ∈ R表示一個(gè)神經(jīng)元所獲得的輸入信 號 x的加權(quán)和,
其中 是 d維的權(quán)重向量呻疹, 是偏置吃引。
凈輸入 z 在經(jīng)過一個(gè)非線性函數(shù) f(·)后,得到神經(jīng)元的活性值(Activation)a刽锤,
其中非線性函數(shù) f(·)稱為激活函數(shù)(Activation Function)镊尺。
激活函數(shù)在神經(jīng)元中非常重要的。
激活函數(shù)需要具備以下幾點(diǎn)性質(zhì):
- 連續(xù)并可導(dǎo)(允許少數(shù)點(diǎn)上不可導(dǎo))的非線性函數(shù)并思÷可導(dǎo)的激活函數(shù)可以直接利用數(shù)值優(yōu)化的方法來學(xué)習(xí)網(wǎng)絡(luò)參數(shù)。
- 激活函數(shù)及其導(dǎo)函數(shù)要盡可能的簡單宋彼,有利于提高網(wǎng)絡(luò)計(jì)算效率弄砍。
- 激活函數(shù)的導(dǎo)函數(shù)的值域要在一個(gè)合適的區(qū)間內(nèi),不能太大也不能太小宙暇,否則會影響訓(xùn)練的效率和穩(wěn)定性输枯。
4.1.1 Sigmoid型激活函數(shù)
Sigmoid型函數(shù)是指一類S型曲線函數(shù),為兩端飽和函數(shù)占贫。常用的 Sigmoid型函數(shù)有 Logistic函數(shù)和 Tanh函數(shù)。
對于函數(shù) f(x)先口,若 x → -∞時(shí)型奥,其導(dǎo)數(shù) f ′(x) → 0,則稱其為左飽和碉京。若 x → +∞時(shí)厢汹,其導(dǎo)數(shù) f ′(x) → 0,則稱其為右飽和谐宙。當(dāng)同時(shí)滿足左烫葬、右飽和時(shí),就稱為兩端飽和凡蜻。
Logistic函數(shù)定義為
Logistic函數(shù)可以看成是一個(gè)“擠壓”函數(shù)搭综,把一個(gè)實(shí)數(shù)域的輸入“擠壓”到(0, 1)。
Tanh 函數(shù) 定義為
Tanh函數(shù)可以看作是放大并平移的 Logistic函數(shù)划栓,其值域是 (-1, 1)兑巾。
Tanh 函數(shù)的輸出是零中心化的(Zero-Centered),而 Logistic函數(shù)的輸出恒大于 0忠荞。
非零中心化的輸出會使得其后一層的神經(jīng)元的輸入發(fā)生偏置偏移(Bias Shift)蒋歌,并進(jìn)一步使得梯度下降的收斂速度變慢帅掘。
Logistc求導(dǎo)過程:
令
則
分別求導(dǎo)
化簡
Tanh的求導(dǎo)過程:
令
化簡
因?yàn)?br>
代回原式
補(bǔ)充資料:激活函數(shù)(Sigmoid, tanh, Relu)
4.1.1.1 Hard-Logistic 和 Hard-Tanh 函數(shù)
Logistic函數(shù)和 Tanh函數(shù)都是 Sigmoid型函數(shù),具有飽和性堂油,但是計(jì)算開銷較大修档。因?yàn)檫@兩個(gè)函數(shù)都是在中間(0附近)近似線性,兩端飽和府框。因此萍悴,這兩個(gè)函數(shù)可以通過分段函數(shù)來近似。
4.1.2 修正線性單元
修正線性單元(Rectified Linear Unit寓免, ReLU)是目前深層神經(jīng)網(wǎng)絡(luò)中經(jīng)常使用的激活函數(shù)癣诱。ReLU實(shí)際上是一個(gè)斜坡(ramp)函數(shù),定義為
ReLU零點(diǎn)導(dǎo)數(shù)可以人為規(guī)定袜香,比如tensorflow中規(guī)定為0撕予,也可以用其他函數(shù)來近似,比如取0.5蜈首。
優(yōu)點(diǎn):
- 采用 ReLU 的神經(jīng)元只需要進(jìn)行加实抡、乘和比較的操作,計(jì)算上更加高效欢策。
- ReLU函數(shù)被認(rèn)為有生物上的解釋性吆寨,比如單側(cè)抑制、 寬興奮邊界(即興奮程度也可以非常高)踩寇。在生物神經(jīng)網(wǎng)絡(luò)中啄清,同時(shí)處于興奮狀態(tài)的神經(jīng)元非常稀疏。人腦中在同一時(shí)刻大概只有 1 ~ 4%的神經(jīng)元處于活躍狀態(tài)俺孙。 Sigmoid 型激活函數(shù)會導(dǎo)致一個(gè)非稀疏的神經(jīng)網(wǎng)絡(luò)辣卒,而 ReLU卻具有很好的稀疏性,大約 50%的神經(jīng)元會處于激活狀態(tài)睛榄。
- 在優(yōu)化方面荣茫,相比于 Sigmoid型函數(shù)的兩端飽和, ReLU函數(shù)為左飽和函數(shù)场靴,且在 x > 0時(shí)導(dǎo)數(shù)為 1啡莉,在一定程度上緩解了神經(jīng)網(wǎng)絡(luò)的梯度消失問題厂汗,加速梯度下降的收斂速度昭娩。
缺點(diǎn) :
- ReLU函數(shù)的輸出是非零中心化的,給后一層的神經(jīng)網(wǎng)絡(luò)引入偏置偏移暮胧,會影響梯度下降的效率泞边。
- 此外该押, ReLU 神經(jīng)元在訓(xùn)練時(shí)比較容易“死亡”。在訓(xùn)練時(shí)阵谚,如果參數(shù)在一次不恰當(dāng)?shù)母潞蟛侠瘢谝粋€(gè)隱藏層中的某個(gè) ReLU 神經(jīng)元在所有的訓(xùn)練數(shù)據(jù)上都不能被激活烟具,那么這個(gè)神經(jīng)元自身參數(shù)的梯度永遠(yuǎn)都會是0,在以后的訓(xùn)練過程中永遠(yuǎn)不能被激活奠蹬。這種現(xiàn)象稱為死亡 ReLU 問題(Dying ReLU Problem)朝聋,并且也有可能會發(fā)生在其它隱藏層。
4.1.2.1 帶泄露的 ReLU
帶泄露的 ReLU(Leaky ReLU)在輸入 x < 0時(shí)囤躁,保持一個(gè)很小的梯度冀痕。這樣當(dāng)神經(jīng)元非激活時(shí)也能有一個(gè)非零的梯度可以更新參數(shù),避免永遠(yuǎn)不能被激活狸演。
其中 是一個(gè)很小的常數(shù)言蛇,比如 0.01。當(dāng) 時(shí)宵距,帶泄露的 ReLU也可以寫為
相當(dāng)于是一個(gè)比較簡單的 maxout單元腊尚。
4.1.2.2 帶參數(shù)的 ReLU
帶參數(shù)的 ReLU(Parametric ReLU, PReLU)引入一個(gè)可學(xué)習(xí)的參數(shù)满哪,不同神經(jīng)元可以有不同的參數(shù)婿斥。對于第 i 個(gè)神經(jīng)元,其 PReLU 的定義為
如果 哨鸭,那么PReLU就退化為 ReLU民宿。如果 為一個(gè)很小的常數(shù),則 PReLU可以看作帶泄露的 ReLU像鸡。
4.1.2.3 ELU
指數(shù)線性單元(Exponential Linear Unit活鹰, ELU)是一個(gè)近似的零中心化的非線性函數(shù),其定義為
其中 是一個(gè)超參數(shù)坟桅,決定 x ≤ 0時(shí)的飽和曲線华望,并調(diào)整輸出均值在 0附近。
4.1.2.4 Softplus 函數(shù)
Softplus 函數(shù)可以看作是ReLU函數(shù)的平滑版本仅乓,其定義為
Softplus函數(shù)其導(dǎo)數(shù)剛好是 Logistic函數(shù)。Softplus函數(shù)雖然也有具有單側(cè)抑制蓬戚、寬興奮邊界的特性夸楣,卻沒有稀疏激活性。
4.1.3 Swish函數(shù)
Swish 函數(shù)是一種自門控(Self-Gated)激活函數(shù),定義為
其中 為 Logistic函數(shù)幢泼, β 為可學(xué)習(xí)的參數(shù)或一個(gè)固定超參數(shù)紧显。
當(dāng) 可以看作是一種軟性的門控機(jī)制。當(dāng) 接近于 1時(shí)缕棵,門處于“開”狀態(tài)孵班,激活函數(shù)的輸出近似于x本身涉兽;當(dāng) 接近于 0時(shí),門處于“關(guān)”狀態(tài)篙程,激活函數(shù)的輸出近似于 0枷畏。
當(dāng) β = 0時(shí), Swish函數(shù)變成線性函數(shù) x/2虱饿。
當(dāng) β = 1時(shí)拥诡, Swish函數(shù)在 x > 0時(shí)近似線性,在 x < 0時(shí)近似飽和氮发,同時(shí)具有一定的非單調(diào)性渴肉。
當(dāng) β → +∞時(shí), 趨向于離散的 0-1函數(shù)爽冕, Swish函數(shù)近似為ReLU函數(shù)仇祭。
因此,Swish函數(shù)可以看作是線性函數(shù)和 ReLU函數(shù)之間的非線性插值函數(shù)扇售,其程度由參數(shù) β 控制前塔。
4.1.4 高斯誤差線性單元
高斯誤差線性單元(Gaussian Error Linear Unit, GELU)和 Swish 函數(shù)比較類似承冰,也是一種通過門控機(jī)制來調(diào)整其輸出值的激活函數(shù)华弓。
其中 P(X ≤ x)是高斯分布 N(μ, σ2)的累積分布函數(shù),其中 μ, σ 為超參數(shù)困乒,一般設(shè) μ = 0, σ = 1即可寂屏。由于高斯分布的累積分布函數(shù)為 S型函數(shù),因此 GELU可以用 Tanh函數(shù)或 Logistic函數(shù)來近似娜搂,
當(dāng)使用 Logistic函數(shù)來近似時(shí)迁霎,GELU相當(dāng)于一種特殊的 Swish函數(shù)。
4.1.5 Maxout單元
Maxout單元也是一種分段線性函數(shù)百宇。Sigmoid型函數(shù)考廉、 ReLU等激活函數(shù)的輸入是神經(jīng)元的凈輸入 z,是一個(gè)標(biāo)量携御。而 Maxout單元的輸入是上一層神經(jīng)元的全部原始輸出昌粤,是一個(gè)向量 。
每個(gè) Maxout單元有K 個(gè)權(quán)重向量 和偏置啄刹。對于輸入 x涮坐,可以得到 K 個(gè)凈輸入。
其中 為第 k 個(gè)權(quán)重向量誓军。
Maxout單元的非線性函數(shù)定義為
Maxout單元是整體學(xué)習(xí)輸入到輸出之間的非線性映射關(guān)系袱讹。
Maxout激活函數(shù)可以看作任意凸函數(shù)的分段線性近似,并且在有限的點(diǎn)上是不可微的昵时。
4.2 網(wǎng)絡(luò)結(jié)構(gòu)
4.2.1 前饋網(wǎng)絡(luò)
前饋網(wǎng)絡(luò)中各個(gè)神經(jīng)元按接受信息的先后分為不同的組捷雕。每一組可以看作一個(gè)神經(jīng)層椒丧。
每一層中的神經(jīng)元接受前一層神經(jīng)元的輸出,并輸出到下一層神經(jīng)元非区。整個(gè)網(wǎng)絡(luò)中的信息是朝一個(gè)方向傳播瓜挽,沒有反向的信息傳播,可以用一個(gè)有向無環(huán)路圖表示征绸。
前饋網(wǎng)絡(luò)可以看作一個(gè)函數(shù)久橙,通過簡單非線性函數(shù)的多次復(fù)合,實(shí)現(xiàn)輸入空間到輸出空間的復(fù)雜映射管怠。這種網(wǎng)絡(luò)結(jié)構(gòu)簡單淆衷,易于實(shí)現(xiàn)。
4.2.2 記憶網(wǎng)絡(luò)
記憶網(wǎng)絡(luò)渤弛,也稱為反饋網(wǎng)絡(luò)祝拯,網(wǎng)絡(luò)中的神經(jīng)元不但可以接收其它神經(jīng)元的信息,也可以接收自己的歷史信息她肯。和前饋網(wǎng)絡(luò)相比佳头,記憶網(wǎng)絡(luò)中的神經(jīng)元具有記憶功能,在不同的時(shí)刻具有不同的狀態(tài)晴氨。記憶神經(jīng)網(wǎng)絡(luò)中的信息傳播可以是單向或雙向傳遞康嘉,因此可用一個(gè)有向循環(huán)圖或無向圖來表示。記憶網(wǎng)絡(luò)包括循環(huán)神經(jīng)網(wǎng)絡(luò)籽前,Hopfield網(wǎng)絡(luò)亭珍、玻爾茲曼機(jī)等。
記憶網(wǎng)絡(luò)可以看作一個(gè)程序枝哄,具有更強(qiáng)的計(jì)算和記憶能力肄梨。
為了增強(qiáng)記憶網(wǎng)絡(luò)的記憶容量,可以引入外部記憶單元和讀寫機(jī)制挠锥,用來保存一些網(wǎng)絡(luò)的中間狀態(tài)众羡,稱為記憶增強(qiáng)神經(jīng)網(wǎng)絡(luò)(Memory-Augmented NeuralNetwork, MANN) 蓖租,比如神經(jīng)圖靈機(jī)和記憶網(wǎng)絡(luò)等纱控。
4.2.3 圖網(wǎng)絡(luò)
前饋網(wǎng)絡(luò)和記憶網(wǎng)絡(luò)的輸入都可以表示為向量或向量序列。但實(shí)際應(yīng)用中很多數(shù)據(jù)是圖結(jié)構(gòu)的數(shù)據(jù)菜秦,比如知識圖譜、社交網(wǎng)絡(luò)舶掖、分子(Molecular )網(wǎng)絡(luò)等球昨。前饋網(wǎng)絡(luò)和反饋網(wǎng)絡(luò)很難處理圖結(jié)構(gòu)的數(shù)據(jù)。
圖網(wǎng)絡(luò)是定義在圖結(jié)構(gòu)數(shù)據(jù)上的神經(jīng)網(wǎng)絡(luò)眨攘。圖中每個(gè)節(jié)點(diǎn)都由一個(gè)或一組神經(jīng)元構(gòu)成主慰。節(jié)點(diǎn)之間的連接可以是有向的嚣州,也可以是無向的。每個(gè)節(jié)點(diǎn)可以收到來自相鄰節(jié)點(diǎn)或自身的信息共螺。
圖網(wǎng)絡(luò)是前饋網(wǎng)絡(luò)和記憶網(wǎng)絡(luò)的泛化该肴,包含很多不同的實(shí)現(xiàn)方式,比如 圖卷積網(wǎng)絡(luò)(Graph Convolutional Network藐不,GCN)匀哄、圖注意力網(wǎng)絡(luò)(Graph Attention Network, GAT)雏蛮、消息傳遞網(wǎng)絡(luò)(Message Passing Neural Network涎嚼,MPNN)等。
圖神經(jīng)網(wǎng)絡(luò)為何如此強(qiáng)大挑秉?看完這份斯坦福31頁P(yáng)PT就懂了法梯!
4.3 前饋神經(jīng)網(wǎng)絡(luò)
第0層叫輸入層,最后一層叫輸出層犀概,其它中間層叫做隱藏層立哑。整個(gè)網(wǎng)絡(luò)中無反饋,信號從輸入層向輸出層單向傳播姻灶,可用一個(gè)有向無環(huán)圖表示铛绰。
- :表示神經(jīng)網(wǎng)絡(luò)的層數(shù);
- :表示第 l 層神經(jīng)元的個(gè)數(shù)木蹬;
- :表示 l 層神經(jīng)元的激活函數(shù)至耻;
- :表示 l - 1層到第 l 層的權(quán)重矩陣;
- :表示 l - 1層到第 l 層的偏置镊叁;
- :表示 l 層神經(jīng)元的凈輸入(凈活性值)尘颓;
- :表示 l 層神經(jīng)元的輸出(活性值)。
前饋神經(jīng)網(wǎng)絡(luò)通過下面公式進(jìn)行信息傳播晦譬,
4.3.1 通用近似定理
根據(jù)通用近似定理疤苹,對于具有線性輸出層和至少一個(gè)使用“擠壓”性質(zhì)的激活函數(shù)的隱藏層組成的前饋神經(jīng)網(wǎng)絡(luò),只要其隱藏層神經(jīng)元的數(shù)量足夠敛腌,它可以以任意的精度來近似任何從一個(gè)定義在實(shí)數(shù)空間 Rd 中的有界閉集函數(shù)卧土。
通用近似定理只是說明了神經(jīng)網(wǎng)絡(luò)的計(jì)算能力可以去近似一個(gè)給定的連續(xù)函數(shù),但并沒有給出如何找到這樣一個(gè)網(wǎng)絡(luò)像樊,以及是否是最優(yōu)的尤莺。
4.3.2 應(yīng)用到機(jī)器學(xué)習(xí)
根據(jù)通用近似定理,神經(jīng)網(wǎng)絡(luò)在某種程度上可以作為一個(gè)“萬能”函數(shù)來使用生棍,可以用來進(jìn)行復(fù)雜的特征轉(zhuǎn)換颤霎,或逼近一個(gè)復(fù)雜的條件分布。
在機(jī)器學(xué)習(xí)中,輸入樣本的特征對分類器的影響很大友酱。以監(jiān)督學(xué)習(xí)為例晴音,好的特征可以極大提高分類器的性能。因此缔杉,要取得好的分類效果锤躁,需要樣本的原始特征向量 x轉(zhuǎn)換到更有效的特征向量 φ(x),這個(gè)過程叫做特征抽取或详。
4.3.3 參數(shù)學(xué)習(xí)
梯度下降法需要計(jì)算損失函數(shù)對參數(shù)的偏導(dǎo)數(shù)系羞,如果通過鏈?zhǔn)椒▌t逐一對每個(gè)參數(shù)進(jìn)行求偏導(dǎo)比較低效。在神經(jīng)網(wǎng)絡(luò)的訓(xùn)練中經(jīng)常使用反向傳播算法來高效地計(jì)算梯度鸭叙。
4.4 反向傳播算法
假設(shè)采用隨機(jī)梯度下降進(jìn)行神經(jīng)網(wǎng)絡(luò)參數(shù)學(xué)習(xí)觉啊,給定一個(gè)樣本 (x, y),將其輸入到神經(jīng)網(wǎng)絡(luò)模型中沈贝,得到網(wǎng)絡(luò)輸出為 杠人。假設(shè)損失函數(shù)為 ,要進(jìn)行參數(shù)學(xué)習(xí)就需要計(jì)算損失函數(shù)關(guān)于每個(gè)參數(shù)的導(dǎo)數(shù)宋下。
4.5 自動(dòng)梯度計(jì)算
實(shí)際上嗡善,參數(shù)的梯度可以讓計(jì)算機(jī)來自動(dòng)計(jì)算。目前学歧,幾乎所有的主流深度學(xué)習(xí)框架都包含了自動(dòng)梯度計(jì)算的功能罩引,即我們可以只考慮網(wǎng)絡(luò)結(jié)構(gòu)并用代碼實(shí)現(xiàn),其梯度可以自動(dòng)進(jìn)行計(jì)算枝笨,無需人工干預(yù)袁铐,這樣可以大幅提高開發(fā)效率。
4.5.1 數(shù)值微分
數(shù)值微分(Numerical Differentiation)是用數(shù)值方法來計(jì)算函數(shù) f(x) 的導(dǎo)數(shù)横浑。函數(shù) f(x)的點(diǎn) x的導(dǎo)數(shù)定義為
通過上述定義來直接計(jì)算函數(shù) f(x) 的梯度剔桨。數(shù)值微分方法非常容易實(shí)現(xiàn),但找到一個(gè)合適的擾動(dòng) ?x卻十分困難徙融。如果 ?x過小洒缀,會引起數(shù)值計(jì)算問題,比如舍入誤差欺冀;如果 ?x過大树绩,會增加截?cái)嗾`差,使得導(dǎo)數(shù)計(jì)算不準(zhǔn)確隐轩。因此饺饭,數(shù)值微分的實(shí)用性比較差。
在實(shí)際應(yīng)用职车,經(jīng)常使用下面公式來計(jì)算梯度砰奕,可以減少截?cái)嗾`差蛛芥。
數(shù)值微分的另外一個(gè)問題是計(jì)算復(fù)雜度。假設(shè)參數(shù)數(shù)量為 n军援,則每個(gè)參數(shù)都需要單獨(dú)施加擾動(dòng),并計(jì)算梯度称勋。假設(shè)每次正向傳播的計(jì)算復(fù)雜度為 O(n)胸哥,則計(jì)算數(shù)值微分的總體時(shí)間復(fù)雜度為 O(n2)。
4.5.2 符號微分
符號微分(Symbolic Differentiation)是一種基于符號計(jì)算的自動(dòng)求導(dǎo)方法赡鲜。符號計(jì)算空厌,也叫代數(shù)計(jì)算,是指用計(jì)算機(jī)來處理帶有變量的數(shù)學(xué)表達(dá)式银酬。
這里的變量看作是符號(Symbols)嘲更,一般不需要代入具體的值。符號計(jì)算的輸入和輸出都是數(shù)學(xué)表達(dá)式揩瞪,一般包括對數(shù)學(xué)表達(dá)式的化簡赋朦、因式分解、微分李破、積分宠哄、解代數(shù)方程、求解常微分方程等運(yùn)算嗤攻。
符號計(jì)算一般來講是對輸入的表達(dá)式毛嫉,通過迭代或遞歸使用一些事先定義的規(guī)則進(jìn)行轉(zhuǎn)換。當(dāng)轉(zhuǎn)換結(jié)果不能再繼續(xù)使用變換規(guī)則時(shí)妇菱,便停止計(jì)算承粤。
符號微分可以在編譯時(shí)就計(jì)算梯度的數(shù)學(xué)表示,并進(jìn)一步利用符號計(jì)算方法進(jìn)行優(yōu)化闯团。此外辛臊,符號計(jì)算的一個(gè)優(yōu)點(diǎn)是符號計(jì)算和平臺無關(guān),可以在 CPU或GPU上運(yùn)行偷俭。
符號微分也有一些不足之處浪讳。一是編譯時(shí)間較長,特別是對于循環(huán)涌萤,需要很長時(shí)間進(jìn)行編譯淹遵;二是為了進(jìn)行符號微分,一般需要設(shè)計(jì)一種專門的語言來表示數(shù)學(xué)表達(dá)式负溪,并且要對變量(符號)進(jìn)行預(yù)先聲明透揣;三是很難對程序進(jìn)行調(diào)試。
4.5.3 自動(dòng)微分
自動(dòng)微分(Automatic Differentiation川抡, AD)是一種可以對一個(gè)(程序)函數(shù)進(jìn)行計(jì)算導(dǎo)數(shù)的方法辐真。符號微分的處理對象是數(shù)學(xué)表達(dá)式须尚,而自動(dòng)微分的處理對象是一個(gè)函數(shù)或一段程序。
自動(dòng)微分的基本原理是所有的數(shù)值計(jì)算可以分解為一些基本操作侍咱,包含+, -, ×, /和一些初等函數(shù) exp, log, sin, cos等耐床,然后利用鏈?zhǔn)椒▌t來自動(dòng)計(jì)算一個(gè)復(fù)合函數(shù)的梯度。
為了簡單起見楔脯,這里以一個(gè)神經(jīng)網(wǎng)絡(luò)中常見的復(fù)合函數(shù)的例子來說明自動(dòng)微分的過程撩轰。令復(fù)合函數(shù)為
首先,我們將復(fù)合函數(shù)分解為一系列的基本操作昧廷,并構(gòu)成一個(gè)計(jì)算圖(Computational Graph)堪嫂。
計(jì)算圖是數(shù)學(xué)運(yùn)算的圖形化表示。計(jì)算圖中的每個(gè)非葉子節(jié)點(diǎn)表示一個(gè)基本操作木柬,每個(gè)葉子節(jié)點(diǎn)為一個(gè)輸入變量或常量皆串。下面給出了當(dāng) 時(shí)復(fù)合函數(shù)f(x; w, b)的計(jì)算圖,其中連邊上的紅色數(shù)字表示前向計(jì)算時(shí)復(fù)合函數(shù)中每個(gè)變量的實(shí)際取值眉枕。
從計(jì)算圖上可以看出恶复,復(fù)合函數(shù)由 6 個(gè)基本函數(shù) 組成。每個(gè)基本函數(shù)的導(dǎo)數(shù)都十分簡單齐遵,可以通過規(guī)則來實(shí)現(xiàn)寂玲。
整個(gè)復(fù)合函數(shù) 關(guān)于參數(shù) w? 和 ?b 的導(dǎo)數(shù)可以通過計(jì)算圖上的節(jié)點(diǎn)與參數(shù) w 和 b之間路徑上所有的導(dǎo)數(shù)連乘來得到,即
如果函數(shù)和參數(shù)之間有多條路徑梗摇,可以將這多條路徑上的導(dǎo)數(shù)再進(jìn)行相加拓哟,得到最終的梯度。
按照計(jì)算導(dǎo)數(shù)的順序伶授,自動(dòng)微分可以分為兩種模式:前向模式和反向模式断序。
前向模式 前向模式是按計(jì)算圖中計(jì)算方向的相同方向來遞歸地計(jì)算梯度。 當(dāng) 時(shí)糜烹,前向模式的累積計(jì)算順序如下:
反向模式 反向模式是按計(jì)算圖中計(jì)算方向的相反方向來遞歸地計(jì)算梯度违诗。 當(dāng) 時(shí),反向模式的累積計(jì)算順序如下:
前向模式和反向模式可以看作是應(yīng)用鏈?zhǔn)椒▌t的兩種梯度累積方式疮蹦。從反向模式的計(jì)算順序可以看出诸迟,反向模式和反向傳播的計(jì)算梯度的方式相同。
符號微分和自動(dòng)微分
符號微分和自動(dòng)微分都利用計(jì)算圖和鏈?zhǔn)椒▌t來自動(dòng)求解導(dǎo)數(shù)愕乎。
符號微分在編譯階段先構(gòu)造一個(gè)復(fù)合函數(shù)的計(jì)算圖阵苇,通過符號計(jì)算得到導(dǎo)數(shù)的表達(dá)式,還可以對導(dǎo)數(shù)表達(dá)式進(jìn)行優(yōu)化感论,在程序運(yùn)行階段才代入變量的具體數(shù)值進(jìn)行計(jì)算導(dǎo)數(shù)绅项。
自動(dòng)微分則無需事先編譯,在程序運(yùn)行階段邊計(jì)算邊記錄計(jì)算圖比肄,計(jì)算圖上的局部梯度都直接代入數(shù)值進(jìn)行計(jì)算快耿,然后用前向或反向模式來計(jì)算最終的梯度囊陡。
靜態(tài)計(jì)算圖和動(dòng)態(tài)計(jì)算圖
靜態(tài)計(jì)算圖是在編譯時(shí)構(gòu)建計(jì)算圖,計(jì)算圖構(gòu)建好之后在程序運(yùn)行時(shí)不能改變掀亥。
動(dòng)態(tài)計(jì)算圖是在程序運(yùn)行時(shí)動(dòng)態(tài)構(gòu)建撞反。
兩種構(gòu)建方式各有優(yōu)缺點(diǎn)。
靜態(tài)計(jì)算圖在構(gòu)建時(shí)可以進(jìn)行優(yōu)化铺浇,并行能力強(qiáng)痢畜,但靈活性比較差。
動(dòng)態(tài)計(jì)算圖則不容易優(yōu)化鳍侣,當(dāng)不同輸入的網(wǎng)絡(luò)結(jié)構(gòu)不一致時(shí),難以并行計(jì)算吼拥,但是靈活性比較高倚聚。
在目前深度學(xué)習(xí)框架里, Theano 和 Tensorflow 采用的是靜態(tài)計(jì)算圖凿可,而DyNet惑折,Chainer和 PyTorch采用的是動(dòng)態(tài)計(jì)算圖。
4.6 優(yōu)化問題
4.6.1 非凸優(yōu)化問題
神經(jīng)網(wǎng)絡(luò)的優(yōu)化問題是一個(gè)非凸優(yōu)化問題枯跑。
4.6.2 梯度消失問題
由于 Sigmoid 型函數(shù)的飽和性惨驶,飽和區(qū)的導(dǎo)數(shù)更是接近于 0。這樣敛助,誤差經(jīng)過每一層傳遞都會不斷衰減粗卜。當(dāng)網(wǎng)絡(luò)層數(shù)很深時(shí),梯度就會不停的衰減纳击,甚至消失续扔,使得整個(gè)網(wǎng)絡(luò)很難訓(xùn)練。這就是所謂的梯度消失問題(Vanishing Gradient Problem)焕数,也稱為梯度彌散問題纱昧。
在深層神經(jīng)網(wǎng)絡(luò)中,減輕梯度消失問題的方法有很多種堡赔。一種簡單有效的方式是使用導(dǎo)數(shù)比較大的激活函數(shù)识脆,比如 ReLU等。