19 - 乜嘢係「學習率衰減」(Learning-rate Decay)?
訓練神經網絡就似行山搵最低谷。• 開頭仲喺山腰 —— 可以大步扑落去,學習率 (lr) 大。• 愈近谷底 —— 要放慢腳步,否則一步跨過最低點,兜番轉頭又跌返出嚟。
「由大步轉細步」嘅節奏調整,就叫 學習率衰減。
🧠 點解要減 lr?
Mini-batch 梯度有雜訊,好似地面凹凸不平:
早期 路遠 → 大步快跑,加速收斂。
後期 靠近谷底 → 細步慢行,避免左右震盪。
最終 穩穩企正最低位,Loss 曲線平滑黐地。
🌍 生活化例子再多幾單
場景 | 學習率高 vs 低 |
煮湯 | 起鍋先用大火 (lr 大) 滾起,之後細火慢熬 (lr 小) 味道先入味 |
轉波車 | 起步要一檔轉數高;上到公路慢慢跳高檔,轉速 (lr) 自然落低 |
做 Gym | 準備期重量加得快;接近極限 PR,就每週只加 1–2.5 kg |
🧮 常見衰減公式
以下全部 formula 入面,t 可以係 step 或 epoch:
反比衰減 (Inverse Time)lr_t = lr₀ / (1 + k · t)初段落得快,愈後期愈平穩。
指數衰減 (Exponential)lr_t = lr₀ · γᵗ (γ 例:0.95)每個 epoch 乘同一比例,好似複利。
平方根衰減 (√)lr_t = lr₀ / √(1 + t)比反比再慢啲,保留探索力。
階段式衰減 (Step)lr_t = lr₀ · γ^{⌊t / m⌋}每隔 m 個 epoch 才突然跳落一級,類似「換鞋」。
餘弦退火 (Cosine Annealing)lr_t = lr_min + ½ (lr_max - lr_min) (1 + cos(π t / T))先快後慢再收尾,曲線似滑水。
循環式 (Cyclical LR / One-Cycle)先升後降,配合大 batch 可加速收斂兼做正則化。
🔧 超參數點揀?
起始 lr (lr₀)• 用網上同架構常見值先試;• 如果爆 Loss→ /10。
decay 速度 (k, γ)• 模型大 / 資料多 → 可以落慢啲;• 想快測試 → 落急啲。
最細 lr (lr_min)• 太細梯度近 0,會「學唔郁」;通常設成 lr₀/100 左右。
🛠️ PyTorch Scheduler 快用示例
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
# 1. Exponential
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.95)
# 2. Step
# scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.5)
# 3. Cosine
# scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=30, eta_min=1e-5)
for epoch in range(E):
train_one_epoch(...)
scheduler.step() # 每個 epoch call
⚠️ 常見誤區
跌得太快現象:頭幾 epoch Loss 仲高就停滯。解法:減慢 k 或 γ,或加 Warm-up 先細後大再細。
跌得太慢現象:後期 Loss 鋸齒唔收斂。解法:加大 decay 速度,或手動 early-stop 保存最佳權重。
同 BatchNorm 撞車BN 需要較大 lr 才有正則效果;若 lr 太細配 BN 可能過擬合,可加 Dropout/Weight Decay 補回。
💡 真實專案點用?
ImageNet CNN• 先 5 epoch linear warm-up 到 0.4,• 再用 Cosine 從 0.4 降到 1e-5,Top-1 提 1%。
BERT 微調• 3 epoch,StepLR 每 1 epoch /2;• 首 500 step warm-up;避免一開波毀語言知識。
GAN 生成藝術圖• Discriminator 用 Cyclical 0.0002↔0;• Generator 固定 0.0001;穩定對弈不 collapse。
強化學習 DQN• Episode 累積 reward 收斂後,再把 lr /10,逼近最優策略。
✅ 總結 — 攞走嘅三句說話
學習率大行快,細行穩。
Decay = 自動踩 Brake,由衝刺切換到慢慢入彎。
方法多,揀一種易 tune 先落手;warm-up + decay 幾乎百搭。
有咗學習率衰減,模型就好似司機識得減速入灣,滑過最後幾個彎都唔會甩尾,安安穩穩衝線!🏁