指数移动平均(Exponential Moving Average, EMA)也叫权重移动平均(Weighted Moving Average),是一种权重的平均方法,该可以方法给予近期数据更高的权重
EMA:
其中,
当前时刻的权重可以近似认为是之前梯度和,即
那么EMA的影子权重可以表示为
可以看做是对每次的梯度加权,将学习率动态的减小
Pytorch中的自带的OneCycleLR可以动态的设置学习率,其使用方法较为简单,只需在现有的代码中加入两行代码即可实现。
首先,使用OneCycleLR
在定义优化器后定义lr_scheduler
xxxxxxxxxx
optimizer = torch.optim.Adam(optim_params, lr, weight_decay = )
lr_scheduler = torch.optim.lr_scheduler.OneCycleLR(optimizer, ... )
其中,函数的参数有:
max_lr
:学习率变化的上界
tatal_steps
:学习率变化的总步数,如果不提供,需要设置epochs
和steps_per_epoch
参数
epochs
:训练过程中总的epoch,和steps_per_epoch
一起用来计算训练过程中的总步数
steps_per_epoch
:每个epoch中需要训练的步数,计算方法为data_len/batch_size
pct_start
:学习率上升阶段占总步数的比例,默认为0.3
anneal_strategy
:cos
或linear
,默认为cos
其次,在原代码梯度反传后更新学习率
xxxxxxxxxx
loss.backward()
opyimizer.step()
lr_scheduler.step()
同时,可以通过optimizer.param_groups[0]['lr']
获取训练过程中的学习率