PyTorch學(xué)習(xí)率調(diào)整策略通過torch.optim.lr_scheduler接口實(shí)現(xiàn)攒发。PyTorch提供的學(xué)習(xí)率調(diào)整策略分為三大類产舞,分別是
a. 有序調(diào)整:等間隔調(diào)整(Step)晤揣,按需調(diào)整學(xué)習(xí)率(MultiStep)没酣,指數(shù)衰減調(diào)整(Exponential)和 余弦退火CosineAnnealing。
b. 自適應(yīng)調(diào)整:自適應(yīng)調(diào)整學(xué)習(xí)率 ReduceLROnPlateau棉安。
c. 自定義調(diào)整:自定義調(diào)整學(xué)習(xí)率 LambdaLR媳维。
1 等間隔調(diào)整學(xué)習(xí)率 StepLR
等間隔調(diào)整學(xué)習(xí)率酿雪,調(diào)整倍數(shù)為 gamma 倍,調(diào)整間隔為 step_size侄刽。間隔單位是step指黎。需要注意的是, step 通常是指 epoch唠梨,不要弄成 iteration 了袋励。
torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)
參數(shù):
- step_size(int)- 學(xué)習(xí)率下降間隔數(shù)侥啤,若為 30当叭,則會(huì)在 30、 60盖灸、 90…個(gè) step 時(shí)蚁鳖,將學(xué)習(xí)率調(diào)整為 lr*gamma。
- gamma(float)- 學(xué)習(xí)率調(diào)整倍數(shù)赁炎,默認(rèn)為 0.1 倍醉箕,即下降 10 倍。
- last_epoch(int)- 上一個(gè) epoch 數(shù)徙垫,這個(gè)變量用來(lái)指示學(xué)習(xí)率是否需要調(diào)整讥裤。當(dāng)last_epoch 符合設(shè)定的間隔時(shí),就會(huì)對(duì)學(xué)習(xí)率進(jìn)行調(diào)整姻报。當(dāng)為-1 時(shí)己英,學(xué)習(xí)率設(shè)置為初始值。
2 按需調(diào)整學(xué)習(xí)率 MultiStepLR
按設(shè)定的間隔調(diào)整學(xué)習(xí)率吴旋。這個(gè)方法適合后期調(diào)試使用损肛,觀察 loss 曲線,為每個(gè)實(shí)驗(yàn)定制學(xué)習(xí)率調(diào)整時(shí)機(jī)荣瑟。
torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)
參數(shù):
- milestones(list)- 一個(gè) list治拿,每一個(gè)元素代表何時(shí)調(diào)整學(xué)習(xí)率, list 元素必須是遞增的笆焰。如 milestones=[30,80,120]
- gamma(float)- 學(xué)習(xí)率調(diào)整倍數(shù)劫谅,默認(rèn)為 0.1 倍,即下降 10 倍。
3 指數(shù)衰減調(diào)整學(xué)習(xí)率 ExponentialLR
按指數(shù)衰減調(diào)整學(xué)習(xí)率同波,調(diào)整公式: lr=lr?gamma??epoch lr = lr * gamma**epochlr=lr?gamma??epoch
torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1)
參數(shù):
- gamma- 學(xué)習(xí)率調(diào)整倍數(shù)的底鳄梅,指數(shù)為 epoch,即 gamma**epoch
4 余弦退火調(diào)整學(xué)習(xí)率 CosineAnnealingLR
以余弦函數(shù)為周期未檩,并在每個(gè)周期最大值時(shí)重新設(shè)置學(xué)習(xí)率戴尸。以初始學(xué)習(xí)率為最大學(xué)習(xí)率,以 2?Tmax 2*Tmax2?Tmax 為周期冤狡,在一個(gè)周期內(nèi)先下降孙蒙,后上升。
torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)
參數(shù):
- T_max(int)- 一次學(xué)習(xí)率周期的迭代次數(shù)悲雳,即 T_max 個(gè) epoch 之后重新設(shè)置學(xué)習(xí)率挎峦。
- eta_min(float)- 最小學(xué)習(xí)率,即在一個(gè)周期中合瓢,學(xué)習(xí)率最小會(huì)下降到 eta_min坦胶,默認(rèn)值為 0。
5 自適應(yīng)調(diào)整學(xué)習(xí)率 ReduceLROnPlateau
當(dāng)某指標(biāo)不再變化(下降或升高)晴楔,調(diào)整學(xué)習(xí)率顿苇,這是非常實(shí)用的學(xué)習(xí)率調(diào)整策略。
例如税弃,當(dāng)驗(yàn)證集的 loss 不再下降時(shí)纪岁,進(jìn)行學(xué)習(xí)率調(diào)整;或者監(jiān)測(cè)驗(yàn)證集的 accuracy则果,當(dāng)accuracy 不再上升時(shí)幔翰,則調(diào)整學(xué)習(xí)率。
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)
參數(shù):
- mode(str)- 模式選擇西壮,有 min 和 max 兩種模式遗增, min 表示當(dāng)指標(biāo)不再降低(如監(jiān)測(cè)loss), max 表示當(dāng)指標(biāo)不再升高(如監(jiān)測(cè) accuracy)款青。
- factor(float)- 學(xué)習(xí)率調(diào)整倍數(shù)(等同于其它方法的 gamma)做修,即學(xué)習(xí)率更新為 lr = lr * factor
patience(int)- 忍受該指標(biāo)多少個(gè) step 不變化,當(dāng)忍無(wú)可忍時(shí)可都,調(diào)整學(xué)習(xí)率缓待。 - verbose(bool)- 是否打印學(xué)習(xí)率信息, print(‘Epoch {:5d}: reducing learning rate of group {} to {:.4e}.’.format(epoch, i, new_lr))
- threshold_mode(str)- 選擇判斷指標(biāo)是否達(dá)最優(yōu)的模式渠牲,有兩種模式旋炒, rel 和 abs。
當(dāng) threshold_mode == rel签杈,并且 mode == max 時(shí)瘫镇, dynamic_threshold = best * ( 1 +threshold )鼎兽;
當(dāng) threshold_mode == rel,并且 mode == min 時(shí)铣除, dynamic_threshold = best * ( 1 -threshold )谚咬;
當(dāng) threshold_mode == abs,并且 mode== max 時(shí)尚粘, dynamic_threshold = best + threshold 择卦;
當(dāng) threshold_mode == rel,并且 mode == max 時(shí)郎嫁, dynamic_threshold = best - threshold秉继; - threshold(float)- 配合 threshold_mode 使用。
- cooldown(int)- “冷卻時(shí)間“泽铛,當(dāng)調(diào)整學(xué)習(xí)率之后尚辑,讓學(xué)習(xí)率調(diào)整策略冷靜一下,讓模型再訓(xùn)練一段時(shí)間盔腔,再重啟監(jiān)測(cè)模式杠茬。
- min_lr(float or list)- 學(xué)習(xí)率下限,可為 float弛随,或者 list瓢喉,當(dāng)有多個(gè)參數(shù)組時(shí),可用 list 進(jìn)行設(shè)置撵幽。
eps(float)- 學(xué)習(xí)率衰減的最小值灯荧,當(dāng)學(xué)習(xí)率變化小于 eps 時(shí)礁击,則不調(diào)整學(xué)習(xí)率盐杂。
6 自定義調(diào)整學(xué)習(xí)率 LambdaLR
為不同參數(shù)組設(shè)定不同學(xué)習(xí)率調(diào)整策略。調(diào)整規(guī)則為哆窿,
lr=base_lr?lmbda(self.last_epoch) lr = base\_lr *lmbda(self.last\_epoch)
lr=base_lr?lmbda(self.last_epoch)
fine-tune 中十分有用链烈,我們不僅可為不同的層設(shè)定不同的學(xué)習(xí)率,還可以為其設(shè)定不同的學(xué)習(xí)率調(diào)整策略挚躯。
torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)