---
# System prepended metadata

title: 類神經網絡訓練不起來怎麼辦？- 1
tags: [李宏毅, 深度學習, 模型訓練技巧]

---

## 兩個可能使類神經網絡訓練不起來的原因
### 1. Gradient 太小
還記得之前的文章「[如何訓練出好模型呢？](https://hackmd.io/@lcaMuWOwR1Ox5o5yeTEupA/BkJ55L580/%2F16J6KM5BSxCbJocJHcia_A)」提到，更新參數主要是透過 Learning rate 還有 Loss function 的導數所決定，如果忘記的話，可以看到下方的圖片加以複習，那什麼時候讓 w 無法再繼續向右更新下去呢？沒錯，就是偏微分為零，也就是斜率為零的地方，稱為「Critical point」。

![image](https://hackmd.io/_uploads/BkIujqxNC.png)

即使在 Critical point 上，也無法保證此點就是全域最小值（Global minima），有可能是局部最小值（Global minima）或者是鞍點（Saddle point），那如何判斷到底是哪一個呢？

首先要先了解什麼是鞍點（Saddel point），從下方最右邊的圖可以看到，對左右兩側來說中間的點屬於最小值，但在前後兩側來說屬於最大值，此即為鞍點，也可以用數學式 Tayler series approximation 得知，有興趣者可再自行研究。

![image](https://hackmd.io/_uploads/Hyk8ltpVC.png)

:::info
在二維平面上，我們很難判斷出（局部）最小值與鞍點，更新參數過程中，害怕遇到的是（局部）最小值，導致 Gradient 為零，至於鞍點由於還能在其他方向上往更低點更新，因此其影響較小，但會不會在更高維的世界中，其實（局部）最小值其實根本就很少見呢？

答案是對的，遇到（局部）最小值的情況是非常少見的。
:::

### 2. Error surface 非常不平緩
另外一種使訓練卡住的原因，就是 Learning rate(η)，不是說 η 可以用來控制步伐大小，沒錯，但若 η 值太大或太小都會遇到問題。

從下圖可以看到，loss 已不再下降，但是 gradient 卻有時大有時小，這是因為跨越的步伐太大，導致參數無法向低谷前進，反倒像是在兩個山壁間徘徊震盪；反之，若跨越的步伐太小，即使更新次數非常多次，也會走得相當緩慢，以上正是問題所在之處。
    
![image](https://hackmd.io/_uploads/HyN7HR6ER.png)

## 讓 Loss 繼續下降的三個方法
### 1. Batch size
下方來自「[如何訓練出好模型呢？](https://hackmd.io/@lcaMuWOwR1Ox5o5yeTEupA/BkJ55L580/%2F16J6KM5BSxCbJocJHcia_A)」文章，詳細內容請自行參閱。

Small batch 在訓練資料上會有較好的表現，較能讓參數繼續往 loss 的最小值靠近，這也說明 Gradient 較雜亂反而是有幫助的，你還記得嗎？更新參數時最害怕遇到的是，偏微分為零(也就是斜率為零的地方)，但是 loss 的數值卻不是全域最小值（Global minima），而是卡在一個較高的數值，這樣訓練出來的模型，產生的誤差就會非常地大。

![image](https://hackmd.io/_uploads/r1FXYAaN0.png)

### 2. Momentum
之前在講解更新參數的時候，使用到的其中一種優化方法叫做 Gradient descent，藉由計算該點的導數，再乘上一個超參數 η，即可往前更新一次；而 Gradient descent + Momentum 的目的是，為了預防卡在很平緩之曲線上的一個點，也就是斜率很小的地方，仍可以透過上一步的 Movement 幫助逃脫，因此這個方式同時考慮了兩個因素決定步伐方向及大小，一個是 Gradient，另一個是 Last movement。

下方用這兩個示意圖進行比較，也將如何更新參數的公式寫在左側，以利於閱讀時能夠交互比對，有助於理解。
    
![image](https://hackmd.io/_uploads/SkttyhA4A.png)
![image](https://hackmd.io/_uploads/Bkkp-2ANC.png)

### 3. Adaptive learning rate
不是所有使 loss 無法繼續下降的原因，都是 Critical point，有可能是接下來要介紹的內容。

從下圖可以看到，顏色愈接近紅色代表 loss 值越大，愈接近藍色代表 loss 值愈小，目標就是希望能夠不斷地更新參數到 loss 最小的位置，也就是標示為 x 的地方，左圖的 η 值較大，代表能夠走的步伐較大，右圖的 η 值較小，代表能夠走的步伐也就較小，兩者雖然都沒有遇到 critical point，卻發現更新到一定程度後就無法使 loss 下降，無法繼續往 x 前進，因此提出了 Adaptive learning rate 的方法，分別是 Root mean square、RMSProp 以及 Learning Rate Scheduling。

![image](https://hackmd.io/_uploads/ry-yWJkB0.png)

#### 3-a. Root mean square
從彩色圖中可以看到，將 w₂ 固定時，w₁ 方向較平緩，也就是藍線箭頭，因此在更新過程中，導數 g 的數值相當小，需要將 η 變大，以利於參數向前更新；同樣道理，將 w₁ 固定時，w₂ 方向較陡峭，也就是綠線箭頭，因此在更新過程中，導數 g 相當大，需要將 η 變小，以利於參數更新不會噴太遠。

因此需要針對每個參數方向，自動調整學習率大小，使得在梯度較大的方向學習率變小，避免震盪；在梯度較小的方向則保有足夠步伐，提升收斂效率。
    
![image](https://hackmd.io/_uploads/BkFYu11HC.png)

#### 3-b. RMSProp
與 3-a 不同之處在於，將 w₂ 固定時，w₁ 方向較平緩，也就是紅線箭頭，需要將 η 變大，而在上方將 w₂ 固定時，w₁ 方向較陡峭，也就是綠線箭頭，需要將 η 變小，在同一個方向卻有兩種不同的 η 值，因此在這裡特別設下一個超參數 λ（介於 0 跟 1 之間），可以自行決定前面 σ 重要還是當前的導數 g 重要。

![image](https://hackmd.io/_uploads/Sy_9uykH0.png)
    
:::info
Adagrad 使用了 Root Mean Square 的方法。
Adam 使用了 RMSProp + Momentum 的方法。
:::
#### 3-c. Learning Rate Scheduling
隨著時間改變 η 值之大小，這裡有兩種做法，第一個是 Learning rate decay，隨著時間愈長，逐漸訓練到 loss 較小的地方，η 值也會隨之愈來愈小；第二個是 Warm up，η 值先變大再變小，有利於解決在相當平緩的曲線上，為了使步伐跨大，σ 變小 g 前面的數值突然變很大，可能導致突然爆噴的狀況發生。

![image](https://hackmd.io/_uploads/Hy5TVHJrR.png)

### 綜合上述的優勢重新改寫更新參數的公式

![image](https://hackmd.io/_uploads/B1wfvHJH0.png)

## 總結，訓練卡住了不用害怕！
在一開始提到了讓訓練卡住不再讓 loss 繼續下降的原因，可能是 Critical point 或者是 η 值過於單一的關係，並提出解決方法，調整步伐方向、大小逃脫出 critical point 且讓 η 值能夠有所改變，也就能讓參數繼續更新，往 loss 更低處前進，正是這篇文章所想要傳達的知識。

---
:::info 
以上就是這篇文章「類神經網絡訓練不起來怎麼辦？- 1」的所有內容，第一次看的人會花比較多時間消化吸收，這是很正常的事情，若有任何問題，歡迎在下方與我聯繫、討論，接下來也會繼續分享相關文章，敬請期待。
