学习率
在你的代码中有两个不同的学习率(lr
),它们分别是通过 --lr
和 --final_lr
参数定义的。下面是对这两个学习率的解释:
1. --lr
: 初始学习率
parser.add_argument('--lr', type=float, default=0.003, help='learning rate')
- 含义:这是模型训练时的初始学习率(
lr
),用于在优化器中定义训练初始时的学习率。它代表了模型参数更新的初始步伐。 - 使用场景:在优化器中使用:
此处optimizer = torch.optim.Adam(self.model.parameters(), lr=self.config.lr)
self.config.lr
就是通过--lr
参数设置的初始学习率。 - 作用:这是在训练开始时模型更新参数的速度。在代码中默认值为
0.003
。
2. --final_lr
: 最终学习率
parser.add_argument('--final_lr', type=float, default=1e-3, help='exponential decay from lr')
- 含义:这是在训练的末期希望学习率逐渐减小到的目标值(
final_lr
)。它用于控制学习率从初始学习率lr
逐步衰减到final_lr
的过程。 - 指数衰减机制:在代码中,你使用了一个指数衰减的学习率调度器:
这里self.log_alpha = log(config.final_lr / config.lr) / self.max_step lr_lambda = lambda step: exp(log_alpha * (step + 1)) # 相当于 alpha^{step} scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lr_lambda)
self.log_alpha
是基于lr
和final_lr
计算的,用来确定学习率随时间衰减的速率。LambdaLR
调度器使用这个log_alpha
来根据训练步数更新学习率,最终使学习率逐步接近final_lr
。 - 作用:通过这个指数衰减机制,学习率在整个训练过程中逐步减小,保证在训练的后期,模型的学习步伐变得更小,从而提高模型的稳定性。
学习率的变化过程:
- 训练开始时,学习率为
--lr
(即config.lr
,例如0.003
)。 - 随着训练的进行,学习率会根据指数衰减公式逐渐减少,最终接近
--final_lr
(即config.final_lr
,例如1e-3
)。 - 在
get_scheduler()
函数中定义了这个衰减过程,通过lr_lambda
函数,每个 batch 之后学习率都会进行一次调整。
总结:
- 初始学习率(
lr
):在训练开始时使用,决定模型参数初始的更新步伐。 - 最终学习率(
final_lr
):是训练结束时希望学习率衰减到的目标值,用于让学习率逐渐减小,从而在训练后期模型能以更小的步伐进行更新。