PyTorch CosineAnnealingLR的T_max和eta_min参数设置

在深度学习训练中,学习率调度器(Learning Rate Scheduler)是至关重要的超参数优化工具。其中,余弦退火(Cosine Annealing)因其平滑的衰减特性和优秀的性能表现,已成为最流行的调度策略之一。

CosineAnnealingLR 基础

余弦退火的学习率变化遵循余弦函数:

\(\eta_t=\eta_{min}+\frac12(\eta_{max}-\eta_{min})\Big(1+\cos\big(\frac{t}{T_{max}}\pi\big)\Big)\)

  • \(\eta_t\):当前步学习率
  • \(\eta_{max}\):优化器初始学习率
  • \(\eta_{min}\):eta_min,学习率下限
  • t:当前 step(batch 迭代次数)
  • \(T_{max}\):余弦周期长度

当 \(t=T_{max}\),\(\cos(\pi)=-1\),学习率 = \(\eta_{min}\)。

基本用法

python 复制代码
import torch
import torch.optim as optim
from torch.optim.lr_scheduler import CosineAnnealingLR

# 定义优化器
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 创建余弦退火调度器
scheduler = CosineAnnealingLR(
    optimizer,
    T_max=100,      # 周期长度
    eta_min=1e-6    # 最小学习率
)

T_max 参数

T_max 控制学习率从最大值下降到最小值所需的步数。

整个训练全部迭代步数,一次完整余弦衰减,训练结束 lr 到达 eta_min。

通常设置为:

  1. T_max = total_iter = (样本数 // batch_size) × epochs
  2. T_max = epochs
配置 调用 scheduler.step () 时机
T_max = total_iterations 每个 batch 内部执行一次(每 1 个 step 调用)
T_max = epochs epoch 循环末尾调用,一个 epoch 只 step 一次

T_max = total_iterations(总迭代 step)

使用条件(两个必须同时满足)

scheduler.step() 写在内层 batch 循环,每跑完一个 batch 调用一次

python 复制代码
for epoch in range(epochs):
    for imgs, label in dataloader:
        # 前向、loss、反向传播
        optimizer.step()
        scheduler.step() #每个batch调用

T_max = total_iterations = (num_samples // batch_size) * epochs

T_max = epochs(T_max 数值等于轮数)

调度器调用时机

python 复制代码
# 正确配套写法
scheduler = CosineAnnealingLR(optimizer, T_max=epochs, eta_min=1e‑6)

for epoch in range(epochs):
    for imgs, label in dataloader:
        #训练,只更新optimizer,不调用scheduler.step()
        optimizer.step()
    scheduler.step() #❗每个epoch结束才调用一次

假设epoch=100,学习率初始值为0.0006,

当T_max = epochs,则学习率变化;

当T_max < epochs,则学习率变化;

当T_max > epochs,则学习率变化;下图学习率最小值停留在0.0003

eta_min 参数

eta_min:余弦退火的学习率最低下限。

eta_min=0:训练末尾学习率直接归零,参数不再更新;

eta_min=1e‑6(工程常用):保留极小学习率,允许参数微小更新,避免训练末期完全冻结。

不建议直接置 0,部分场景会出现收敛停滞。CV 任务(车道线、检测)推荐eta_min=1e‑6 ~ 1e‑7。

相关推荐
小小张说故事15 小时前
Python 的切片到底切了什么:拆开 slice 对象、负步长和 __getitem__
python
Rocky Ding*15 小时前
【三年面试五年模拟】2026-11-05_月之暗面大模型算法岗一面、二面面经全解析
论文阅读·人工智能·深度学习·机器学习·aigc·强化学习·ai-native
Mirawork15 小时前
Mirawork v0.32.0 更新体验:会话引用、任务分享与音频转写怎么用
人工智能·音视频
lucas_AI15 小时前
模型一升级缓存全作废?DeepSeek 实测:KV Cache 跨版本直接复用,首 token 快 5 倍
人工智能
在所不辞兄15 小时前
【人工智能驱动的电催化研究-05】条件、循环与数据检查
人工智能·深度学习·神经网络·机器学习·有限元·电化学·电催化
IT_陈寒16 小时前
JavaScript项目实战经验分享:从内存泄漏到性能优化的血泪史
前端·人工智能·后端
小oo呆17 小时前
【自然语言处理与大模型】如何编写优质的Skill?
人工智能
非优秀程序员1 天前
第12章 烧钱无底洞!!!不烧就死,烧了也不知道啥时候死|《互联网产品恩仇录》
人工智能
Zelman9451 天前
第06章-交互与观察动作空间
人工智能
冬奇Lab1 天前
开源项目第258期:Harness² —— Google Research 的「递归式 Agent Harness 优化」,模型权重不动,只改 Agent 的外壳
人工智能·开源