《神經(jīng)網(wǎng)絡(luò)與機器學習》筆記(二)

第二部分 基礎(chǔ)模型

第四章 前饋神經(jīng)網(wǎng)絡(luò)

典型的神經(jīng)元結(jié)構(gòu)

激活函數(shù)

  1. 連續(xù)可導(允許少數(shù)點上不可導)的非線性函數(shù)。

  2. 激活函數(shù)和其導函數(shù)簡單。

  3. 導函數(shù)的值域在一個合適的區(qū)間

Sigmoid 型函數(shù)

Sigmoid 型函數(shù)是指一類S型曲線函數(shù),為兩端飽和函數(shù)(即f^{\prime}(\infty)\rightarrow 0)。常用的Sigmoid 型函數(shù)有Logistic 函數(shù)和Tanh 函數(shù)。

Logistic 函數(shù)和Tanh 函數(shù)

Logistic 函數(shù)(連續(xù)可導,值域為(0,1)):\\ \sigma(x)=\frac{1}{1+\exp (-x)}\\ 其輸出直接可以看作是概率分布,使得神經(jīng)網(wǎng)絡(luò)可以更好地和統(tǒng)計學習模型進行結(jié)合。\\ 其可以看作是一個軟性門(Soft Gate),用來控制其它神經(jīng)元輸出信息的數(shù)量

Tanh 函數(shù)(連續(xù)可導,值域為(-1,1)):\\ \tanh (x)=2 \sigma(2 x)-1=\frac{\exp (x)-\exp (-x)}{\exp (x)+\exp (-x)}\\ Tanh 函數(shù)的輸出是零中心化的(Zero-Centered),而Logistic函數(shù)的輸出恒大于0。\\ 非零中心化的輸出會使得其后一層的神經(jīng)元的輸入發(fā)生偏置偏移(Bias Shift),\\ 并進一步使得梯度下降的收斂速度變慢。

Hard-Logistic 函數(shù)和Hard-Tanh 函數(shù)


Hard Sigmoid 型激活函數(shù)

Logistic 函數(shù)和Tanh 函數(shù)都是Sigmoid 型函數(shù),具有飽和性,但是計算開銷較大。因為這兩個函數(shù)都是在中間(0 附近)近似線性,兩端飽和。因此,這兩個函數(shù)可以通過分段函數(shù)來近似。

以Logistic 函數(shù)σ(x) 為例,其導數(shù)為σ′(x) = σ(x)(1 ? σ(x))。Logistic 函數(shù)在0 附近的一階泰勒展開為:g_{l}(x) \approx \sigma(0)+x \times \sigma^{\prime}(0)=0.25x+0.5

這樣Logistic 函數(shù)可以用分段函數(shù)hard-logistic(x) 來近似。
\begin{aligned} \operatorname{hard-logistic}(x) &=\left\{\begin{array}{ll}{1} & {g_{l}(x) \geq 1} \\ {g_{l}} & {0<g_{l}(x)<1} \\ {0} & {g_{l}(x) \leq 0}\end{array}\right.\\ &=\max \left(\min \left(g_{l}(x), 1\right), 0\right) =\max (\min (0.25 x+0.5,1), 0) \end{aligned}
同樣,Tanh 函數(shù)在0 附近的一階泰勒展開為g_{t}(x) \approx \tanh (0)+x \times \tanh ^{\prime}(0)=x

這樣Tanh 函數(shù)也可以用分段函數(shù)hard-tanh(x) 來近似。
\begin{aligned} \operatorname{hard}-\tanh (x) &=\max \left(\min \left(g_{t}(x), 1\right),-1\right) \\ &=\max (\min (x, 1),-1) \end{aligned}

ReLU函數(shù)
ReLU、Leaky ReLU、ELU以及Softplus 函數(shù)

ReLU(Rectified Linear Unit,修正線性單元),也叫Rectifier函數(shù),是目前深度神經(jīng)網(wǎng)絡(luò)中經(jīng)常使用的激活函數(shù)。ReLU實際上是一個斜坡(ramp)函數(shù),定義為:
\begin{aligned} \operatorname{ReLU}(x) &=\left\{\begin{array}{ll}{x} & {x \geq 0} \\ {0} & {x<0}\end{array}\right.\\ &=\max (0, x) \end{aligned}

優(yōu)點

  1. 計算上更加高效(只要進行加、乘和比較的操作)。
  2. ReLU 函數(shù)被認為有生物上的解釋性,比如單側(cè)抑制、寬興奮邊界(即興奮程度也可以非常高)。在生物神經(jīng)網(wǎng)絡(luò)中,同時處于興奮狀態(tài)的神經(jīng)元非常稀疏。人腦中在同一時刻大概只有1% ~ 4% 的神經(jīng)元處于活躍狀態(tài)。Sigmoid 型激活函數(shù)會導致一個非稀疏的神經(jīng)網(wǎng)絡(luò),而ReLU卻具有很好的稀疏性,大約50% 的神經(jīng)元會處于激活狀態(tài)。
  3. 在優(yōu)化方面,相比于Sigmoid 型函數(shù)的兩端飽和,ReLU函數(shù)為左飽和函數(shù),且在x > 0 時導數(shù)為1,在一定程度上緩解了神經(jīng)網(wǎng)絡(luò)的梯度消失問題,加速梯 度下降的收斂速度。

缺點

  1. ReLU函數(shù)的輸出是非零中心化的,給后一層的神經(jīng)網(wǎng)絡(luò)引入偏置偏移,會影響梯度下降的效率。
  2. ReLU 神經(jīng)元在訓練時比較容易“死亡”。

為解決上述問題。ReLU有幾個變體:

  • 帶泄露的ReLU

    在輸入x < 0 時,保持一個很小的梯度λ。這樣當神經(jīng)元非激活時也能有一個非零的梯度可以更新參數(shù),避免永遠不能被激活
    \begin{aligned} \text { LeakyReLU }(x) &=\left\{\begin{array}{ll}{x} & {\text { if } x>0} \\ {\gamma x} & {\text { if } x \leq 0}\end{array}\right.\\ &=\max (0, x)+\gamma \min (0, x) \end{aligned}\\ 其中\(zhòng)gamma 是一個很小的常數(shù),比如0.01。當\gamma < 1 時,帶泄露的ReLU也可以寫為\\ \text { LeakyReLU(x) }=\max (x, \gamma x),相當于是一個比較簡單的maxout 單元

  • 帶參數(shù)的ReLU

    引入一個可學習的參數(shù),不同神經(jīng)元可以有不同的參數(shù)。對于第i 個神經(jīng)元,其PReLU 的
    定義為:
    \begin{aligned} \operatorname{PReLU}_{i}(x) &=\left\{\begin{array}{ll}{x} & {\text { if } x>0} \\ {\gamma_{i} x} & {\text { if } x \leq 0}\end{array}\right.\\ &=\max (0, x)+\gamma_{i} \min (0, x) \end{aligned}\\ 其中\(zhòng)gamma_{i} 為x ≤ 0 時函數(shù)的斜率。因此,PReLU 是非飽和函數(shù)。如果\gamma_{i} = 0,那么 PReLU就退化為ReLU。\\ 如果\gamma_{i} 為一個很小的常數(shù),則PReLU可以看作帶泄露的ReLU。\\ PReLU可以允許不同神經(jīng)元具有不同的參數(shù),也可以一組神經(jīng)元共享一個參數(shù)。

  • ELU 函數(shù)

    ELU(Exponential Linear Unit,指數(shù)線性單元) 是一個近似的零中心化的非線性函數(shù),其定義為
    \begin{aligned} \operatorname{ELU}(x) &=\left\{\begin{array}{ll}{x} & {\text { if } x>0} \\ {\gamma(\exp (x)-1)} & {\text { if } x \leq 0}\end{array}\right.\\ &=\max (0, x)+\min (0, \gamma(\exp (x)-1)) \end{aligned}\\ 其中\(zhòng)gamma ≥ 0 是一個超參數(shù),決定x ≤ 0 時的飽和曲線,并調(diào)整輸出均值在0 附近。

  • Softplus 函數(shù)

    Softplus 函數(shù) 可以看作是Rectifier 函數(shù)的平滑版本,其定義為
    \text { Softplus }(x)=\log (1+\exp (x))\\ Softplus 函數(shù)其導數(shù)剛好是Logistic 函數(shù)。\\ Softplus 函數(shù)雖然也具有單側(cè)抑制、寬興奮邊界的特性,卻沒有稀疏激活性。

Swish 函數(shù)

是一種自門控(Self-Gated)激活函數(shù),定義為:\operatorname{swish}(x)=x \sigma(\beta x)

其中σ(·) 為Logistic 函數(shù),β 為可學習的參數(shù)或一個固定超參數(shù)。σ(·) ∈ (0, 1) 可以看作是一種軟性的門控機制。當σ(βx) 接近于1 時,門處于“開”狀態(tài),激活函數(shù)的輸出近似于x本身;當σ(βx) 接近于0 時,門的狀態(tài)為“關(guān)”,激活函數(shù)的輸出近似于0。

Swish 函數(shù)

當β = 0 時,Swish 函數(shù)變成線性函數(shù)x/2。當β = 1 時,Swish 函數(shù)在x > 0 時近似線性,在x < 0 時近似飽和,同時具有一定的非單調(diào)性。當β → +∞時,σ(βx) 趨向于離散的0-1 函數(shù),Swish 函數(shù)近似為ReLU函數(shù)。因此,Swish 函數(shù)可以看作是線性函數(shù)和ReLU函數(shù)之間的非線性插值函數(shù),其程度由參數(shù)β 控制。

高斯誤差線性單元(GELU)

和Swish 函數(shù)比較類似,也是一種通過門控機制來調(diào)整其輸出值的激活函數(shù):\operatorname{GELU}(x)=x P(X \leq x)

其中P(X ≤ x) 是高斯分布\mathcal{N}\left(\mu, \sigma^{2}\right) 的累積分布函數(shù),其中μ, σ 為超參數(shù),一般設(shè)μ = 0, σ = 1 即可。由于高斯分布的累積分布函數(shù)為S 型函數(shù),因此GELU可以用Tanh 函數(shù)或Logistic 函數(shù)來近似:
\begin{array}{l}{\operatorname{GELU}(x) \approx 0.5 x\left(1+\tanh \left(\sqrt{\frac{2}{\pi}}\left(x+0.044715 x^{3}\right)\right)\right)} \\ {\operatorname{GELU}(x) \approx x \sigma(1.702 x)}\end{array}\\ 當使用Logistic 函數(shù)來近似時,GELU相當于一種特殊的Swish 函數(shù)。

Maxout 單元

也是一種分段線性函數(shù)。Sigmoid 型函數(shù)、ReLU 等激活函數(shù)的輸入是神經(jīng)元的凈輸入z,是一個標量。而Maxout 單元的輸入是上一層神經(jīng)元的全部原始輸出,是一個向量x=[x_1;x_2;\cdots;x_d]。

每個Maxout單元有K個權(quán)重向量w_k\in\mathbb{R}^d和偏置bk (1 ≤ k ≤ K)。對于輸入x,可以得到K 個凈輸入zk, 1 ≤ k ≤ K:z_k=w^T_kx+b_k,其中wk = [w_{k,1}, · · · ,w_{k,d}]^T 為第k 個權(quán)重向量。

Maxout 單元的非線性函數(shù)定義為:\operatorname{maxout}(\boldsymbol{x})=\max _{k \in[1, K]}\left(z_{k}\right)

Maxout 單元不單是凈輸入到輸出之間的非線性映射,而是整體學習輸入到輸出之間的非線性映射關(guān)系。Maxout 激活函數(shù)可以看作任意凸函數(shù)的分段線性近似,并且在有限的點上是不可微的。

神經(jīng)網(wǎng)絡(luò)

三種神經(jīng)網(wǎng)絡(luò)

目前常用的神經(jīng)網(wǎng)絡(luò)有三種

  • 前饋網(wǎng)絡(luò)

    可以看作一個函數(shù),通過簡單非線性函數(shù)的多次復合,實現(xiàn)輸入空間到輸出空間的復雜映射。這種網(wǎng)絡(luò)結(jié)構(gòu)簡單,易于實現(xiàn)。

  • 記憶網(wǎng)絡(luò)

    也稱為反饋網(wǎng)絡(luò),網(wǎng)絡(luò)中的神經(jīng)元不但可以接收其它神經(jīng)元的信息,也可以接收自己的歷史信息。和前饋網(wǎng)絡(luò)相比,記憶網(wǎng)絡(luò)中的神經(jīng)元具有記憶功能,在不同的時刻具有不同的狀態(tài)。記憶神經(jīng)網(wǎng)絡(luò)中的信息傳播可以是單向
    或雙向傳遞,因此可用一個有向循環(huán)圖或無向圖來表示。記憶網(wǎng)絡(luò)包括循環(huán)神經(jīng)網(wǎng)絡(luò)、Hopfield 網(wǎng)絡(luò)、玻爾茲曼機、受限玻爾茲曼機 等。

    記憶網(wǎng)絡(luò)可以看作一個程序,具有更強的計算和記憶能力。

    為了增強記憶網(wǎng)絡(luò)的記憶容量,可以引入外部記憶單元和讀寫機制,用來保存一些網(wǎng)絡(luò)的中間狀態(tài),稱為記憶增強神經(jīng)網(wǎng)絡(luò)。比如神經(jīng)圖靈機和記憶網(wǎng)絡(luò)。

  • 圖網(wǎng)絡(luò)

    為處理圖結(jié)構(gòu)的數(shù)據(jù)(用向量表示會損失信息)而出現(xiàn)的網(wǎng)絡(luò)。

    圖網(wǎng)絡(luò)是定義在圖結(jié)構(gòu)數(shù)據(jù)上的神經(jīng)網(wǎng)絡(luò)。圖中每個節(jié)點都由一個或一組神經(jīng)元構(gòu)成。節(jié)點之間的連接可以是有向的,也可以是無向的。每個節(jié)點可以收到來自相鄰節(jié)點或自身的信息。

    圖網(wǎng)絡(luò)是前饋網(wǎng)絡(luò)和記憶網(wǎng)絡(luò)的泛化,包含很多不同的實現(xiàn)方式,比如圖卷積網(wǎng)絡(luò)(GCN)、圖注意力
    網(wǎng)絡(luò)(GAT)、消息傳遞網(wǎng)絡(luò)(MPNN) 等。

前饋神經(jīng)網(wǎng)絡(luò)(FNN)

也稱為多層感知器(MLP)。但多層感知器的叫法并不是十分合理,因為前饋神經(jīng)網(wǎng)絡(luò)其實是由多層的Logistic回歸模型(連續(xù)的非線性函數(shù))組成,而不是由多層的感知器(不連續(xù)的非線性函數(shù))組成。

多層前饋神經(jīng)網(wǎng)絡(luò)

用以下記號描述一個前饋神經(jīng)網(wǎng)絡(luò):
\begin{align*} &? L:表示神經(jīng)網(wǎng)絡(luò)的層數(shù);\\ &? m^{(l)}:表示第l 層神經(jīng)元的個數(shù);\\ &? f_l(\cdot):表示第l層神經(jīng)元的激活函數(shù);\\ &? W^{(l)}\in\mathbb{R}^{m^{(l)}\times m^{l-1}}:表示第l ? 1 層到第l 層的權(quán)重矩陣;\\ &? b^{(l)}\in\mathbb{R}^l:表示第l ? 1 層到第l 層的偏置;\\ &? z^{(l)}\in\mathbb{R}^l:表示第l 層神經(jīng)元的凈輸入(凈活性值);\\ &? a^{(l)}\in\mathbb{R}^l:表示第l 層神經(jīng)元的輸出(活性值)。\\ &前饋神經(jīng)網(wǎng)絡(luò)通過下面公式進行信息傳播:\\ &z^{l}=W^{l}\cdot a^{(l-1)}+b^{l},a^{l}=f_l(z^{l})\\ &上兩個公式可以合并寫為:\\ &z^{l}=W^{l}\cdot f_l(z^{l-1})+b^{l}或者a^{l}=f_l(W^{l}\cdot a^{(l-1)}+b^{l})\\ &整個網(wǎng)絡(luò)可以看作一個復合函數(shù)?(x;W, b),將向量x作為第1 層的輸入a^{(0)},將第L層的輸出a^{(L)} 作為整個函數(shù)的輸出。\\ &\left.\boldsymbol{x}=\boldsymbol{a}^{(0)} \rightarrow \boldsymbol{z}^{(1)} \rightarrow \boldsymbol{a}^{(1)} \rightarrow \boldsymbol{z}^{(2)} \rightarrow \cdots \rightarrow \boldsymbol{a}^{(L-1)} \rightarrow \boldsymbol{z}^{(L)} \rightarrow \boldsymbol{a}^{(L)}=\phi(\boldsymbol{x} ; W, \boldsymbol)\right) \end{align*}

通用近似定理

對于具有線性輸出層和至少一個使用“擠壓”性質(zhì)的激活函數(shù)的隱藏層組成的前饋神經(jīng)網(wǎng)絡(luò),就是可以通過足夠多隱藏層神經(jīng)元的數(shù)量的前饋神經(jīng)網(wǎng)絡(luò),可以以任意的精度來近似任何一個定義在實數(shù)空間中的有界閉集函數(shù)。

通用近似定理只是說明了神經(jīng)網(wǎng)絡(luò)的計算能力可以去近似一個給定的連續(xù)函數(shù),但并沒有給出如何找到這樣一個網(wǎng)絡(luò),以及是否是最優(yōu)的。此外,當應用到機器學習時,真實的映射函數(shù)并不知道,一般是通過經(jīng)驗風險最小化和正則化來
進行參數(shù)學習。因為神經(jīng)網(wǎng)絡(luò)的強大能力,反而容易在訓練集上過擬合。

應用到機器學習

在機器學習中,輸入樣本的特征對分類器的影響很大。因此,要取得好的分類效果,需要將樣本的原始特征向量x轉(zhuǎn)換到更有效的特征向量?(x),這個過程叫做特征抽取。

反向傳播算法

設(shè)用隨機梯度下降進行參數(shù)更新。給定一個樣本(x, y),將其輸入到神經(jīng)網(wǎng)絡(luò)模型中,得到網(wǎng)絡(luò)輸出為?y。假設(shè)損失函數(shù)為L(y, ?y),要進行參數(shù)學習就需要計算損失函數(shù)關(guān)于每個參數(shù)的導數(shù)。
\begin{align*} &因為\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{W}^{(l)}}的計算涉及向量對矩陣的微分,十分繁瑣, 因此我們先計算\mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})關(guān)于參數(shù)矩陣中每個元素的偏導數(shù)\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{w}^{(l)}_{ij}}\\ &根據(jù)鏈式法則:\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial w_{i j}^{(l)}}=\frac{\partial \boldsymbol{z}^{(l)}}{\partial w_{i j}^{(l)}} \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}},\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol^{(l)}}=\frac{\partial \boldsymbol{z}^{(l)}}{\partial \boldsymbol^{(l)}} \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}}\\ &其中,\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}}是目標函數(shù)關(guān)于第l 層的神經(jīng)元z^{(l)}的偏導數(shù),稱為誤差項,可以一次計算得到。\\ &所以,我們只需要計算三個偏導數(shù),分別是: \frac{\partial \boldsymbol{z}^{(l)}}{\partial \boldsymbol{w}^{(l)}_{ij}},\frac{\partial \boldsymbol{z}^{(l)}}{\partial \boldsymbol^{(l)}},\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}}\\ \end{align*}

首先計算偏導數(shù)\frac{\partial \boldsymbol{z}^{(l)}}{\partial \boldsymbol{w}^{(l)}_{ij}}和\frac{\partial \boldsymbol{z}^{(l)}}{\partial \boldsymbol^{(l)}}
\begin{align*} &因z^{l}=W^{l}\cdot a^{(l-1)}+b^{l},所以\\ &\frac{\partial \boldsymbol{z}^{(l)}}{\partial \boldsymbol{w}^{(l)}_{ij}}=[\frac{\partial \boldsymbol{z}^{(l)}_1}{\partial \boldsymbol{w}^{(l)}_{ij}},\cdots,\frac{\partial \boldsymbol{z}^{(l)}_i}{\partial \boldsymbol{w}^{(l)}_{ij}},\cdots,\frac{\partial \boldsymbol{z}^{(l)}_{m^{l}}}{\partial \boldsymbol{w}^{(l)}_{ij}}]=[0,\cdots,\frac{\partial \boldsymbol{w}^{(l)}_{i:}a^{(l-1)}+b^{(l)}_i}{\partial \boldsymbol{w}^{(l)}_{ij}},\cdots,0]\\ &=[0,\cdots,a^{(l-1)}_{j},\cdots,0]\triangleq \mathbb{I}_{i}\left(a_{j}^{(l-1)}\right) \quad \in \mathbb{R}^{m^{(l)}}\\ &其中\(zhòng)boldsymbol{w}^{(l)}_{i:}為權(quán)重矩陣W^{l}的第i行,\mathbb{I}_{i}\left(a_{j}^{(l-1)}\right)表示第i個元素為a_{j}^{(l-1)},其余為0的行向量。\\ &\frac{\partial \boldsymbol{z}^{(l)}}{\partial \boldsymbol^{(l)}}=\boldsymbol{I}_{m^{(l)}} \quad \in \mathbb{R}^{m^{(l)} \times m^{(l)}},為m^{(l)}\times m^{(l)}的單位矩陣 \end{align*}
再計算偏導數(shù)\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}}
\begin{align*} &偏導數(shù)\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}}表示第l 層神經(jīng)元對最終損失的影響,也反映了最終損失對第l 層神經(jīng)元的敏感程度,\\ &因此一般稱為第l 層神經(jīng)元的誤差項,用\delta^{(l)} 來表示。\delta^{(l)} \triangleq \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}} \quad \in \mathbb{R}^{m^{(l)}}\\ &誤差項\delta^{(l)} 也間接反映了不同神經(jīng)元對網(wǎng)絡(luò)能力的貢獻程度,從而比較好地解決了貢獻度分配問題(CAP)。\\ &根據(jù)z^{l+1}=W^{l+1}\cdot a^{(l)}+b^{l+1},有\(zhòng)frac{\partial z^{(l+1)}}{\partial a^{(l)}}=\left(W^{(l+1)}\right)^{\mathrm{T}}\\ &根據(jù)a^{l}=f_l(z^{l}),其中f_l(\cdot)為按位計算的函數(shù),因此有 \frac{\partial \boldsymbol{a}^{(l)}}{\partial \boldsymbol{z}^{(l)}} =\frac{\partial f_{l}\left(\boldsymbol{z}^{(l)}\right)}{\partial \boldsymbol{z}^{(l)}} =\operatorname{diag}\left(f_{l}^{\prime}\left(\boldsymbol{z}^{(l)}\right)\right) \\ &因此,根據(jù)鏈式法則,第l層的誤差項為:\\ &\delta^{(l)} \triangleq \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}} =\frac{\partial \boldsymbol{a}^{(l)}}{\partial z^{(l)}} \cdot \frac{\partial z^{(l+1)}}{\partial \boldsymbol{a}^{(l)}} \cdot \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l+1)}} =\operatorname{diag}\left(f_{l}^{\prime}\left(z^{(l)}\right)\right) \cdot\left(W^{(l+1)}\right)^{\mathrm{T}} \cdot \delta^{(l+1)}\\&=f_{l}^{\prime}\left(\boldsymbol{z}^{(l)}\right) \odot\left(\left(W^{(l+1)}\right)^{\mathrm{T}} \delta^{(l+1)}\right)\\ &其中\(zhòng)odot是向量的點積運算符,表示每個元素相乘。\\ &反向傳播算法的含義是:第l 層的一個神經(jīng)元的誤差項(或敏感性)是所有與該神經(jīng)元相連的第l + 1 層的神 經(jīng)元的誤差項的權(quán)重和。\\ &然后,再乘上該神經(jīng)元激活函數(shù)的梯度。\\ &所以: \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial w_{i j}^{(l)}} =\mathbb{I}_{i}\left(a_{j}^{(l-1)}\right) \delta^{(l)} =\left[0, \cdots, a_{j}^{(l-1)}, \cdots, 0\right]\left[\delta_{1}^{(l)}, \cdots, \delta_{i}^{(l)}, \cdots, \delta_{m^{(l)}}^{(l)}\right]^{\mathrm{T}}=\delta_{i}^{(l)} a_{j}^{(l-1)} \\ &即:\left[\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial W^{(l)}}\right]_{i j}=\left[\delta^{(l)}\left(\boldsymbol{a}^{(l-1)}\right)^{\mathrm{T}}\right]_{i j}\\ &因此,\mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})關(guān)于第l層權(quán)重W^{(l)}的梯度為:\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial W^{(l)}}=\delta^{(l)}\left(\boldsymbol{a}^{(l-1)}\right)^{\mathrm{T}}\\ &同理,\mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})關(guān)于第l層偏置b^{(l)}的梯度為:\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial b^{(l)}}=\delta^{(l)}\\ \end{align*}

自動梯度計算

數(shù)值微分

是用數(shù)值方法來計算函數(shù)f(x) 的導數(shù)。實現(xiàn)簡單,但實用性差,且時間復雜度高。

符號微分

是一種基于符號計算的自動求導方法。

符號計算也叫代數(shù)計算,是指用計算機來處理帶有變量的數(shù)學表達式。
和符號計算相對應的概念是數(shù)值計算,即將數(shù)值代入 數(shù)學表示中進行計算。

符號計算一般來講是對輸入的表達式,通過迭代或遞歸使用一些事先定義的規(guī)則進行轉(zhuǎn)換。當轉(zhuǎn)換結(jié)果不能再繼續(xù)使用變換規(guī)則時,便停止計算。

也就是符號微分可以在編譯時就計算梯度的數(shù)學表示,并進一步進行優(yōu)化。此外,符號計算的一個優(yōu)點是符號計算和平臺無關(guān),可以在CPU或GPU上運行。

符號微分的缺點:一是編譯時間較長,特別是對于循環(huán),需要很長時間進行編譯;二是為了進行符號微分,一般需要設(shè)計一種專門的語言來表示數(shù)學表達式,并且要對變量(符號)進行預先聲明;三是很難對程序進行調(diào)試。

自動微分

如對復合函數(shù)f(x;w,b)進行自動微分,可構(gòu)建計算圖:

復合函數(shù)f(x;w, b) 的計算圖

是一種可以對一個(程序)函數(shù)進行計算導數(shù)的方法。符號微分的處理對象是數(shù)學表達式,而自動微分的處理對
象是一個函數(shù)或一段程序。自動微分可以直接在原始程序代碼進行微分,因此自動微分成為目前大多數(shù)深度學習框架的首選。

自動微分的基本原理是所有的數(shù)值計算可以分解為一些基本操作,包含+,?,×, / 和一些初等函數(shù)exp, log, sin, cos 等,然后利用鏈式法則來自動計算一個復合函數(shù)的梯度。

按照計算導數(shù)的順序,自動微分可以分為兩種模式:前向模式和反向模式(類似反向傳播)。

符號微分與自動微分對比

靜態(tài)計算圖和動態(tài)計算圖計算圖按構(gòu)建方式可以分為靜態(tài)計算圖(Theano 和Tensorflow)和動態(tài)計算圖(PyTorch)。靜態(tài)計算圖是在編譯時構(gòu)建計算圖,計算圖構(gòu)建好之后在程序運行時不能改變,而動態(tài)計算圖是在程序運行時動態(tài)構(gòu)建。兩種構(gòu)建方式各有優(yōu)缺點。靜態(tài)計算圖在構(gòu)建時可以進行優(yōu)化,并行能力強,但靈活性比較差。動態(tài)計算圖則不容易優(yōu)化,當不同輸入的網(wǎng)絡(luò)結(jié)構(gòu)不一致時,難以并行計算,但是靈活性比較高。

優(yōu)化問題

神經(jīng)網(wǎng)絡(luò)的參數(shù)學習比線性模型要更加困難,主要原因有兩點:(1)非凸優(yōu)化問題和(2)梯度消失問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容