深度學習基礎(2)

1.激活函數和損失函數

在神經網絡中,除了基本的矩陣運算外,還會涉及兩個函數的操做。算法

1.1 激活函數

激活函數的主要做用是提供網絡的非線性建模能力。若是沒有激活函數,網絡只能表示特徵的線性映射,即使有再多隱藏層,其整個網絡也和單層網絡是等價的。激活函數應該具備的性質:網絡

  • 可微性:後向傳播尋優,須要這個性質。
  • 單調性:保證單層網路是凸函數。
  • 輸出值的範圍:有限範圍時,基於梯度的優化方法更加穩定,由於特徵的表示受有限權值得影響更顯著;無限時,模型訓練更高效,不過此時通常須要更小的learning rate。

常見的激活函數可能是分段線性和具備指數形狀的非線性函數。函數

sigmoid函數

\[f(x)=\frac{1}{1+e^x}\]學習

sigmoid函數是應用範圍最廣的一類激活函數,它在物理意義上接近生物神經元,此外(0,1)的輸出區間也能夠用來表示機率。然而,sigmoid也有其自身的缺陷,最明顯的是飽和性,其兩側導數值逐漸趨近於0。
\[\lim_{x->\infty}f'(x)=0\]優化

具備這種性質的稱爲軟飽和激活函數,飽和又分爲左飽和與右飽和。與軟飽和相對的是硬飽和,即:
\[ f'(x)=0, |x|>c ,c爲常數 \]spa

sigmoid的軟飽和性,使得深度神經網絡在二三十年裏一直難以有效的訓練,是阻礙神經網絡發展的重要緣由。.net

具體來講,後向傳播中,sigmoid的傳導因子中包含\(f'(x)\)因子,所以一旦落入飽和區,\(f'(x)\)就變得接近於0,致使向底層傳遞的梯度很是小。此時網絡參數很可貴到有效的訓練,稱這種現象爲梯度消失,通常來講,sigmoid網絡在5層內就會產生梯度消失現象。blog

此外,sigmoid函數的輸出大於0,均值不爲0,稱之爲偏移現象,在前向傳播中,後層神經元獲得上一層的輸出始終是非0的信號。get

tanh函數

\[ f(x)=\frac{1-e^{-2x}}{1+e^{-2x}} \]深度學習

tanh函數也是一種常見的激活函數,與sigmoid相比,其均值爲0,使得其收斂速度比sigmoid要快。然而因爲tanh也具備軟飽和性,從而會帶來梯度消失。

ReLU,P_ReLU,Leaky-ReLU

\[ f(x)= \begin{cases} x, \; if \; x\geq 0\\ 0, \; if \; x<0 \end{cases}\\ f(x)=max(0,x) \]

ReLU的全稱是Rectified Linear Units,是一種後來纔出現的激活函數。能夠看到,當x<0時,ReLU硬飽和,而當x>0時,則不存在飽和問題。因此ReLU在x>0時保持梯度不衰減,從而緩解了梯度消失的問題,這讓咱們能夠直接以監督的方式訓練深層神經網絡,而無需依賴逐層的預訓練。

然而,隨着訓練的推動,部分輸入落入硬飽和區,致使對應權重沒法更新,造成「死亡神經元」。且與sigmoid相似,ReLU的輸出均值>0,偏移現象和死亡神經元會影響網絡的收斂性。改進得:

\[ f(x)= \begin{cases} x, \; if \; x \geq 0 \\ ax, \; if \; x <0 \end{cases} \]

這就是Leaky-ReLU,而P-ReLU認爲,α也能夠做爲一個參數來學習,原文獻建議初始化a爲0.25,不採用正則。

ELU

\[ f(x)= \begin{cases} x, \;\;\;\;\;\;\;\;\;\;\;if x\geq 0\\ \alpha (e^x-1), \;if x<0 \end{cases} \]

融合了sigmoid和ReLU,左側具備軟飽和性,右側無飽和性。右側線性部分能夠緩解梯度消失,而左側的軟飽和能讓ELU對輸入的變化和噪聲更加魯棒。ELU的均值接近於0。在ImageNet上,不加BN30層以上的ReLU網絡沒法收斂,而ELU網絡能夠收斂。

MaxOut

\[ f(x)=max(w_1^Tx+b_1, w_2^Tx+b_2,\cdots,w_n^T+b_n) \]

maxout能夠近似任意連續函數,且當\(w_2,b_2,w_3,b_3...=0\)時,退化成了ReLU。Maxout能夠緩解梯度降低,同時又避免了ReLU神經元死亡的缺點,但增長了參數和計算量。

1.2 損失函數

前面,咱們使用的是平方差函數
\[ C=\frac{1}{2}(a-y)^2 \]

當神經元的輸出和咱們的指望差距越大,損失越嚴重。
可是在實際中,咱們知道:

\[ \frac{\partial C}{\partial W}=(a-y)\sigma'(a)x^T \\ \frac{\partial C}{\partial b}=(a-y)\sigma'(a) \]

其中都有\(\sigma'(a)\)這一項,由於sigmoid函數的性質,致使\(\sigma'(z)\)在z的大部分狀況下都會形成飽和現象,從而致使參數的更新很慢,因此咱們想到了交叉熵,交叉熵的計算公式爲:

\[ H(y,a)=-\sum_i{y_{i}*log(a_i)} \]

若是有多個樣本,總體的平均交叉熵爲

\[ H(y,a)=-\frac{1}{n}\sum_n\sum_i{y_{i,n}*log(a_{i,n})} \]

其中,n爲樣本編號,i爲類別編號。

以logistic分類爲例:\(H(y,a)=-\frac{1}{n}\sum_n{ylog(a) + (1-y)log(1-a)}\)

與平方損失函數相比,交叉熵具備很是好的性質:

\[ \frac{\partial{H}}{\partial{z}} = \frac{1}{n} \sum_n{\frac{y}{a}*a*(1-a) - \frac{1-y}{1-a}*a(1-a)} = \frac{1}{n}\sum{(\sigma(z_n)-y_n)} \]

可見,消除了\(\sigma'\)這一項,這樣便不會受最後一個激活函數的影響,偏差大時更新大,偏差小時跟新小。

激活函數比較:http://www.jianshu.com/p/22d9720dbf1a

softmax激活函數

softmax也是咱們常見的激活函數主要用於多分類神經元的輸出。

\[ y_j = f(z_j) = \frac{e^{z_j}}{\sum_k{e^{z_k}}} \]

直接輸出各個類別的機率:

  • 1 >\(y_i\) > 0
  • \(\sum_k{y_k}\) = 0

若是某個\(z_j\)大於其餘z,那麼它的映射份量就會逼近1,其餘逼近0。取對數,模擬max的行爲,讓大的更大,且保證可導。

sigmoid用於二分類,softmax可用於多分類。在二分類問題時,softmax和sigmoid是同樣的(\(z'=z_2-z_1\)):

\[ h(x) = \frac{e^{z_1}}{e^{z_1} + e^{z_2}} = \frac{1}{1+e^{z_2-z_1}} = \frac{1}{1+e^{z'}} \]

softmax的求導見:https://zhuanlan.zhihu.com/p/25723112

2.優化方法

主要介紹一階的梯度法,包括SGD, Momentum, Nesterov Momentum, AdaGrad, RMSProp, Adam。其中SGD,Momentum,Nesterov Momentum是手動指定學習速率的,然後面的AdaGrad, RMSProp, Adam,就可以自動調節學習速率

BGD

即batch gradient descent,在訓練中,利用現有參數對訓練集中的每個輸入生成一個估計輸出\(\hat{y_i}\),而後跟實際輸出\(y_i\)比較,統計全部偏差,求平均之後獲得平均偏差,以此來做爲更新參數的依據。

具體實現:
須要:學習速率 ϵ, 初始參數θ
每步迭代過程:

  1. 提取訓練集中的全部內容\(\{x_1,...x_n\}\),以及相關的輸出\(y_i\)
  2. 計算梯度和偏差並更新參數:

\[ \begin{align*} &\hat g \leftarrow +\frac{1}{n}\nabla_\theta \sum_i L(f(x_i;\theta),y_i) \\ &\theta \leftarrow \theta-\epsilon\hat g \end{align*} \]

優勢:
因爲每一步都利用了訓練集中的全部數據,所以當損失函數達到最小值之後,可以保證此時計算出的梯度爲0。換句話說,就是可以收斂。所以,使用BGD時不須要逐漸減少學習速率 ϵ。
缺點:
因爲每一步都要使用全部數據,所以隨着數據集的增大,運行速度會愈來愈慢。

SGD

SGD全名stochastic gradient descent,即隨機梯度降低。不過這裏的SGD其實跟MBGD(minibatch gradient descent)是一個意思,即隨機抽取一批樣本,以此爲根據來更新參數。
具體實現:
須要:學習速率 ϵ, 初始參數 θ
每步迭代過程:

  1. 從訓練集中的隨機抽取一批容量爲m的樣本\(\{x_1,…,x_m\}\),以及相關的輸出\(y_i\)
  2. 計算梯度和偏差並更新參數:

\[ \begin{align*} & \hat g \leftarrow +\frac{1}{m}\nabla_\theta \sum_i L(f(x_i;\theta),y_i)\\ & \theta \leftarrow \theta-\epsilon\hat g \end{align*} \]

優勢:
訓練速度快,對於很大的數據集,也可以以較快的速度收斂。

缺點:
因爲是抽取,所以不可避免的,獲得的梯度確定有偏差。所以學習速率須要逐漸減少,不然模型沒法收斂。由於偏差,因此每一次迭代的梯度受抽樣的影響比較大,也就是說梯度含有比較大的噪聲,不能很好的反映真實梯度。

這樣一來,ϵ如何衰減就成了問題,若是要保證SGD收斂,應該知足以下兩個要求:

\[ \begin{align*} &\sum_{k=1}^\infty \epsilon_k = \infty \\ &\sum_{k=1}^\infty \epsilon_k^2 <\infty \end{align*} \]

而在實際操做中,通常是進行線性衰減:

\[ \begin{align*} &\epsilon_k=(1-\alpha)\epsilon_0+\alpha\epsilon_\tau\\ &\alpha = \frac{k}{\tau} \end{align*} \]

其中\(\epsilon_0\)是初始學習率,\(\epsilon_\tau\)是最後一次迭代的學習率。\(\tau\)天然表明迭代次數。
通常來講,\(\epsilon_\tau\)設爲\(\epsilon_0\)的1%比較合適。而\(\tau\)通常設爲讓訓練集中的每一個數據都輸入模型上百次比較合適。
那麼初始學習率\(\epsilon_0\)怎麼設置呢?書上說,你先用固定的學習速率迭代100次,找出效果最好的學習速率,而後\(\epsilon_0\)設爲比它大一點就能夠了。

Momentum

上面的SGD在每次迭代中都包含較大的噪音,而Momentum能夠較好地解決這個問題,尤爲是面對小而連續的梯度但含有不少噪聲的時候。Momentum借用了物理中動量的概念,將前幾回的梯度也參與到運算中。

具體實現:
須要:學習速率 ϵ,初始參數 θ,初始速率v,動量衰減參數α
每步迭代過程:

  1. 從訓練集中的隨機抽取一批容量爲m的樣本\(\{x_1,…,x_m\}\),以及相關的輸出\(y_i\)
  2. 計算梯度和偏差,並更新速度v和參數θ:

\[ \begin{align*} & \hat g \leftarrow +\frac{1}{m}\nabla_\theta \sum_i L(f(x_i;\theta),y_i)\\ & v\leftarrow\alpha v-\epsilon\hat g \\ & \theta\leftarrow\theta+v \end{align*} \]

其中,\(\alpha\)表示動量的衰減程度,若是每次迭代獲得的梯度都是g,那麼最終獲得的\(v=\frac{\epsilon||g||}{1-\alpha}\)

也就是說,Monentum最好的狀況下能夠將學習率加速\(\frac{1}{1-\alpha}\)倍。通常α的取值有0.5,0.9,0.99這幾種,固然也可讓α的值隨着時間而變化,開始小一點,後來再加大。

特色:
先後梯度方向一致時,可以加速學習。先後梯度方向不一致時,可以抑制震盪。

Nesterov Momentum

先對參數進行估計,而後使用估計後的參數進行偏差計算

具體實現:
須要:學習速率 ϵ,初始參數 θ,初始速率v,動量衰減參數α
每步迭代過程:

  1. 從訓練集中的隨機抽取一批容量爲m的樣本\(\{x_1,…,x_m\}\),以及相關的輸出\(y_i\)
  2. 計算梯度和偏差,並更新速度v和參數θ:

\[ \begin{align*} & \hat g \leftarrow +\frac{1}{m}\nabla_\theta \sum_i L(f(x_i;\theta+\alpha v),y_i)\\ & v\leftarrow\alpha v-\epsilon\hat g \\ & \theta\leftarrow\theta+v \end{align*} \]

注意在估算\(\hat{g}\)的時候,參數變成了\(\theta+\alpha v\)而不是以前的θ。

AdaGrad

AdaGrad能夠自動變動學習速率,只是須要設定一個全局的學習速率ϵ,可是這並不是是實際學習速率,實際的速率是與以往參數的模之和的開方成反比的。

\[ \epsilon_n=\frac{\epsilon}{\delta+\sqrt{\sum_{i=1}^{n-1}g_i\odot g_i}} \]

其中\(\delta\)是一個很小的常亮,大概在\(10^{−7}\),防止出現除以0的狀況。

具體實現:
須要:全局學習速率 ϵ,初始參數 θ,數值穩定量δ
中間變量: 梯度累計量r(初始化爲0)
每步迭代過程:

  1. 從訓練集中的隨機抽取一批容量爲m的樣本\(\{x_1,…,x_m\}\),以及相關的輸出\(y_i\)
  2. 計算梯度和偏差,更新r,再根據r和梯度計算參數更新量

\[ \begin{align*} & \hat g \leftarrow +\frac{1}{m}\nabla_\theta \sum_i L(f(x_i;\theta),y_i)\\ & r\leftarrow r+\hat g\odot \hat g \\ & \triangle \theta = -\frac{\epsilon}{\delta+\sqrt{r}}\odot \hat g \\ & \theta\leftarrow\theta+\triangle \theta \end{align*} \]

優勢:
可以實現學習率的自動更改。若是此次梯度大,那麼學習速率衰減的就快一些;若是此次梯度小,那麼學習速率衰減的就滿一些。

缺點:
任然要設置一個變量ϵ
經驗代表,在普通算法中也許效果不錯,但在深度學習中,深度過深時會形成訓練提早結束。

RMSProp

經過引入一個衰減係數,讓r每回合都衰減必定比例,相似於Momentum中的作法。

具體實現:
須要:全局學習速率 ϵ,初始參數 θ,數值穩定量δ,衰減速率ρ
中間變量: 梯度累計量r(初始化爲0)
每步迭代過程:

  1. 從訓練集中的隨機抽取一批容量爲m的樣本\(\{x_1,…,x_m\}\),以及相關的輸出\(y_i\)
  2. 計算梯度和偏差,更新r,再根據r和梯度計算參數更新量

\[ \begin{align*} & \hat g \leftarrow +\frac{1}{m}\nabla_\theta \sum_i L(f(x_i;\theta),y_i)\\ & r\leftarrow \rho r+(1-\rho)\hat g\odot \hat g \\ & \triangle \theta = -\frac{\epsilon}{\delta+\sqrt{r}}\odot \hat g \\ & \theta\leftarrow\theta+\triangle \theta \end{align*} \]

優勢:
相比於AdaGrad,這種方法很好的解決了深度學習中過早結束的問題
適合處理非平穩目標,對於RNN效果很好

缺點:
又引入了新的超參,衰減係數ρ
依然依賴於全局學習速率

RMSProp with Nesterov Momentum

將RMSProp和Nesterov Momentum結合起來的

\[ \begin{align*} & \tilde \theta \leftarrow \theta + \alpha v \\ & \hat g \leftarrow +\frac{1}{m}\nabla_{\tilde \theta} \sum_i L(f(x_i;\tilde \theta),y_i)\\ & r\leftarrow \rho r+(1-\rho)\hat g\odot \hat g \\ & v \leftarrow \alpha v-\frac{\epsilon}{\sqrt r}\odot \hat g \\ & \theta\leftarrow\theta+v \end{align*} \]

Adam

Adam(Adaptive Moment Estimation)本質上是帶有動量項的RMSprop,它利用梯度的一階矩估計和二階矩估計動態調整每一個參數的學習率。Adam的優勢主要在於通過偏置校訂後,每一次迭代學習率都有個肯定範圍,使得參數比較平穩。

具體實現:
須要:步進值 ϵ, 初始參數 θ, 數值穩定量δ,一階動量衰減係數\(\rho_1\), 二階動量衰減係數\(\rho_2\)
其中幾個取值通常爲:\(\delta=10^{-8},\rho_1=0.9,\rho_2=0.999\)
中間變量:一階動量s,二階動量r,都初始化爲0
每步迭代過程:

  1. 從訓練集中的隨機抽取一批容量爲m的樣本\(\{x_1,…,x_m\}\),以及相關的輸出\(y_i\)
  2. 計算梯度和偏差,更新r和s,再根據r和s以及梯度計算參數更新量

\[ \begin{align*} & g \leftarrow +\frac{1}{m}\nabla_{\theta} \sum_i L(f(x_i;\theta),y_i)\\ & s \leftarrow \rho_1s+(1-\rho_1)g \\ & r\leftarrow \rho_2 r+(1-\rho_2)g\odot g \\ & \hat s \leftarrow \frac{s}{1-\rho_1} \\ & \hat r \leftarrow \frac{r}{1-\rho_2} \\ & \triangle \theta = -\epsilon \frac{\hat s}{\sqrt{\hat r}+\delta} \\ & \theta\leftarrow\theta+\triangle \theta \end{align*} \]

詳見:http://blog.csdn.net/heyongluoyao8/article/details/52478715

相關文章
相關標籤/搜索