余弦退火重啟動(dòng)學(xué)習(xí)率機(jī)制
余弦退火重啟動(dòng)學(xué)習(xí)率機(jī)制
【導(dǎo)語】主要介紹在pytorch 中實(shí)現(xiàn)了余弦退火重啟動(dòng)學(xué)習(xí)率機(jī)制,支持 warmup 和 resume 訓(xùn)練。并且支持自定義下降函數(shù),實(shí)現(xiàn)多種重啟動(dòng)機(jī)制。
代碼:https://github.com/Huangdebo/CAWB
1. 多 step 重啟動(dòng)

設(shè)定 cawb_steps 之后,便可實(shí)現(xiàn)多步長(zhǎng)余弦退火重啟動(dòng)學(xué)習(xí)率機(jī)制。每次重啟動(dòng)時(shí),開始學(xué)習(xí)率會(huì)乘上一個(gè)比例因子 step_scale。調(diào)整 step_scale 和 epoch_scale 等參數(shù),可以實(shí)現(xiàn)學(xué)習(xí)率跳變的時(shí)候是上升還是下降。也可以調(diào)整中間的 step 不用走完一個(gè)退火過程,保持較高的學(xué)習(xí)率,實(shí)現(xiàn)更復(fù)雜的學(xué)習(xí)率變化機(jī)制。
2. 正常余弦退火機(jī)制

如果 cawb_steps 為 [], 則會(huì)實(shí)現(xiàn)正常的余弦退火機(jī)制,在整個(gè) epochs 中按設(shè)定的 lf 機(jī)制一直下降
3. warmup

設(shè)定 warmup_epoch 之后便可實(shí)現(xiàn)學(xué)習(xí)率的 warmup 機(jī)制。warmup_epoch 結(jié)束后則按設(shè)定的 cawb_steps 實(shí)現(xiàn)重啟動(dòng)退火機(jī)制。
4. resume

設(shè)定 last_epoch 便可實(shí)現(xiàn) resume 訓(xùn)練,接上之前中斷的訓(xùn)練中的學(xué)習(xí)率。
5. 自定義下降函數(shù)

可通過自定義下降函數(shù),實(shí)現(xiàn)多種重啟動(dòng)機(jī)制
# lf = lambda x, y=opt.epochs: (((1 + math.cos(x * math.pi / y)) / 2) ** 1.0) * 0.9 + 0.1
lf = lambda x, y=opt.epochs: (1.0 - (x / y)) * 0.8 + 0.2
scheduler = CosineAnnealingWarmbootingLR(optimizer, epochs=opt.epochs, step_scale=0.7,
steps=opt.cawb_steps, lf=lf, batchs=len(data), warmup_epoch=0)
6. 實(shí)驗(yàn)結(jié)果
本實(shí)驗(yàn)是在 COCO2017中隨機(jī)選出 10000 圖像和 1000 張圖像分別作為訓(xùn)練集和驗(yàn)證集。檢測(cè)網(wǎng)絡(luò)使用 yolov5s,學(xué)習(xí)率調(diào)整機(jī)制分別原版的 cos 和 本文實(shí)現(xiàn)的 CAWB。
6.1 學(xué)習(xí)率:
# yolov5
lf = lambda x: ((1 - math.cos(x * math.pi / steps)) / 2) * (y2 - y1) + y1
scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lf)
# 本文
lf = lambda x, y=opt.epochs: (((1 + math.cos(x * math.pi / y)) / 2) ** 1.0) * 0.65 + 0.35
scheduler = CosineAnnealingWarmbootingLR(optimizer, epochs=opt.epochs, steps=opt.cawb_steps, step_scale=0.7,
lf=lf, batchs=len(train_loader), warmup_epoch=3, epoch_scale=4.0)

6.2 map:
6.2.1 cos:

mAP_0.5 = 0.294; mAP_0.5:0.95 = 0.161
6.2.2 CAWB :

mAP_0.5 = 0.302; mAP_0.5:0.95 = 0.165
7. 結(jié)論
在實(shí)驗(yàn)中使用了 CAWB 學(xué)習(xí)率機(jī)制時(shí)候,mAP_0.5 和 mAP_0.5:0.95 都提升了一丟丟,而且上升趨勢(shì)更加明顯,增加 epochs 可能提升更大。
改變 CAWB 的參數(shù)可以實(shí)現(xiàn)更多形式的學(xué)習(xí)率變化機(jī)制。增加學(xué)習(xí)率突變就是想增加網(wǎng)絡(luò)跳出局部最優(yōu)的概率,所以不同數(shù)據(jù)集可能合適不同的變化機(jī)制。小伙伴們?cè)谄渌麛?shù)據(jù)集上嘗試之后,記得來提個(gè) issue 哈...
代碼:https://github.com/Huangdebo/CAWB
