:::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」的所有內容,第一次看的人會花比較多時間消化吸收,這是很正常的事情,若有任何問題,歡迎在下方與我聯繫、討論,接下來也會繼續分享相關文章,敬請期待。