學習率衰減策略是深度學習優化過程中的一個關鍵因素,它決定了訓練過程中學習率的調整方式,從而影響模型收斂的速度和效果。不同的衰減策略在不同的任務和模型上可能有不同的表現,下面從我用到過的幾個衰減策略進行記錄,后續慢慢跟進。
為什么需要學習率衰減?
在訓練深度學習模型時,學習率的選擇至關重要。通常,我們希望模型能夠在訓練的早期階段較快地收斂(即較大的學習率),而在訓練的后期階段逐漸減小學習率,以便模型能夠更精細地調整參數,避免錯過局部最優點。
階梯衰減Step Decay
這是最簡單常用的學習率調整方法,每過step_size輪,將此前的學習率乘以gamma。
torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
余弦退火調整學習率 CosineAnnealingLR
在每個周期內,學習率從初始學習率(lr0
)開始,經過余弦函數的逐漸衰減,最后衰減到最小學習率(eta_min
)。
torch.optim.lr_scheduler.CosineAnnealingLR(
optimizer,
T_max,
eta_min=0,
last_epoch=-1)
T_max:指定一個完整的周期(例如,多少個訓練步長或 epoch)。在 T_max
的周期內,學習率會從初始學習率衰減到 eta_min
。
eta_min=0:最終學習率
last_epoch=-1:指定上次訓練的最后一個epoch,-1就是從頭開始訓練
余弦退火重啟學習率 CosineAnnealingWarmRestarts
CosineAnnealingWarmRestarts
通過將學習率沿著一個余弦曲線逐漸衰減到最小值(eta_min
),然后在周期結束時重啟并回升到初始學習率(lr0
),這種周期性的重啟和余弦退火幫助模型在每個階段進行不同范圍的探索,避免陷入局部最優。
scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(
optimizer,
T_0,
T_mult=1,
eta_min=0,
last_epoch=- 1,
verbose=False)
T_0:第一個周期的長度,后續的長度基于T0和T_mult調整
T_mult:控制后續周期的長度,例如設置為2,那則第二個周期長度會是第一個周期的2倍,第三個周期的長度會是第二個周期的2倍,設置為1則每個周期一樣長。
eta_min:這是學習率的最小值。在每個周期中,學習率會從 eta_max
(初始學習率)衰減到 eta_min
,然后在每個周期結束時重新回升到初始學習率。
verbose:如果設置為 True
,則每次學習率重啟時,調度器會輸出日志信息,顯示學習率調整的情況。例如,輸出每次重啟時的學習率和當前的訓練狀態。
線性衰減 Linear Decay
在線性衰減中,學習率隨著訓練的進展而線性地減小。學習率的減少是均勻的,每個時間步減少固定的量,直到達到預定的最小值
torch.optim.lr_scheduler.LinearLR(
optimizer,
start_factor=1,
end_factor=0.1,
total_iters=80)
LinearLR是線性學習率,給定起始factor和最終的factor,LinearLR會在中間階段做線性插值,比如學習率為0.1,起始factor為1,最終的factor為0.1,那么第0次迭代,學習率將為0.1,最終輪學習率為0.01。下面設置的總輪數total_iters為80,所以超過80時,學習率恒為0.01。
指數衰減 Exponential Decay
學習率初期迅速下降,適合早期跳出局部最優,但可能導致后期過早收斂,適合大規模訓練任務或對收斂速度有要求的情況。
torch.optim.lr_scheduler.ExponentialLR(
optimizer,
gamma=0.9)
ExponentialLR是指數型下降的學習率調節器,每一輪會將學習率乘以gamma,所以這里千萬注意gamma不要設置的太小,不然幾輪之后學習率就會降到0。