transformers进行学习率调整lr_scheduler(warmup)

一、get_scheduler实现warmup

1、warmup基本思想

Warmup(预热)是深度学习训练中的一种技巧,旨在逐步增加学习率以稳定训练过程,特别是在训练的早期阶段。它主要用于防止在训练初期因学习率过大导致的模型参数剧烈波动或不稳定。预热阶段通常是指在训练开始时,通过多个步长逐步将学习率从一个较低的值增加到目标值(通常是预定义的最大学习率)。

2、warmup基本实现

from transformers import get_scheduler

scheduler = get_scheduler(
    name="cosine",  # 可以选择 'linear', 'cosine', 'polynomial', 'constant', 'constant_with_warmup'
    optimizer=optimizer,
    num_warmup_steps=100,  # 预热步数
    num_training_steps=num_training_steps  # 总的训练步数
)

#linear:线性学习率下降
#cosine:余弦退火
#polynomial:多项式衰减
#constant:常数学习率
#constant_with_warmup:预热后保持常数

# 上述代码等价于
from transformers import get_cosine_scheduler_with_warmup

scheduler = get_cosine_scheduler_with_warmup(
    optimizer=optimizer,
    num_warmup_steps=100,  # 预热步数
    num_training_steps=num_training_steps  # 总的训练步数
)

# 同理等价于linear, polynomial, constant分别等价于
from transformers import (get_constant_schedule, get_polynomial_decay_schedule_with_warmup, get_linear_schedule_with_warmup)

二、各种warmup策略学习率变化规律

1、get_constant_schedule学习率变化规律

2、get_cosine_schedule_with_warmup学习率变化规律

3、get_cosine_with_hard_restarts_schedule_with_warmup学习率变化规律

4、get_linear_schedule_with_warmup学习率变化规律

5、get_polynomial_decay_schedule_with_warmup学习率变化规律(power=2, power=1类似于linear)

6、注意事项

  • 如果网络中不同框架采用不同的学习率,上述的warmup策略仍然有效(如图二、5中所示)
  • 给schduler设置的number_training_steps一定要和训练过程相匹配,如下所示。

7、可视化学习率过程

python 复制代码
import matplotlib.pyplot as plt
from transformers import get_scheduler
from torch.optim import AdamW
import torch
import math

# 定义一些超参数

learning_rate = 1e-3  # 初始学习率

# 假设有一个模型
model = torch.nn.Linear(10, 2)

# 获得训练总的步数
epochs = 50
batch_size = 32
#train_loader = ***
#num_train_loader = len(train_loader)
num_train_loader = 1235

num_training_steps = epochs * math.ceil(num_train_loader/batch_size) # 总的训练步数

# 定义优化器
optimizer = AdamW(model.parameters(), lr=learning_rate)

# 创建学习率调度器
scheduler = get_scheduler(
    name="cosine",  # 可以选择 'linear', 'cosine', 'polynomial', 'constant', 'constant_with_warmup'
    optimizer=optimizer,
    num_warmup_steps=100,  # 预热步数
    num_training_steps=num_training_steps  # 总的训练步数
)

# 存储每一步的学习率
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'])


# 绘制学习率曲线
plt.plot(learning_rates)
plt.xlabel("Training Steps")
plt.ylabel("Learning Rate")
plt.title("Learning Rate Schedule")
plt.show()

实验结果:

相关推荐
HuggingFace20 天前
基于 Quanto 和 Diffusers 的内存高效 transformer 扩散模型
transformers·diffusers·quanto
enjoy编程1 个月前
hg transformers pipeline使用
ai·大模型·llm·pipeline·huggingface·transformers
营赢盈英2 个月前
Deepspeed : AttributeError: ‘DummyOptim‘ object has no attribute ‘step‘
python·ai·llm·nlp·huggingface·transformers·deepspeed
华为云开发者联盟2 个月前
结合RNN与Transformer双重优点,深度解析大语言模型RWKV
rnn·深度学习·大模型·transformers·rwkv·华为云开发者联盟
华为云开发者联盟2 个月前
一文为你深度解析LLaMA2模型架构
大模型·nlp·llama·transformers·华为云开发者联盟
多恩Stone3 个月前
【扩散模型(二)】IP-Adapter 从条件分支的视角,快速理解相关的可控生成研究
人工智能·python·计算机视觉·aigc·transformers
shao9185163 个月前
Hugging Face系列2:详细剖析Hugging Face网站资源——实战六类开源库
huggingface·transformers·optimum·diffusers·peft·开源库·accelerate
HuggingFace3 个月前
用 Sentence Transformers v3 训练和微调嵌入模型
transformers
HuggingFace4 个月前
授权调用: 介绍 Transformers 智能体 2.0
transformers·智能体