我做網(wǎng)站了圓通淘寶的17種免費(fèi)推廣方法
一、get_scheduler實(shí)現(xiàn)warmup
1、warmup基本思想
Warmup(預(yù)熱)是深度學(xué)習(xí)訓(xùn)練中的一種技巧,旨在逐步增加學(xué)習(xí)率以穩(wěn)定訓(xùn)練過(guò)程,特別是在訓(xùn)練的早期階段。它主要用于防止在訓(xùn)練初期因?qū)W習(xí)率過(guò)大導(dǎo)致的模型參數(shù)劇烈波動(dòng)或不穩(wěn)定。預(yù)熱階段通常是指在訓(xùn)練開(kāi)始時(shí),通過(guò)多個(gè)步長(zhǎng)逐步將學(xué)習(xí)率從一個(gè)較低的值增加到目標(biāo)值(通常是預(yù)定義的最大學(xué)習(xí)率)。
2、warmup基本實(shí)現(xiàn)
from transformers import get_schedulerscheduler = get_scheduler(name="cosine", # 可以選擇 'linear', 'cosine', 'polynomial', 'constant', 'constant_with_warmup'optimizer=optimizer,num_warmup_steps=100, # 預(yù)熱步數(shù)num_training_steps=num_training_steps # 總的訓(xùn)練步數(shù)
)#linear:線性學(xué)習(xí)率下降
#cosine:余弦退火
#polynomial:多項(xiàng)式衰減
#constant:常數(shù)學(xué)習(xí)率
#constant_with_warmup:預(yù)熱后保持常數(shù)# 上述代碼等價(jià)于
from transformers import get_cosine_scheduler_with_warmupscheduler = get_cosine_scheduler_with_warmup(optimizer=optimizer,num_warmup_steps=100, # 預(yù)熱步數(shù)num_training_steps=num_training_steps # 總的訓(xùn)練步數(shù)
)# 同理等價(jià)于linear, polynomial, constant分別等價(jià)于
from transformers import (get_constant_schedule, get_polynomial_decay_schedule_with_warmup, get_linear_schedule_with_warmup)
?二、各種warmup策略學(xué)習(xí)率變化規(guī)律
1、get_constant_schedule學(xué)習(xí)率變化規(guī)律
2、get_cosine_schedule_with_warmup學(xué)習(xí)率變化規(guī)律
3、get_cosine_with_hard_restarts_schedule_with_warmup學(xué)習(xí)率變化規(guī)律
4、get_linear_schedule_with_warmup學(xué)習(xí)率變化規(guī)律
5、get_polynomial_decay_schedule_with_warmup學(xué)習(xí)率變化規(guī)律(power=2, power=1類似于linear)
6、注意事項(xiàng)
- 如果網(wǎng)絡(luò)中不同框架采用不同的學(xué)習(xí)率,上述的warmup策略仍然有效(如圖二、5中所示)?
- 給schduler設(shè)置的number_training_steps一定要和訓(xùn)練過(guò)程相匹配,如下所示。
7、可視化學(xué)習(xí)率過(guò)程
import matplotlib.pyplot as plt
from transformers import get_scheduler
from torch.optim import AdamW
import torch
import math# 定義一些超參數(shù)learning_rate = 1e-3 # 初始學(xué)習(xí)率# 假設(shè)有一個(gè)模型
model = torch.nn.Linear(10, 2)# 獲得訓(xùn)練總的步數(shù)
epochs = 50
batch_size = 32
#train_loader = ***
#num_train_loader = len(train_loader)
num_train_loader = 1235num_training_steps = epochs * math.ceil(num_train_loader/batch_size) # 總的訓(xùn)練步數(shù)# 定義優(yōu)化器
optimizer = AdamW(model.parameters(), lr=learning_rate)# 創(chuàng)建學(xué)習(xí)率調(diào)度器
scheduler = get_scheduler(name="cosine", # 可以選擇 'linear', 'cosine', 'polynomial', 'constant', 'constant_with_warmup'optimizer=optimizer,num_warmup_steps=100, # 預(yù)熱步數(shù)num_training_steps=num_training_steps # 總的訓(xùn)練步數(shù)
)# 存儲(chǔ)每一步的學(xué)習(xí)率
learning_rates = []# for step in range(num_training_steps):
# optimizer.step()
# scheduler.step()
# learning_rates.append(optimizer.param_groups[0]['lr'])for epoch in range(epochs):# for batch in train_loader:for step in range(0, num_train_loader, batch_size):optimizer.zero_grad()# loss.backward()optimizer.step()scheduler.step()learning_rates.append(optimizer.param_groups[0]['lr'])# 繪制學(xué)習(xí)率曲線
plt.plot(learning_rates)
plt.xlabel("Training Steps")
plt.ylabel("Learning Rate")
plt.title("Learning Rate Schedule")
plt.show()
實(shí)驗(yàn)結(jié)果: