+-
Tensorflow/Pytorch学习率衰减方法
首页 专栏 机器学习 文章详情
0

Tensorflow/Pytorch学习率衰减方法

anie 发布于 5 月 10 日

神经网络训练过程中,根据每batch训练数据前向传播的结果,计算损失函数,再由损失函数根据梯度下降法更新每一个网络参数,在参数更新过程中使用到一个学习率(learning rate),用来定义每次参数更新的幅度。

过小的学习率会降低网络优化的速度,增加训练时间,过大的学习率可能导致网络参数在最终的极优值两侧来回摆动,导致网络不能收敛。实践中证明有效的方法是设置一个根据迭代次数衰减的学习率,可以兼顾训练效率和后期的稳定性。

Tensorflow

分段常数衰减

分段常数衰减是在事先定义好的训练次数区间上,设置不同的学习率常数。刚开始学习率大一些,之后越来越小,区间的设置需要根据样本量调整,一般样本量越大区间间隔应该越小。

tf.train.piecewise_constant( x, #标量,训练次数 boundaries, #学习率参数应用区间列表, [10,20,30] values, #学习率列表,长度比boundaries多1, [0.1,0.5,0.025,0.0125] name=None ) 指数衰减

指数衰减是比较常用的衰减方法,学习率是跟当前的训练轮次指数相关的。

tf.train.exponential_decay( learning_rate, #初始学习率 global_step, #当前训练轮次 decay_steps, #衰减周期,用于阶梯型衰减 decay_rate, #衰减率系数 staircase=False, #True为阶梯型衰减,False为指数型衰减(连续衰减) name=None ) 自然指数衰减

自然指数衰减是指数衰减的一种特殊情况,学习率也是跟当前的训练轮次指数相关,只不过以 e 为底数。

tf.train.natural_exp_decay( learning_rate, #初始学习率 global_step, #当前训练轮次 decay_steps, #衰减周期,用于阶梯型衰减 decay_rate, #衰减率系数 staircase=False, #True为阶梯型衰减,False为指数型衰减(连续衰减) name=None )


自然指数衰减对学习率的衰减程度要远大于一般的指数衰减,一般用于可以较快收敛的网络,或者是训练数据集比较大的场合。

多项式衰减

多项式衰减是这样一种衰减机制:定义一个初始的学习率,一个最低的学习率,按照设置的衰减规则,学习率从初始学习率逐渐降低到最低的学习率,并且可以定义学习率降低到最低的学习率之后,选择是一直保持使用这个最低的学习率,还是到达最低的学习率之后再升高学习率到一定值,然后再降低到最低的学习率(反复这个过程)

tf.train.polynomial_decay( learning_rate, #初始学习率 global_step, #当前训练轮次 decay_steps, #衰减周期 end_learning_rate=0.0001, #最小学习率 power=1.0, #多项式的幂,默认为1,即线性的 cycle=False, #到达最低学习率后是否升高,默认是False,即保持最低学习率 name=None )


红色的学习率衰减曲线对应 cycle = False,下降后不再上升,保持不变,绿色的学习率衰减曲线对应 cycle = True,下降后往复升降。
多项式衰减中设置学习率可以往复升降的目的是为了防止神经网络后期训练的学习率过小,导致网络参数陷入某个局部最优解出不来,设置学习率升高机制,有可能使网络跳出局部最优解。

余弦衰减 tf.train.cosine_decay( learning_rate, #初始学习率 global_step, #当前训练轮次 decay_steps, #衰减步数,从初始学习率到最小学习率需要的轮次 alpha=0.0, #最小学习率 name=None )

改进的余弦衰减方法还有:
线性余弦衰减,对应函数 tf.train.linear_cosine_decay()
噪声线性余弦衰减,对应函数 tf.train.noisy_linear_cosine_decay()

红色标准余弦衰减,学习率从初始曲线过渡到最低学习率;
蓝色线性余弦衰减,学习率从初始线性过渡到最低学习率;
绿色噪声线性余弦衰减,在线性余弦衰减基础上增加了随机噪声;

Pytorch

固定步长衰减 torch.optim.lr_scheduler.StepLR( optimizer, #优化器 step_size, #步长 gamma=0.1, #衰减率 last_epoch=-1, #一直到last_epoch verbose=False) >>> example #隔30步衰减为原来的0.1 >>> # Assuming optimizer uses lr = 0.05 for all groups >>> # lr = 0.05 if epoch < 30 >>> # lr = 0.005 if 30 <= epoch < 60 >>> # lr = 0.0005 if 60 <= epoch < 90 >>> # ... >>> scheduler = StepLR(optimizer, step_size=30, gamma=0.1) >>> for epoch in range(100): >>> train(...) >>> validate(...) >>> scheduler.step() 多步长衰减 torch.optim.lr_scheduler.MultiStepLR( optimizer, #优化器 milestones, #学习率更新区间(list) gamma=0.1, #衰减率 last_epoch=-1, verbose=False) Example #在epoch=30,80的时候更新学习率 >>> # Assuming optimizer uses lr = 0.05 for all groups >>> # lr = 0.05 if epoch < 30 >>> # lr = 0.005 if 30 <= epoch < 80 >>> # lr = 0.0005 if epoch >= 80 >>> scheduler = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1) >>> for epoch in range(100): >>> train(...) >>> validate(...) >>> scheduler.step() 指数衰减 torch.optim.lr_scheduler.ExponentialLR(optimizer_ExpLR, gamma=0.98) #其中参数gamma表示衰减的底数,选择不同的gamma值可以获得幅度不同的衰减曲线

余弦退火衰减 optimizer_CosineLR = torch.optim.SGD(net.parameters(), lr=0.1) CosineLR = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer_CosineLR, T_max=150, eta_min=0)

严格的说,余弦退火策略不应该算是学习率衰减策略,因为它使得学习率按照周期变化,其包含的参数和余弦知识一致,参数T_max表示余弦函数周期;eta_min表示学习率的最小值,默认它是0表示学习率至少为正值。确定一个余弦函数需要知道最值和周期,其中周期就是T_max,最值是初试学习率。

Reference

https://www.tensorflow.org/ap...
https://pytorch.org/docs/stab...
https://zhuanlan.zhihu.com/p/...

机器学习
阅读 36 发布于 5 月 10 日
收藏
分享
本作品系原创, 采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
avatar
anie
1 声望
0 粉丝
关注作者
0 条评论
得票数 最新
提交评论
你知道吗?

注册登录
avatar
anie
1 声望
0 粉丝
关注作者
宣传栏
目录

神经网络训练过程中,根据每batch训练数据前向传播的结果,计算损失函数,再由损失函数根据梯度下降法更新每一个网络参数,在参数更新过程中使用到一个学习率(learning rate),用来定义每次参数更新的幅度。

过小的学习率会降低网络优化的速度,增加训练时间,过大的学习率可能导致网络参数在最终的极优值两侧来回摆动,导致网络不能收敛。实践中证明有效的方法是设置一个根据迭代次数衰减的学习率,可以兼顾训练效率和后期的稳定性。

Tensorflow

分段常数衰减

分段常数衰减是在事先定义好的训练次数区间上,设置不同的学习率常数。刚开始学习率大一些,之后越来越小,区间的设置需要根据样本量调整,一般样本量越大区间间隔应该越小。

tf.train.piecewise_constant( x, #标量,训练次数 boundaries, #学习率参数应用区间列表, [10,20,30] values, #学习率列表,长度比boundaries多1, [0.1,0.5,0.025,0.0125] name=None ) 指数衰减

指数衰减是比较常用的衰减方法,学习率是跟当前的训练轮次指数相关的。

tf.train.exponential_decay( learning_rate, #初始学习率 global_step, #当前训练轮次 decay_steps, #衰减周期,用于阶梯型衰减 decay_rate, #衰减率系数 staircase=False, #True为阶梯型衰减,False为指数型衰减(连续衰减) name=None ) 自然指数衰减

自然指数衰减是指数衰减的一种特殊情况,学习率也是跟当前的训练轮次指数相关,只不过以 e 为底数。

tf.train.natural_exp_decay( learning_rate, #初始学习率 global_step, #当前训练轮次 decay_steps, #衰减周期,用于阶梯型衰减 decay_rate, #衰减率系数 staircase=False, #True为阶梯型衰减,False为指数型衰减(连续衰减) name=None )


自然指数衰减对学习率的衰减程度要远大于一般的指数衰减,一般用于可以较快收敛的网络,或者是训练数据集比较大的场合。

多项式衰减

多项式衰减是这样一种衰减机制:定义一个初始的学习率,一个最低的学习率,按照设置的衰减规则,学习率从初始学习率逐渐降低到最低的学习率,并且可以定义学习率降低到最低的学习率之后,选择是一直保持使用这个最低的学习率,还是到达最低的学习率之后再升高学习率到一定值,然后再降低到最低的学习率(反复这个过程)

tf.train.polynomial_decay( learning_rate, #初始学习率 global_step, #当前训练轮次 decay_steps, #衰减周期 end_learning_rate=0.0001, #最小学习率 power=1.0, #多项式的幂,默认为1,即线性的 cycle=False, #到达最低学习率后是否升高,默认是False,即保持最低学习率 name=None )


红色的学习率衰减曲线对应 cycle = False,下降后不再上升,保持不变,绿色的学习率衰减曲线对应 cycle = True,下降后往复升降。
多项式衰减中设置学习率可以往复升降的目的是为了防止神经网络后期训练的学习率过小,导致网络参数陷入某个局部最优解出不来,设置学习率升高机制,有可能使网络跳出局部最优解。

余弦衰减 tf.train.cosine_decay( learning_rate, #初始学习率 global_step, #当前训练轮次 decay_steps, #衰减步数,从初始学习率到最小学习率需要的轮次 alpha=0.0, #最小学习率 name=None )

改进的余弦衰减方法还有:
线性余弦衰减,对应函数 tf.train.linear_cosine_decay()
噪声线性余弦衰减,对应函数 tf.train.noisy_linear_cosine_decay()

红色标准余弦衰减,学习率从初始曲线过渡到最低学习率;
蓝色线性余弦衰减,学习率从初始线性过渡到最低学习率;
绿色噪声线性余弦衰减,在线性余弦衰减基础上增加了随机噪声;

Pytorch

固定步长衰减 torch.optim.lr_scheduler.StepLR( optimizer, #优化器 step_size, #步长 gamma=0.1, #衰减率 last_epoch=-1, #一直到last_epoch verbose=False) >>> example #隔30步衰减为原来的0.1 >>> # Assuming optimizer uses lr = 0.05 for all groups >>> # lr = 0.05 if epoch < 30 >>> # lr = 0.005 if 30 <= epoch < 60 >>> # lr = 0.0005 if 60 <= epoch < 90 >>> # ... >>> scheduler = StepLR(optimizer, step_size=30, gamma=0.1) >>> for epoch in range(100): >>> train(...) >>> validate(...) >>> scheduler.step() 多步长衰减 torch.optim.lr_scheduler.MultiStepLR( optimizer, #优化器 milestones, #学习率更新区间(list) gamma=0.1, #衰减率 last_epoch=-1, verbose=False) Example #在epoch=30,80的时候更新学习率 >>> # Assuming optimizer uses lr = 0.05 for all groups >>> # lr = 0.05 if epoch < 30 >>> # lr = 0.005 if 30 <= epoch < 80 >>> # lr = 0.0005 if epoch >= 80 >>> scheduler = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1) >>> for epoch in range(100): >>> train(...) >>> validate(...) >>> scheduler.step() 指数衰减 torch.optim.lr_scheduler.ExponentialLR(optimizer_ExpLR, gamma=0.98) #其中参数gamma表示衰减的底数,选择不同的gamma值可以获得幅度不同的衰减曲线

余弦退火衰减 optimizer_CosineLR = torch.optim.SGD(net.parameters(), lr=0.1) CosineLR = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer_CosineLR, T_max=150, eta_min=0)

严格的说,余弦退火策略不应该算是学习率衰减策略,因为它使得学习率按照周期变化,其包含的参数和余弦知识一致,参数T_max表示余弦函数周期;eta_min表示学习率的最小值,默认它是0表示学习率至少为正值。确定一个余弦函数需要知道最值和周期,其中周期就是T_max,最值是初试学习率。

Reference

https://www.tensorflow.org/ap...
https://pytorch.org/docs/stab...
https://zhuanlan.zhihu.com/p/...