一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - pytorch中Schedule與warmup_steps的用法說(shuō)明

pytorch中Schedule與warmup_steps的用法說(shuō)明

2021-11-11 10:22Bingoyear Python

這篇文章主要介紹了pytorch中Schedule與warmup_steps的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1. lr_scheduler相關(guān)

?
1
lr_scheduler = WarmupLinearSchedule(optimizer, warmup_steps=args.warmup_steps, t_total=num_train_optimization_steps)

其中args.warmup_steps可以認(rèn)為是耐心系數(shù)

num_train_optimization_steps為模型參數(shù)的總更新次數(shù)

一般來(lái)說(shuō):

?
1
num_train_optimization_steps = int(total_train_examples / args.train_batch_size / args.gradient_accumulation_steps)

Schedule用來(lái)調(diào)節(jié)學(xué)習(xí)率,拿線性變換調(diào)整來(lái)說(shuō),下面代碼中,step是當(dāng)前迭代次數(shù)。

?
1
2
3
4
5
6
def lr_lambda(self, step):
    # 線性變換,返回的是某個(gè)數(shù)值x,然后返回到類LambdaLR中,最終返回old_lr*x
    if step < self.warmup_steps: # 增大學(xué)習(xí)率
        return float(step) / float(max(1, self.warmup_steps))
    # 減小學(xué)習(xí)率
    return max(0.0, float(self.t_total - step) / float(max(1.0, self.t_total - self.warmup_steps)))

在實(shí)際運(yùn)行中,lr_scheduler.step()先將lr初始化為0. 在第一次參數(shù)更新時(shí),此時(shí)step=1,lr由0變?yōu)槌跏贾礽nitial_lr;在第二次更新時(shí),step=2,上面代碼中生成某個(gè)實(shí)數(shù)alpha,新的lr=initial_lr *alpha;在第三次更新時(shí),新的lr是在initial_lr基礎(chǔ)上生成,即新的lr=initial_lr *alpha。

其中warmup_steps可以認(rèn)為是lr調(diào)整的耐心系數(shù)。

由于有warmup_steps存在,lr先慢慢增加,超過(guò)warmup_steps時(shí),lr再慢慢減小。

在實(shí)際中,由于訓(xùn)練剛開(kāi)始時(shí),訓(xùn)練數(shù)據(jù)計(jì)算出的grad可能與期望方向相反,所以此時(shí)采用較小的lr,隨著迭代次數(shù)增加,lr線性增大,增長(zhǎng)率為1/warmup_steps;迭代次數(shù)等于warmup_steps時(shí),學(xué)習(xí)率為初始設(shè)定的學(xué)習(xí)率;迭代次數(shù)超過(guò)warmup_steps時(shí),學(xué)習(xí)率逐步衰減,衰減率為1/(total-warmup_steps),再進(jìn)行微調(diào)。

2. gradient_accumulation_steps相關(guān)

gradient_accumulation_steps通過(guò)累計(jì)梯度來(lái)解決本地顯存不足問(wèn)題。

假設(shè)原來(lái)的batch_size=6,樣本總量為24,gradient_accumulation_steps=2

那么參數(shù)更新次數(shù)=24/6=4

現(xiàn)在,減小batch_size=6/2=3,參數(shù)更新次數(shù)不變=24/3/2=4

在梯度反傳時(shí),每gradient_accumulation_steps次進(jìn)行一次梯度更新,之前照常利用loss.backward()計(jì)算梯度。

補(bǔ)充:pytorch學(xué)習(xí)筆記 -optimizer.step()和scheduler.step()

optimizer.step()和scheduler.step()的區(qū)別

optimizer.step()通常用在每個(gè)mini-batch之中,而scheduler.step()通常用在epoch里面,但是不絕對(duì),可以根據(jù)具體的需求來(lái)做。只有用了optimizer.step(),模型才會(huì)更新,而scheduler.step()是對(duì)lr進(jìn)行調(diào)整。

通常我們有

?
1
2
3
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum = 0.9)
scheduler = lr_scheduler.StepLR(optimizer, step_size = 100, gamma = 0.1)
model = net.train(model, loss_function, optimizer, scheduler, num_epochs = 100)

在scheduler的step_size表示scheduler.step()每調(diào)用step_size次,對(duì)應(yīng)的學(xué)習(xí)率就會(huì)按照策略調(diào)整一次。

所以如果scheduler.step()是放在mini-batch里面,那么step_size指的是經(jīng)過(guò)這么多次迭代,學(xué)習(xí)率改變一次。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/angel_hben/article/details/104538634

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 涩涩五月天| 国产在线播放91 | 99ri精品| 三上悠亚国产精品一区 | 好看华人华人经典play | 成人福利网 | 国产精品久久久久久久久免费观看 | 猫扑俩性| 青春草视频免费观看 | 日本成人免费在线视频 | 欧美精品久久久久久久影视 | 牛牛影院成人免费网页 | 草莓在深夜释放自己软件 | 久久亚洲精品中文字幕60分钟 | 亚洲狠狠婷婷综合久久蜜桃 | 亚洲人成伊人成综合网久久 | 欧美三级一区二区 | 久久国产加勒比精品无码 | 韩国理论三级在线观看视频 | 国产高清在线精品一区二区三区 | 亚州在线 | 俄罗斯烧性春三级k8播放 | 日本三级香港三级久久99 | 32d乳白色的奶罩未删除 | 天天av天天翘天天综合网 | 精品久久成人免费第三区 | 青草碰人人澡人人澡 | 变态 另类 国产 亚洲 | 免费看a片毛片 | 天天快乐高清在线观看 | 香蕉精品国产高清自在自线 | 欧美乱理伦另类视频 | 成年美女黄网站色视频大全免费 | 日韩中文字幕一区 | 国产精品一区牛牛影视 | 欧美日韩精品一区二区三区高清视频 | 五月桃花网婷婷亚洲综合 | 色依依视频视频在线观看 | mmkk在线看片 | 四虎网址大全 | 国产偷窥 |