在使用bert或者其它預訓練模型進行微調,下接其它具體任務相關的模組時,會面臨這樣乙個問題,bert由於已經進行了預訓練,引數已經達到了乙個較好的水平,如果要保持其不會降低,學習率就不能太大,而下接結構是從零開始訓練,用小的學習率訓練不僅學習慢,而且也很難與bert本體訓練同步。因此在訓練時候就需要對預訓練層設定較小學習率,對下接層設定較大學習率。下面一pytorch框架簡單介紹其方法。
首先獲取模型每層資訊的的方法如下:
for n,p in model.named_parameters()
n是模型每層名字,p是每層引數,model是模型名字。
首先我們需要對引數進行分組:
optimizer_grouped_parameters = [\
,\], 'lr = 2e-3}]
然後如下構建優化器則可:
optimizer = adamw(optimizer_grouped_parameters,lr=config.learning_rate, eps=config.adam_epsilon)
如果group列表某』params』組裡面設定了學習率則使用區域性學習率,否則使用optimizer裡的全域性學習率。
在訓練模型的時候,通常會遇到這種情況:我們平衡模型的訓練速度和損失(loss)後選擇了相對合適的學習率(learning rate),但是訓練集的損失下降到一定的程度後就不再下降了,遇到這種情況通常可以通過適當降低學習率(learning rate)來實現。下面介紹一種學習率衰減的方法。
每次迭代到一定輪次時候直接修改模型引數的學習率,**如下:
for epoch in range(50):
if epoch % 5 == 0:
for p in optimizer.param_groups:#更新每個group裡的引數lr
p['lr'] *= 0.9
使用自己定義的函式lambda函式來進行lr計算,lambda函式只接受epoch乙個引數,如下:
import numpy as np
my_lambda = lambda epoch:np.sin(epoch) / epoch
scheduler = torch.optim.lr_scheduler.lambdalr(optimizer,lr_lambda = my_lambda)
...scheduler.step()
注:scheduler.step()要在optimizer.step()之後
每step_size的epoch,lr會自動乘以gamma進行階梯式衰減。
scheduler = torch.optim.lr_scheduler.steplr(optimizer, step_size, gamma=0.1, last_epoch=-1)
該衰減為三段式,milestones確定兩個閾值,epoch進入milestones範圍內即乘以gamma,離開milestones範圍之後再乘以gamma。
scheduler = torch.optim.lr_scheduler.multisteplr(optimizer,milestones=[20,80],gamma = 0.9)
每個epoch都乘以gamma。
scheduler = torch.optim.lr_scheduler.exponentiallr(optimizer, gamma=0.9)
在發現loss不再降低或者acc不再提高之後,降低學習率。
scheduler = torch.optim.lr_scheduler.reducelronplateau(optimizer, mode='min', factor=0.1, patience=10, verbose=false, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)
各引數意義如下:
mode:'min』模式檢測metric是否不再減小,'max』模式檢測metric是否不再增大;
factor: 觸發條件後lr*=factor;
patience:不再減小(或增大)的累計次數;
verbose:觸發條件後print;
threshold:只關注超過閾值的顯著變化;
threshold_mode:有rel和abs兩種閾值計算模式,rel規則:max模式下如果超過best(1+threshold)為顯著,min模式下如果低於best(1-threshold)為顯著;abs規則:max模式下如果超過best+threshold為顯著,min模式下如果低於best-threshold為顯著;
cooldown:觸發一次條件後,等待一定epoch再進行檢測,避免lr下降過速;
min_lr:最小的允許lr;
eps:如果新舊lr之間的差異小與1e-8,則忽略此次更新。
參考資料:
學習率衰減
在訓練深度神經網路時,通常會隨著訓練的進行降低學習率。這可以通過使用預定義的學習率計畫或自適應學習率方法來完成。學習率表 學習率時間表旨在根據預先定義的時間表降低學習率,從而在訓練過程中調整學習率。常見的學習率時間表包括基於時間的衰減,逐步衰減和指數衰減。什麼是學習率?使用隨機梯度下降演算法訓練深度...
學習率衰減 Learning Rate Decay
以目前最主流的引數優化演算法gradient descent為例,為了讓梯度下降的效能更優,我們需要將學習率設定在乙個合適的範圍。具體來說,學習率其實就是演算法的步長,一步走多少決定了很多事情 步子大了,優化效率高,很可能一下越過最優解 相反,步子小了,優化效率低,很可能陷進乙個區域性最優解怎麼都走...
筆記 學習率衰減
加快學習的乙個辦法就是學習率衰減。假設你要使用 mini batch 梯度下降法,mini batch 數量不大,大概 64 或者 128 個樣本,在迭代過程中會有噪音,下降朝向這裡的最小值,但是不會精確地收斂,所以你的演算法最後在附近擺動,並不會真正收斂,因為你用的學習率是固定值,不同的 mini...