---
# System prepended metadata

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

---

:::info
「類神經網絡訓練不起來怎麼辦？- 1」的文章告一個段落，這裡會接續介紹幾個相關的例子。
:::
## 讓 loss 能繼續下降(參數更新)的方法
### 1. Batch size
### 2. Momentum
### 3. Adaptive learning rate
### 4. 挑選適當的 Loss function
這裡舉一個簡單的分類(Classification)任務作為例子。

在分類問題中，假設有三個類別分別是1、2、3，對應到的分別是汽車、機車、腳踏車三個交通工具，只要是汽車就丟到類別 1，機車為類別 2，腳踏車為類別 3，但是這會有一個問題，思考一下 1、2、3 是不是有先後順序的關係，也就代表說 1、2 比起 1、3 關係較相近，很顯然，當然希望能避免掉此種不必要的關係，因此在分類時常使用 one-hot encoding 的方法。

![image](https://hackmd.io/_uploads/H1i-iXxH0.png =50%x)

以下圖示為分類任務中操作的流程圖，將輸入 x 丟給機器(模型)，經過多層 Network 的處理及運算，得到 y 的值，再丟入 softmax 中將 y 值限制在 0 ~ 1 範圍內，得到 y'，最後計算機器預測值 y' 與實際值 ŷ (標準答案)的落差，也就是計算 loss function 的數值。

![image](https://hackmd.io/_uploads/Sk-tjXlBC.png)

那如何挑選 Loss function 呢？有那麼多的種類，這裡先說結論，在分類任務中，較常使用的 Loss function 就是 Cross-entropy，另外也可以從實驗數據中得知，若使用 MSE，有可能會卡在非常平緩的區域，那不是教過如何逃脫平緩區域的方法嗎？是的，但那是在真的不得已遇到的狀況下才使用，因為會使得處理過程變複雜；反倒挑選到合適的 Loss function，即可讓 loss 順利地下降。

眼尖的人有沒有注意到，下方圖示中只有 y₁ 與 y₂ 兩個數值，這是因為y₃ 經過 softmax 後的值非常接近於零，因此則可忽略其對 loss 的影響。

![image](https://hackmd.io/_uploads/B19oy4erA.png =50%x)![image](https://hackmd.io/_uploads/HkLpkVxrC.png =50%x)

### 5. Batch normalization
看到 Batch normalization 還不熟悉沒關係，但是下方的圖示應該能勾起一點印象，沒錯也就是在 Adaptive learning rate 有介紹過，可以藉由控制步伐大小來成功地更新參數，那有沒有辦法直接改變這個相當崎嶇的表面呢？在這裡就是要直接把山夷平，也就是要讓下方的左圖變成右圖。

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

在此之前，必須先了解是什麼原因造就了左圖，思考一下，在更新參數的過程中，假設先固定 w₂，當 w₁ 向前更新一步，也就是下方的第一個算法，由於輸入 x₁ 相當小，即使乘上了經過更新後的 w₁，也僅能小小地改變 y 值，小小地改變 e 值，小小地改變 Loss 值，這也說明為什麼固定 w₂ 向 w₁ 方向更新時，Loss 會改變如此平緩的原因；反之，先固定 w₁，當 w₂ 向前更新一步，也就是第二個算法，由於輸入 x₂ 相當大，乘上了經過更新後的 w₂，能大大地改變 y 值，大大地改變 e 值，大大地改變 Loss 值，這也說明為什麼固定 w₁ 向 w₂ 方向更新時，Loss 會改變如此劇烈的原因。

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

了解完後，發現原因在於輸入值過於懸殊，因此必須將所有的輸入都能夠限制在某一個範圍之中，直覺想到的方式，就是「標準化」的動作，先選擇其中一個 dimension i（綠色框框標記處），再計算此 dimension i 的平均值與標準差，並將各個 x 值標準化，使得更新後的新數值計算新平均值 = 0、新標準差 = 1，稱為 Feature normalizaiton。

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

講完了 Feature normalization，就要進入正題 Batch normalization，其概念相當好理解，也就是先經過 Feature normalization 後，丟到矩陣 W¹ 中得到 z¹, z², z³，再計算三者的平均值與標準差，也同樣地做一次標準化，這裡可以發現到，原先 Feature normalizaiton 都是做個別的運算彼此互不相干，但是當 z¹ 有所改變時，也會連動地改變平均值、標準差以及後面產生的所有數值，此即為考慮一個 Batch 的資料後進行 normaliztion 的處理，因此稱為 Batch normaliztion。

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

:::info
在 Batch normalizaiton 用於測試（testing）時，上述所講到的都還是在訓練（training）階段，在測試時並沒有一組一組的資料讓你計算平均值與標準差，因此會使用到 Moving average 的技巧，在訓練過程中，batch 1 的平均值、batch 2 的平均值等拿來計算 Moving average，還有一個超參數 p 常設定為 0.1，詳細作法可參考下圖。

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

## 總結，訓練卡住了不用害怕！
以上，講到了另外兩種解決訓練卡住時的方法，分別是 Loss function 以及 Batch normalzation，挑選適合任務的誤差函數將有助於參數的更新，另外將輸入值標準化，讓其彼此間差距不要過大，能解決 Loss 表面崎嶇不平的問題。

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