回到目錄

02.2-DeepLearning-類神經網路優化技巧

1. Critical Point

Critical Point 是梯度( gradient)為 0 的點

如果 loss 沒有辦法再下降,也許是因為卡在 critical pointlocal minima OR saddle point

1.1 如何判斷?

無法完整知道整個損失函數的樣子,但是如果給定某一組參數,比如 θθ',在 θθ' 附近的損失函數是有辦法寫出來的,雖然 L(θ)L(θ) 完整的樣子寫不出來 θθ' 附近的 L(θ)L(θ) 可近似為(泰勒級數展開):

在 critical point 附近時:第二項為 0,根據第三項來判斷 → 只需考察 H 的特徵值

算出 vTHvv^THv 是正、負或有正有負,來判斷是哪種 critical point
也可只算 HH 就可

實例:

如果走到 saddle point,可以利用 HH 的特徵向量確定參數的更新方向

假設特徵值小於 0,得到對應的特徵向量 uu,在 θ\theta' 的位置加上 uu,沿著 uu 的方向做 update 得到 θ\theta,就可以讓 loss 變小

實例:

實作上很少運用此方法逃離 saddle point

1.2 Local Minima 比 Saddle Point 少的多

Loss 在一個維度很高的空間中往往只會遇到鞍點而幾乎不會遇到局部極小值點
從上圖可以看出,正特徵值的數目最多只佔所有特徵值的 60%,這就說明剩餘 40%-50% 的維度都仍然“有路可走”(是 saddle point

2. Batch and Momentum

2.1 Review:Optimization with Batch

Shuffle:

每個 Epoch 開始前往往會重新分一次 Batch,每一個 Epoch 的 Batch 都不一樣

2.2 Small Batch v.s. Large Batch

2.2.1 基本現象

2.2.2 時間性能

考慮並行運算,左邊(大的 batch size)並不一定時間比較長

現象:

原因:

對總時間(1 epoch)的影響:

因為有平行運算的能力,因此實際上當 batch size 小的時候,要跑完一個 Epoch 花的時間比大的 batch size 還要多;反之,大的 batch size 下跑完一個 Epoch 花的時間反而是比較少的

⇒ batch size 小時,Update 的次數大大增加

結論 1:使用較小的 Batch Size,在更新參數時會有 Noisy ⇒ 有利於訓練

不同的 batch 所用的 loss function 略有差異,可以避免局部極小值“卡住”

結論 2:使用較小的 Batch Size 可以避免 Overfitting(有利於測試)

根據 On Large-Batch Training For Deep Learning: Generalization Gap And Sharp Minima 這篇 paper 的實驗結果:

可觀察出 training 的時候都很好,testing 時大的 batch 較小的 batch 結果差,代表 overfitting

一種解釋(尚待可以研究):

在一個峽谷裡面的 local minima 是壞的 minima;若在一個平原上的 local minima 是好的 minima

假設 testing 的 loss function 是把 training 的 loss function 往右平移
⇒ 對於在一個盆地裡面的 minima 來說,它的在 training 跟 testing 上面的結果不會差太多;但對於在峽谷裡面的 minima 來說,一差就可以天差地遠

大的 batch size,會傾向於走到峽谷裡面;而小的 batch size,傾向於走到盆地裡面

總結:Batch Size 是一個需要調整的參數,它會影響訓練速度與優化效果

2.2.3 魚與熊掌兼得:結合大、小 Batch 的優點

2.3 Momentum

2.3.1 Vanilla Gradient Descent(一般的梯度下降)

只考慮梯度的方向,往反方向移動

2.3.2 Gradient Descent + Momentum(考慮動量)

綜合梯度 + 前一步的方向

所謂的 momentum 就是 update 的方向不是只考慮現在的 gradient,而是考慮過去所有 gradient 的總合

2.4 總結

3. Adaptive Learning Rate

現象 1:
training stuck ≠ small gradient。loss 不再下降時,未必說明此時到達 critical point,梯度可能還很大。實際上走到 critical point 是一件很困難的事,有可能只是在山谷的谷壁間來回走

現象 2:
如果使用固定的學習率,即使是在凸面體的優化,都會讓優化的過程非常困難

3.1 客制化梯度

不同的參數(大小)需要不同的學習率,新增參數 σit\sigma^t_i

根據參數此時的實際情況,調整 σit\sigma^t_i 的大小,實現對參數 θi\theta_i 的更新

基本原則:

方法一:Adagrad

考慮之前所有的梯度大小
求取 σ\sigma 的方式:

Root Mean Square(RMS),對本次及之前計算出的所有梯度求均方根

上面的坡度比較小 ⇒ gradient 較小 ⇒ σ 較小 ⇒ learning rate 大 ⇒ update 參數的量較大
下面的坡度比較大 ⇒ gradient 較大 ⇒ σ 較大 ⇒ learning rate 小 ⇒ update 參數的量較小

缺點:

不能實時考慮梯度的變化情況

方法二:RMSProp

調整當前梯度與過去梯度的重要性
添加參數 α\alpha,越大說明過去的梯度訊息更重要

方法三:Adam = RMSProp + Momentum(最常用的策略)

使用 PyTorch 中預設的參數就能夠得到比較好的結果

3.2 Learning Rate Scheduling

讓 learning rate 與訓練時間有關

問題

解決:

新增 ηtη^t,讓它與時間有關

Learning Rate Decay:隨著時間的不斷地前進,隨著參數不斷的 update,ηtη^t 越來越小

Warm Up:讓 learning rate 先變大後再變小

解釋:

σ\sigma 指示某一個方向它到底有多陡/多平滑,這個統計的結果,要看得夠多筆數據以後才精準,所以一開始我們的統計是不精準的。一開始 learning rate 比較小,是讓它探索收集一些有關 error surface 的情報,在這一階段使用較小的 learning rate,限制參數不會走的離初始的地方太遠;等到 σ\sigma 統計得比較精準以後再讓 learning rate 慢慢爬升

補充:RAdam 有更詳細的解釋 Warm Up

3.3 總結

3.4 Learn More

4. Batch Normalization

現象:

不同的參數發生變化,引起損失函數變化的程度不同,原因是因受不同維度輸入值的差異的影響

說明:

結論:

不同維度的輸入值 scale 差距可能很大,就會產生在不同方向上,斜率、坡度非常不同的 error surface

4.1 Feature Normalization(歸一化)

4.1.1 一種 Normalization 方法

對不同 feature 向量的同一維度進行標準化(Standardization)

xir~=xirmiσi\tilde{x^r_i} = \frac{x^r_i-m_i}{\sigma_i}

4.1.2 每一層都需要一次 Normalization

x~\tilde{x} 經過 W1W_1 矩陣後,a,za,z 數值的分布各維度仍然有很大的差異,要 train 第二層的參數 W2W_2 也會有困難,因此需要對 aa 或者 zz 進行 normalization

一般而言,normalization 步驟要放在 activation function 之前或之後都是可以的

如果選擇的是 sigmoid,比較推薦對 zz 做 feature normalization。因為 Sigmoid 在 0 附近斜率比較大,所以如果對 zz 做 feature normalization,把所有的值都挪到 0 附近,算 gradient 時,出來的值會比較大

具體步驟(對 zz 做 Feature Normalization):

1. 對向量的對應 element 做求平均、標準差的運算,求得向量 μ,σ\mu,\sigma
2. 對每個向量 zz 利用 μ,σ\mu,\sigma 對對應 element 進行歸一化,得到 z~\tilde{z}
3. 繼續後續的步驟

4.1.3 注意:對一批 zz 數據進行歸一化

模型變為需一次處理一批 features 的模型,數據之間相互關聯

4.1.4 Batch Normalization

實際上做 normalization 時,只考慮有限數量的數據,即考慮一個 batch 內的數據,近似整個數據集

Batch Normalization 適用於 batch size 比較大。一個 batch 內的 data 可以認為足以表示整個 corpus 的分布,本來要對整個 corpus 做 feature normalization 這件事情,改成只在一個 batch 中做 feature normalization 作為近似

還原:

引入向量 γ,β\gamma,\beta,將原本被歸一化到 μ=0,σ=1μ=0,\sigma=1 的各維度資料恢復到某一分布

做 normalization 以後 z~\tilde{z} 平均就一定是 0,可以視作是給 network 一些限制,但這個限制可能會帶來負面的影響,因而增加 γ,β\gamma,\beta 參數

訓練時初始將 γ\gamma 設為全為 1 的向量,β\beta 設為全為 0 的向量。在一開始訓練的時,讓每一個 dimension 的分布比較接近。訓練夠長的一段時間,已經走到一個比較好的 error surface,那再把 γ,β\gamma,\beta 慢慢地加進去

4.1.5 Testing 時會遇到的問題

testing(inference)時沒有 Batch 進行歸一化Training 時會紀錄 μˉ\bar{\mu}σˉ\bar{\sigma}

pp 是超參數)

在 testing 階段一筆資料進來就要產生結果,沒有一個“batch”的數據可以進行歸一化,所以在 PyTorch 中,training 時就會把每一個 batch 計算出來的 μ\muσ\sigma,拿出來算 moving average

4.1.6 結果比較

紅色虛線(有做 Batch Normalization)收斂的速度顯然比黑色虛線(沒有做 Batch Normalization)要快很多

橫軸:訓練過程,縱軸:準確率(Validation set)

為什麼 Batch Normalization 會比較好?

How Does Batch Normalization Help Optimization 論文中,作者從實驗上,也從理論上,至少支持了 batch normalization 可以改變 error surface,讓 error surface 比較不崎嶇這個觀點

4.1.7 其他 Normalization 方法