iT邦幫忙

2021 iThome 鐵人賽

DAY 20
1
自我挑戰組

資料分析及AI深度學習-簡單基礎實作系列 第 20

DAY20:學習率(下)

  • 分享至 

  • xImage
  •  

學習率

  • 學習率為控制模型中梯度下降的速度,也有人稱為步長。
  • 公式:新權重 = 舊權重 - 學習率 * 梯度
  • learning rate的設置很重要,一般大家都依照經驗去設置初始learning rate,0.01-0.001,但這也沒有一定哪個比較好,都得去嘗試。
  • 當learning rate設置過小時,會導致模型學習收斂較慢,且容易過擬合。而設置過大時,會容易導致模型學習過快,無法收斂,容易震盪甚至發散。如下圖。圖片來源:https://gino6178.medium.com/%E6%A8%A1%E5%9E%8B%E5%A3%93%E7%B8%AE%E5%8F%8A%E5%84%AA%E5%8C%96-learning-rate-c340a0b940e4
    圖片來源:https://blog.csdn.net/u012526436/article/details/90486021

自定義學習率:LambdaLR

  • 自己定義學習率的調整,以官網範例示範。

    optimizer = optim.SGD(params = model.parameters(), lr=0.05)
    lambda1 = lambda epoch:epoch // 10 
    lambda2 = lambda epoch:0.95 ** epoch 
    scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])
    
    • optimizer:選擇搭配的優化器。
    • lr_lambda:自定義的學習率函數。
    • last_epoch:設置到哪個epoch就不再調整,預設為-1,到最後個epoch才會從初始學習率開始。

    發現會報錯,如下圖。

    他只需要一個lambda函數。於是我們將其拆開看。

  • 用lambda1去嘗試。

    scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda1)
    


    圖片來源:https://www.shuzhiduo.com/A/kPzO4am3Jx/

  • 用lambda2去嘗試。

    scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda2)
    


    圖片來源:https://www.shuzhiduo.com/A/kPzO4am3Jx/

  • 我們也可以嘗試自己去定義調整學習率的函數。


自定義學習率:MultiplicativeLR

  • 與lambdaLR相似,差別在於lambdaLR是用初始學習率去乘lambda函數,而MultiplicativeLR是用前一個epoch的lr去乘上lambda函數去調整lr。

CyclicLR

  • 與學習率衰減和固定學習率不同,他是有週期性的調整學習率,我個人認為有點類似CosineAnnealingLR和CosineAnnealingWarmRestarts都是一個週期就回到初始值再繼續衰減,後又升起到初始值。
    torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr, max_lr, step_size_up=2000, step_size_down=None, mode='triangular', gamma=1.0, scale_fn=None, scale_mode='cycle', cycle_momentum=True, base_momentum=0.8, max_momentum=0.9, last_epoch=-1, verbose=False)
    
    • optimizer:選擇搭配的優化器。
    • base_lr:初始學習率。
    • max_lr:每個循環週期的最大學習率。
    • step_size_up:在增加的半個週期中所要迭代的次數,預設2000次。
    • step_size_down:在下降的半個週期中所要迭代的次數,預設None。
    • mode:週期的模式。三種模式:triangular, triangular2, exp_range。
    • gamma:exp_range中的常量gamma**(cycle iterations)
      詳細可參考:https://blog.csdn.net/zisuina_2/article/details/103236864

鞍點(Saddle Points)

  • 當我們在訓練的過程中,在梯度為0時,不一定是最佳解也不一定是最大值,梯度會保持在一個最小值,導致訓練非常緩慢停滯不前,那就是卡在了鞍點(Saddle Points)。
      
      圖片來源:https://www.twblogs.net/a/5c245d4ebd9eee16b4a7d124

  • 如何解決鞍點這個問題,我們需要利用優化器搭配好的學習率,才能解決停滯在鞍點的問題。


今日小結

  • 學習率衰減的方式有很多種,我個人比較常用CosineAnnealingLR,他帶有週期循環的學習率,較不易有卡在鞍點的機會發生。

  • 學習率要搭配優化器做梯度下降,試圖找到全局最佳解,但往往沒有那麼容易,明天跟大家介紹優化器的比較。


上一篇
DAY19:學習率(上)
下一篇
DAY21:優化器(上)
系列文
資料分析及AI深度學習-簡單基礎實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言