神經網絡煉丹術:神經網絡調參

自:
《TensorFlow深度學習》
《深度學習入門》
《深度學習實戰》

一丶梯度優化算法

  1. WW 表示需要更新的參數

  2. LW\frac{\partial L}{\partial W} 表示損失函數關於W的梯度

  3. η\eta 表示學習率

SDG

SDG的缺點會陷入局部最小和鞍點
WWηLWW \leftarrow W -\eta\frac{\partial L}{\partial W}
在這裏插入圖片描述

momentum

momentum因爲下降的時候有速度,然後不會停止,很有可能走出困境
vαvηLWWW+vv \leftarrow \alpha v -\eta\frac{\partial L}{\partial W} \\W \leftarrow W+v
在這裏插入圖片描述
受學習率影響很大,每個維度學習率一樣,是全局設置,如果針對稀疏數據,很難學習,所以急需個性化設置每個維度的學習率,也就有了下面的AdaGrad

AdaGrad

調整學習率

hh+LW2WWη1hLWh \leftarrow h +\frac{\partial L}{\partial W} ^2 \\ \\ W \leftarrow W-\eta \frac{1}{\sqrt{h}}\frac{\partial L}{\partial W}

  1. 以往梯度的平方和做分母,所以前期分母小,前期學習率就大,加速訓練,後期分母大小,學習率就會變小;
  2. 且每個有不同的學習率

但是假如前期學習率比較大,初始梯度爆炸,那麼往後的學習率很小,訓練提前結束,需要很多次很多迭代纔行,就像下面
在這裏插入圖片描述
需要加上小的值 防止初始值爲0
解決:變種RMSProp , 分母由平方和變成加權平均,解決提前結束

Adam

Mommentum + Adagrad + 校驗

學習率自適應

直接設置學習率
在這裏插入圖片描述

使用方式

1. 稀疏數據:使用學習率自適應,比如廣告預估業務, 特徵維度幾十億維,到幾百維有值
2. SGD慢,但最終要比較好,需要自我調整learning rate ,其他的自適應比較懶不需要自己手動調整
3. 較深較複雜且需要快速收斂,推薦adam

二丶激活函數

在這裏插入圖片描述

sigmod

1. 輸入太小或太大無梯度,因爲接近0了
2. exp複雜計算

3. 梯度容易消失y(1-y),多層梯度很小
4. 輸出均值爲0.5

tanh

1. 快,計算量小
2. 輸入太小或太大無梯度
3. 輸出均值爲0

ReLu

1. 快,計算量小,
2. 梯度不會太小

3. 輸出均值非0
4 . 非常大的梯度流過神經元就不會有激活現象

leaky ReLu : ReLu改善
x小於0時乘以係數,就會更小,不會一直爲0

ELU

1. 均值接近0
2. 小於0時exp難算

使用方式

1. 小心設置ReLu學習率
2. 不要使用sigmod
3. 推薦使用 leaky ReLu,ELU
4. 試試 tanh

三丶網絡初始化

權重初始值

權值衰減:通過減小權重參數的值來抑制過擬合的發生
是像0.01 * np.random.randn(10, 100)這樣,使用由高斯分佈生成的值乘以0.01後得到的值(標準差爲0.01的高斯分佈)

那全部爲0呢?
比如,在2層神經網絡中,假設第1層和第2層的權重爲0。這樣一來,正向傳播時,因爲輸入層的權重爲0,所以第2層的神經元全部會被傳遞相同的值。第2層的神經元中全部輸入相同的值,這意味着反向傳播時第2層的權重全部都會進行相同的更新(回憶一下“乘法節點的反向傳播好的參數:激活值分佈分散就好一些,集中就不好的內容)。因此,權重被更新爲相同的值,並擁有了對稱的值(重複的值)。這使得神經網絡擁有許多不同的權重的意義喪失了。爲了防止“權重均一化”(嚴格地講,是爲了瓦解權重的對稱結構),必須隨機生成初始值

隱藏層激活值的分佈

在這裏插入圖片描述
這裏假設神經網絡有5層,每層有100個神經元。然後,用高斯分佈隨機生成1000個數據作爲輸入數據,並把它們傳給5層神經網絡。激活函數使用sigmoid函數

  1. 第一幅圖:各層的激活值呈偏向0和1的分佈。這裏使用的sigmoid函數是S型函數,隨着輸出不斷地靠近0(或者靠近1),它的導數的值逐漸接近0。因此,偏向0和1的數據分佈會造成反向傳播中梯度的值不斷變小,最後消失。這個問題稱爲梯度消失(gradient vanishing)。層次加深的深度學習中,梯度消失的問題可能會更加嚴重。
  2. 第二幅圖:使用標準差爲0.01的高斯分佈時,各層的激活值的分佈。這次呈集中在0.5附近的分佈。因爲不像剛纔的例子那樣偏向0和1,所以不會發生梯度消失的問題。但是,激活值的分佈有所偏向,說明在表現力上會有很大問題。爲什麼這麼說呢?因爲如果有多個神經元都輸出幾乎相同的值,那它們就沒有存在的意義了。比如,如果100個神經元都輸出幾乎相同的值,那麼也可以由1個神經元來表達基本相同的事情。因此,激活值在分佈上有所偏向會出現“表現力受限”的問題
  3. 第三幅圖:試使用Xavier Glorot等人的論文[9]中推薦的權重初始值(俗稱“Xavier初始值”)Xavier的論文中,爲了使各層的激活值呈現出具有相同廣度的分佈,推導了合適的權重尺度。推導出的結論是,如果前一層的節點數爲nn,則初始值使用標準差爲 1n\frac {1}{\sqrt n}的分佈A
    在這裏插入圖片描述

Xavier初始值是以激活函數是線性函數爲前提而推導出來的。因爲sigmoid函數和tanh函數左右對稱,且中央附近可以視作線性函數,所以適合使用Xavier初始值
在這裏插入圖片描述
但當激活函數使用ReLU時,一般推薦使用ReLU專用的初始值,也就是Kaiming He等人推薦的初始值,也稱爲“He初始值”,當前一層的節點數爲n時,He初始值使用標準差爲 2n\frac {2}{\sqrt n}的高斯分佈。當Xavier初始值是 1n\frac {1}{\sqrt n}時,(直觀上)可以解釋爲,因爲ReLU的負值區域的值爲0,爲了使它更有廣度,所以需要2倍的係數。

在這裏插入圖片描述

四丶批歸一化 Batch Normalization

每層更改了激活函數,怎麼辦?那麼適合於某一種的就不適用了,於是我們“強制性”地調整激活值的分佈會怎樣呢

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
上圖得出使用Batch Norm後,學習進行得更快了
下面是是權重初始值的標準差爲各種不同的值時的學習過程圖。我們發現,幾乎所有的情況下都是使用Batch Norm時學習進行得更快。
在這裏插入圖片描述

五丶擬合問題

在這裏插入圖片描述
如圖 (a)所示,這種現象叫做欠擬合。但如果用較複雜的函數模型去學習時,有可能學習到的函數會過度地“擬合”訓練集樣本,從而導致在測試集上表現不佳,如圖 ©所示,這種現象叫做過擬合。只有學習的模型和真實模型容量大致匹配時,模型才能具有較好地泛化能力,如圖 (b)所示。

欠擬合

當我們發現當前的模型在訓練集上誤差一直維持較高的狀態,很難優化減少,同時在測試集上也表現不佳時,我們可以考慮是否出現了欠擬合的現象。這個時候可以通過增加神經網絡的層數、增大中間維度的大小等手段,比較好的解決欠擬合的問題。但是由於現代深度神經網絡模型可以很輕易達到較深的層數,用來學習的模型的容量一般來說是足夠的,在實際使用過程中,更多的是出現過擬合現象。

過擬合:正則化技術

發生過擬合的原因,主要有以下兩個。
• 模型擁有大量參數、表現力強。
• 訓練數據少

權重衰弱

前面所說的網絡初始化的權重衰弱是防止過擬合的一種方法

調節層數與參數規模

網絡的層數和參數量是網絡容量很重要的參考指標,通過減少網絡的層數,並減少每層中網絡參數量的規模,可以有效降低網絡的容量。

在這裏插入圖片描述
其中紅色矩形塊和藍色圓形塊分別代表了訓練集上的 2 類樣本,保持其它超參數一致,僅調整網絡的層數,訓練獲得樣本上的分類效果,如圖中所示,可以看到,隨着網絡層數的加深,學習到的模型決策邊界越來越逼近訓練樣本,出現了過擬合現象。對於此任務,2 層的神經網絡即可獲得不錯的泛化能力,更深層數的網絡並沒有提升性能,反而出現過擬合現象,泛化能力變差,同時計算代價也更高

Dropout

權值衰減是一直以來經常被使用的一種抑制過擬合的方法。該方法可以簡單地實現,在某種程度上能夠抑制過擬合。但是,如果網絡的模型變得很複雜,只用權值衰減就難以應對了。在這種情況下,我們經常會使用Dropout 方法

Dropout是一種在學習的過程中隨機刪除神經元的方法

訓練時,每傳遞一次數據,隨機選出隱藏層的神經元,然後將其刪除。被刪除的神經元不再進行信號的傳遞
測試時,雖然會傳遞所有的神經元信號,但是對於各個神經元的輸出,要乘上訓練時的刪除比例後再輸出
在這裏插入圖片描述

在這裏插入圖片描述

六丶數據增強·

  1. 歸一化
  2. 圖像翻轉:翻轉,拉伸,裁剪,變形
  3. 色彩變換:對比度,亮度
  4. 多尺度

七丶可視化檢查中間狀態

在這裏插入圖片描述

  1. . 說明沒有學習到,有可能學習率比價大
  2. 過擬合
  3. 嚴重過擬合
  4. 平緩,速度不夠快,調整學習率
  5. 初始化沒有好
  6. 梯度加反了,找最大的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章