佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > pytorch中Schedule與warmup_steps的用法說明

pytorch中Schedule與warmup_steps的用法說明

熱門標(biāo)簽:Win7旗艦版 電話運(yùn)營中心 企業(yè)做大做強(qiáng) 呼叫中心市場(chǎng)需求 語音系統(tǒng) 客戶服務(wù) 百度AI接口 硅谷的囚徒呼叫中心

1. lr_scheduler相關(guān)

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ù)

一般來說:

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

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

    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先慢慢增加,超過warmup_steps時(shí),lr再慢慢減小。

在實(shí)際中,由于訓(xùn)練剛開始時(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ù)超過warmup_steps時(shí),學(xué)習(xí)率逐步衰減,衰減率為1/(total-warmup_steps),再進(jìn)行微調(diào)。

2. gradient_accumulation_steps相關(guān)

gradient_accumulation_steps通過累計(jì)梯度來解決本地顯存不足問題。

假設(shè)原來的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ù)具體的需求來做。只有用了optimizer.step(),模型才會(huì)更新,而scheduler.step()是對(duì)lr進(jìn)行調(diào)整。

通常我們有

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)過這么多次迭代,學(xué)習(xí)率改變一次。

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

您可能感興趣的文章:
  • Pytorch 中的optimizer使用說明
  • PyTorch中model.zero_grad()和optimizer.zero_grad()用法
  • PyTorch的Optimizer訓(xùn)練工具的實(shí)現(xiàn)
  • 聊聊pytorch中Optimizer與optimizer.step()的用法

標(biāo)簽:濟(jì)南 長(zhǎng)沙 安康 喀什 海南 山西 山西 崇左

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《pytorch中Schedule與warmup_steps的用法說明》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    松原市| 景德镇市| 云霄县| 广昌县| 福清市| 洛隆县| 马鞍山市| 台东县| 卫辉市| 华蓥市| 阜新市| 威信县| 海宁市| 漯河市| 丹寨县| 紫阳县| 吉木萨尔县| 柳州市| 蓝田县| 合川市| 喜德县| 白银市| 舒兰市| 贞丰县| 佛冈县| 古蔺县| 汝州市| 油尖旺区| 抚宁县| 博湖县| 伊宁市| 景德镇市| 定兴县| 瑞金市| 富平县| 黑河市| 江安县| 洱源县| 库尔勒市| 东港市| 宿迁市|