學習率調整方法詳解
在深度學習訓練過程中,學習率(Learning Rate, LR) 是影響模型收斂速度和效果的關鍵超參數。學習率過大可能導致訓練不穩定、震蕩甚至無法收斂;學習率過小又會導致收斂過慢甚至陷入局部最優。因此,如何合理調整學習率,是模型優化中的核心問題。常見方法可以分為三類:有序調整、自適應調整、自定義調整。
一、有序調整(Scheduled Adjustment)
有序調整指在訓練過程中按照預先設定的規律逐步減少學習率,幫助模型更快收斂。
1. Step Decay(階梯式衰減)
思路:訓練到一定 epoch 后,將學習率按比例縮小。
公式:
η0:初始學習率
γ:衰減因子(通常取 0.1 或 0.5)
step:間隔的 epoch 數
特點:學習率呈“階梯”下降。適合在數據分布平穩、訓練較長的任務中使用。
2. Exponential Decay(指數衰減)
思路:學習率隨著 epoch 持續按指數縮小。
公式:
k 控制衰減速度
特點:下降平滑,但如果衰減過快,可能導致模型過早停止學習。
3. Cosine Annealing(余弦退火)
思路:學習率在訓練中呈“余弦曲線”變化,逐步減小但在末尾仍保持一定值。
特點:常用于 SGDR(Stochastic Gradient Descent with Restart),有助于跳出局部最優。
二、自適應調整(Adaptive Adjustment)
自適應方法會根據梯度的歷史信息,自動調整不同參數的學習率,減少人工設定難度。
1. Adagrad
思路:為每個參數維護一個累計梯度平方和,根據歷史更新情況自動縮小學習率。
優點:適合稀疏特征問題,如 NLP。
缺點:學習率會單調減小,可能過早停止學習。
2. RMSprop
思路:在 Adagrad 基礎上,引入 指數加權移動平均,避免學習率衰減過快。
特點:適合非凸優化問題,如 RNN 訓練。
3. Adam
思路:結合 Momentum + RMSprop,既考慮一階動量(梯度均值),又考慮二階動量(梯度方差)。
優點:收斂快,常作為默認選擇。
缺點:可能陷入鞍點或震蕩,需要調整 β 參數。
4. AdamW(權重衰減版)
改進 Adam 的 L2 正則化問題,更適合深度網絡和 Transformer 模型。
三、自定義調整(Custom Adjustment)
當任務復雜、對收斂要求特殊時,可以設計自定義學習率調整策略。
1. 手動函數定義
通過函數形式動態調整:
def lr_lambda(epoch):if epoch < 10:return 1.0elif epoch < 50:return 0.1else:return 0.01 scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda)
2. 基于性能的調整(Performance-based)
根據驗證集的 loss 或 accuracy 動態調整:
ReduceLROnPlateau:當指標在若干 epoch 內不再提升,自動降低學習率。
特點:更智能,常用于實際任務。
3. 自定義回調(Callback)
在 Keras、PyTorch Lightning 等框架中,可自定義回調函數,在訓練過程中動態控制學習率。
如:損失振蕩時降低,損失穩定時保持。
把各種 學習率調整方法的調用方式 全部整理出來,分別給出 PyTorch 和 Keras(TensorFlow) 兩種框架的示例。這樣可以一目了然,直接套用。
學習率調整調用方式匯總
一、有序調整(Scheduled Adjustment)
1. Step Decay(階梯衰減)
PyTorch
import torch import torch.optim as optimoptimizer = optim.SGD(model.parameters(), lr=0.1) scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)for epoch in range(100):train(...)scheduler.step()
Keras
from tensorflow.keras.optimizers import SGD from tensorflow.keras.callbacks import LearningRateSchedulerdef step_decay(epoch):initial_lr = 0.1drop = 0.1epochs_drop = 30return initial_lr * (drop ** (epoch // epochs_drop))optimizer = SGD(learning_rate=0.1) lr_scheduler = LearningRateScheduler(step_decay) model.fit(x_train, y_train, epochs=100, callbacks=[lr_scheduler])
2. Exponential Decay(指數衰減)
PyTorch
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.95)for epoch in range(100):train(...)scheduler.step()
Keras
import tensorflow as tfinitial_lr = 0.1 lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(initial_lr, decay_steps=100, decay_rate=0.96, staircase=True )optimizer = tf.keras.optimizers.SGD(learning_rate=lr_schedule) model.compile(optimizer=optimizer, loss="categorical_crossentropy")
3. Cosine Annealing(余弦退火)
PyTorch
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=50)for epoch in range(100):train(...)scheduler.step()
Keras
import tensorflow as tflr_schedule = tf.keras.optimizers.schedules.CosineDecay(initial_learning_rate=0.1, decay_steps=1000 )optimizer = tf.keras.optimizers.SGD(learning_rate=lr_schedule) model.compile(optimizer=optimizer, loss="categorical_crossentropy")
二、自適應調整(Adaptive Adjustment)
這些是 優化器自帶 的,不需要 scheduler。
PyTorch
import torch.optim as optim# Adagrad optimizer = optim.Adagrad(model.parameters(), lr=0.01)# RMSprop optimizer = optim.RMSprop(model.parameters(), lr=0.01)# Adam optimizer = optim.Adam(model.parameters(), lr=0.001)# AdamW optimizer = optim.AdamW(model.parameters(), lr=0.001)
Keras
from tensorflow.keras.optimizers import Adagrad, RMSprop, Adamoptimizer = Adagrad(learning_rate=0.01) optimizer = RMSprop(learning_rate=0.01) optimizer = Adam(learning_rate=0.001)
三、自定義調整(Custom Adjustment)
1. LambdaLR / 自定義函數
PyTorch
def lr_lambda(epoch):if epoch < 10:return 1.0elif epoch < 50:return 0.1else:return 0.01scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda)
Keras
from tensorflow.keras.callbacks import LearningRateSchedulerdef custom_schedule(epoch, lr):if epoch < 10:return lrelif epoch < 50:return lr * 0.1else:return lr * 0.01lr_scheduler = LearningRateScheduler(custom_schedule) model.fit(x_train, y_train, epochs=100, callbacks=[lr_scheduler])
2. ReduceLROnPlateau(性能驅動)
PyTorch
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=5 )for epoch in range(100):val_loss = validate(...)scheduler.step(val_loss)
Keras
from tensorflow.keras.callbacks import ReduceLROnPlateaureduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=5, min_lr=1e-6 )model.fit(x_train, y_train, epochs=100, validation_data=(x_val, y_val), callbacks=[reduce_lr])
3. Warmup + 余弦退火(常用于大模型訓練)
PyTorch (手動實現 Warmup + Cosine)
import mathdef warmup_cosine_lr(epoch, warmup_epochs=10, max_epochs=100, base_lr=0.1):if epoch < warmup_epochs:return epoch / warmup_epochselse:return 0.5 * (1 + math.cos(math.pi * (epoch - warmup_epochs) / (max_epochs - warmup_epochs)))scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=warmup_cosine_lr)
Keras
import tensorflow as tfclass WarmUpCosine(tf.keras.optimizers.schedules.LearningRateSchedule):def __init__(self, initial_lr, warmup_steps, decay_steps):super().__init__()self.initial_lr = initial_lrself.warmup_steps = warmup_stepsself.decay_steps = decay_stepsdef __call__(self, step):warmup_lr = self.initial_lr * (step / self.warmup_steps)cosine_lr = tf.keras.optimizers.schedules.CosineDecay(self.initial_lr, self.decay_steps)(step)return tf.cond(step < self.warmup_steps, lambda: warmup_lr, lambda: cosine_lr)lr_schedule = WarmUpCosine(initial_lr=0.1, warmup_steps=1000, decay_steps=10000) optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule)
? 這樣你就同時拿到了 PyTorch + Keras 下的所有調用方式,涵蓋了:
有序調整(Step, Exponential, Cosine)
自適應調整(Adagrad, RMSprop, Adam, AdamW)
自定義調整(Lambda、自寫函數、ReduceLROnPlateau、Warmup+Cosine)
四、方法比較
方法類型 | 優點 | 缺點 | 典型應用 |
---|---|---|---|
有序調整 | 簡單直觀,易控制 | 需要預先設定 schedule | CV、NLP 基礎訓練 |
自適應調整 | 自動調節參數,無需復雜調參 | 對超參數敏感,可能震蕩 | NLP、RNN、Transformer |
自定義調整 | 靈活,適應任務 | 實現復雜,需經驗 | 工業級任務、研究實驗 |
五、實踐建議
初學/基線實驗:推薦 Adam 或 AdamW,收斂快且穩定。
大規模訓練:結合 Cosine Annealing + Warmup 效果更佳。
模型表現停滯:使用 ReduceLROnPlateau 動態降低學習率。
科研/特殊任務:可嘗試自定義函數或回調。