分層學習率 (Layer-wise Learning Rate)
為什麼需要分層學習率?
概念: 不同層使用不同的學習率
原因:
-
預訓練模型微調:前面的層已經學到很好的特徵,不應該大幅改動
-
不同層的重要性:越靠近輸出層,越需要針對任務調整
-
訓練穩定性:避免破壞底層的良好特徵
比喻:
想像一個熟練的廚師(預訓練模型):
- 基本刀工(前幾層):已經很熟練,只需微調 → 小學習率
- 調味技巧(中間層):需要適應新口味 → 中學習率
- 菜單設計(最後層):完全重新學習 → 大學習率
實作範例
範例 1:CNN 微調(如 GoogLeNet)
optimizer = optim.AdamW([
# 前面的卷積層(低階特徵)
{'params': model.conv1.parameters(),
'lr': 1e-5, 'weight_decay': 1e-4},
{'params': model.conv2.parameters(),
'lr': 1e-5, 'weight_decay': 1e-4},
# 中間的 Inception 層(中階特徵)
{'params': model.inception3a.parameters(),
'lr': 5e-5, 'weight_decay': 5e-4},
{'params': model.inception3b.parameters(),
'lr': 5e-5, 'weight_decay': 5e-4},
# 後面的 Inception 層(高階特徵)
{'params': model.inception5a.parameters(),
'lr': 1e-4, 'weight_decay': 1e-3},
{'params': model.inception5b.parameters(),
'lr': 1e-4, 'weight_decay': 1e-3},
# 分類層(任務相關)
{'params': model.fc.parameters(),
'lr': 1e-3, 'weight_decay': 1e-2}
])
範例 2:簡化版(3 組)
optimizer = optim.AdamW([
# 組 1:底層特徵(凍結或微調)
{'params': [
*model.layer1.parameters(),
*model.layer2.parameters()
], 'lr': 1e-5, 'weight_decay': 1e-4},
# 組 2:中層特徵
{'params': [
*model.layer3.parameters(),
*model.layer4.parameters()
], 'lr': 1e-4, 'weight_decay': 5e-4},
# 組 3:分類層
{'params': model.fc.parameters(),
'lr': 1e-3, 'weight_decay': 1e-2}
])
設定原則
學習率梯度:
層級 學習率 倍數關係
─────────────────────────────────
Input Layer 1e-6 ×1
Layer 1-2 1e-5 ×10
Layer 3-4 5e-5 ×50
Layer 5-6 1e-4 ×100
Layer 7-8 5e-4 ×500
Output Layer 1e-3 ×1000
經驗法則:
-
底層 → 頂層:學習率逐漸增大(通常 10 倍關係)
-
預訓練模型:底層 1e-6 ~ 1e-5,頂層 1e-3 ~ 1e-2
-
從零訓練:各層學習率差異不要太大(3-5 倍即可)
權重衰減梯度:
層級 Weight Decay
─────────────────────────────
Input Layer 1e-5 (輕)
Middle Layer 1e-4 (中)
Output Layer 1e-3 ~ 1e-2 (重)
相關筆記
- Learning Rate (學習率):基本概念
- AdamW(Adam with Weight Decay):微調預訓練模型時常搭配使用