自己定義學習率的調整,以官網範例示範。
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])
發現會報錯,如下圖。
他只需要一個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/
我們也可以嘗試自己去定義調整學習率的函數。
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)
當我們在訓練的過程中,在梯度為0時,不一定是最佳解也不一定是最大值,梯度會保持在一個最小值,導致訓練非常緩慢停滯不前,那就是卡在了鞍點(Saddle Points)。
圖片來源:https://www.twblogs.net/a/5c245d4ebd9eee16b4a7d124
如何解決鞍點這個問題,我們需要利用優化器搭配好的學習率,才能解決停滯在鞍點的問題。
學習率衰減的方式有很多種,我個人比較常用CosineAnnealingLR,他帶有週期循環的學習率,較不易有卡在鞍點的機會發生。
學習率要搭配優化器做梯度下降,試圖找到全局最佳解,但往往沒有那麼容易,明天跟大家介紹優化器的比較。