## 兩個可能使類神經網絡訓練不起來的原因 ### 1. Gradient 太小 還記得之前的文章「[如何訓練出好模型呢?](https://hackmd.io/@lcaMuWOwR1Ox5o5yeTEupA/BkJ55L580/%2F16J6KM5BSxCbJocJHcia_A)」提到,更新參數主要是透過 Learning rate 還有 Loss function 的導數所決定,如果忘記的話,可以看到下方的圖片加以複習,那什麼時候讓 w 無法再繼續向右更新下去呢?沒錯,就是偏微分為零,也就是斜率為零的地方,稱為「Critical point」。  即使在 Critical point 上,也無法保證此點就是全域最小值(Global minima),有可能是局部最小值(Global minima)或者是鞍點(Saddle point),那如何判斷到底是哪一個呢? 首先要先了解什麼是鞍點(Saddel point),從下方最右邊的圖可以看到,對左右兩側來說中間的點屬於最小值,但在前後兩側來說屬於最大值,此即為鞍點,也可以用數學式 Tayler series approximation 得知,有興趣者可再自行研究。  :::info 在二維平面上,我們很難判斷出(局部)最小值與鞍點,更新參數過程中,害怕遇到的是(局部)最小值,導致 Gradient 為零,至於鞍點由於還能在其他方向上往更低點更新,因此其影響較小,但會不會在更高維的世界中,其實(局部)最小值其實根本就很少見呢? 答案是對的,遇到(局部)最小值的情況是非常少見的。 ::: ### 2. Error surface 非常不平緩 另外一種使訓練卡住的原因,就是 Learning rate(η),不是說 η 可以用來控制步伐大小,沒錯,但若 η 值太大或太小都會遇到問題。 從下圖可以看到,loss 已不再下降,但是 gradient 卻有時大有時小,這是因為跨越的步伐太大,導致參數無法向低谷前進,反倒像是在兩個山壁間徘徊震盪;反之,若跨越的步伐太小,即使更新次數非常多次,也會走得相當緩慢,以上正是問題所在之處。  ## 讓 Loss 繼續下降的三個方法 ### 1. Batch size 下方來自「[如何訓練出好模型呢?](https://hackmd.io/@lcaMuWOwR1Ox5o5yeTEupA/BkJ55L580/%2F16J6KM5BSxCbJocJHcia_A)」文章,詳細內容請自行參閱。 Small batch 在訓練資料上會有較好的表現,較能讓參數繼續往 loss 的最小值靠近,這也說明 Gradient 較雜亂反而是有幫助的,你還記得嗎?更新參數時最害怕遇到的是,偏微分為零(也就是斜率為零的地方),但是 loss 的數值卻不是全域最小值(Global minima),而是卡在一個較高的數值,這樣訓練出來的模型,產生的誤差就會非常地大。  ### 2. Momentum 之前在講解更新參數的時候,使用到的其中一種優化方法叫做 Gradient descent,藉由計算該點的導數,再乘上一個超參數 η,即可往前更新一次;而 Gradient descent + Momentum 的目的是,為了預防卡在很平緩之曲線上的一個點,也就是斜率很小的地方,仍可以透過上一步的 Movement 幫助逃脫,因此這個方式同時考慮了兩個因素決定步伐方向及大小,一個是 Gradient,另一個是 Last movement。 下方用這兩個示意圖進行比較,也將如何更新參數的公式寫在左側,以利於閱讀時能夠交互比對,有助於理解。   ### 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。  #### 3-a. Root mean square 從彩色圖中可以看到,將 w₂ 固定時,w₁ 方向較平緩,也就是藍線箭頭,因此在更新過程中,導數 g 的數值相當小,需要將 η 變大,以利於參數向前更新;同樣道理,將 w₁ 固定時,w₂ 方向較陡峭,也就是綠線箭頭,因此在更新過程中,導數 g 相當大,需要將 η 變小,以利於參數更新不會噴太遠。 因此需要針對每個參數方向,自動調整學習率大小,使得在梯度較大的方向學習率變小,避免震盪;在梯度較小的方向則保有足夠步伐,提升收斂效率。  #### 3-b. RMSProp 與 3-a 不同之處在於,將 w₂ 固定時,w₁ 方向較平緩,也就是紅線箭頭,需要將 η 變大,而在上方將 w₂ 固定時,w₁ 方向較陡峭,也就是綠線箭頭,需要將 η 變小,在同一個方向卻有兩種不同的 η 值,因此在這裡特別設下一個超參數 λ(介於 0 跟 1 之間),可以自行決定前面 σ 重要還是當前的導數 g 重要。  :::info Adagrad 使用了 Root Mean Square 的方法。 Adam 使用了 RMSProp + Momentum 的方法。 ::: #### 3-c. Learning Rate Scheduling 隨著時間改變 η 值之大小,這裡有兩種做法,第一個是 Learning rate decay,隨著時間愈長,逐漸訓練到 loss 較小的地方,η 值也會隨之愈來愈小;第二個是 Warm up,η 值先變大再變小,有利於解決在相當平緩的曲線上,為了使步伐跨大,σ 變小 g 前面的數值突然變很大,可能導致突然爆噴的狀況發生。  ### 綜合上述的優勢重新改寫更新參數的公式  ## 總結,訓練卡住了不用害怕! 在一開始提到了讓訓練卡住不再讓 loss 繼續下降的原因,可能是 Critical point 或者是 η 值過於單一的關係,並提出解決方法,調整步伐方向、大小逃脫出 critical point 且讓 η 值能夠有所改變,也就能讓參數繼續更新,往 loss 更低處前進,正是這篇文章所想要傳達的知識。 --- :::info 以上就是這篇文章「類神經網絡訓練不起來怎麼辦?- 1」的所有內容,第一次看的人會花比較多時間消化吸收,這是很正常的事情,若有任何問題,歡迎在下方與我聯繫、討論,接下來也會繼續分享相關文章,敬請期待。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up