PyTorch入门精简资料(六)PyTorch理解更多神经网络优化方法

Datawhale_Task6    PyTorch理解更多神经网络优化方法

  1. 了解不同优化器
  2. 书写优化器代码
  3. Momentum
  4. 二维优化,随机梯度下降法进行优化实现
  5. Ada自适应梯度调节法
  6. RMSProp
  7. Adam
  8. PyTorch中优化器选择

1.了解不同的优化器

(1)梯度下降法

1)批量梯度下降(Batch gradient descent)

每次使用全量的训练集样本来更新模型参数,即: θ=θ−η⋅∇θJ(θ),代码:

for i in range(nb_epoches):
    params_grad = evaluate_gradient(loss_function, data, params)
    params = params - learning_rate*params_grad

批量梯度下降每次学习都使用整个训练集

优点:每次更新都会朝着正确的方向进行,最后能够保证收敛于极值点(凸函数收敛于全局极值点,非凸函数可能会收敛于局部极值点

缺点:每次学习时间过长,并且如果训练集很大以至于需要消耗大量的内存,并且全量梯度下降不能进行在线模型参数更新。

2)随机梯度下降(Stochastic gradient descent)

每次从训练集中随机选择一个样本来进行学习,即: θ=θ−η⋅∇θJ(θ;xi;yi),代码,

for i in range(nb_epoches):
    np.random.shuffle(data):
    for example in data:
        params_grad = evaluate_gradient(loss_function, example, params)
        params = params - learning_rate*params_grad

优点:随机梯度下降算法,每次只随机选择一个样本来更新模型参数,因此每次的学习非常快速,并且可以进行在线更新。

缺点:每次更新可能并不会按照正确的方向进行,因此可能带来优化波动(扰动)

3)小批量梯度下降(Mini-batch gradient descent)

Mini-batch 梯度下降综合了 batch 梯度下降与 stochastic 梯度下降,在每次更新速度与更新次数中间取得一个平衡,其每次更新从训练集中随机选择 m,m<n 个样本进行学习。代码,

for i in range(nb_epoches):
    np.random.shuffle(data)
    for batch in get_batches(data, batch_size=50):
        params_grad = evaluate_gradient(loss_function, batch, params)
        params = params - learning_rate*params_grad

mini-batch梯度下降可以保证收敛性,常用于神经网络中。

梯度下降法面临挑战:容易陷入局部极值点或者鞍点

(2)Momentum

动量在参数更新项中加上一次更新量(即动量项),即: νt=γνt−1+η ∇θJ(θ),θ=θ−νt,其中动量项超参数γ<1一般是小于等于0.9,有助于跳出局部极值点或者鞍点。加上动量项就像从山顶滚下一个球,求往下滚的时候累积了前面的动量(动量不断增加),因此速度变得越来越快,直到到达终点

(3)Nesterov accelerated gradient(NAG)

Nesterov accelerated gradient(NAG,涅斯捷罗夫梯度加速)不仅增加了动量项,并且在计算参数的梯度时,在损失函数中减去了动量项

(4)Adagrad

基于梯度的优化算法,它能够对每个参数自适应不同的学习速率,对稀疏特征,得到大的学习更新,对非稀疏特征,得到较小的学习更新,因此该优化算法适合处理稀疏特征数据。Adagrad是一种自适应优化方法,是自适应的为各个参数分配不同的学习率。这个学习率的变化,会受到梯度的大小和迭代次数的影响。梯度越大,学习率越小;梯度越小,学习率越大。缺点是训练后期,学习率过小,因为Adagrad累加之前所有的梯度平方作为分母。

(5)Adadelta

对 Adagrad 的改进,和 Adagrad 相比,就是分母的 G 换成了过去的梯度平方的衰减平均值。Adadelta是Adagrad的改进。Adadelta分母中采用距离当前时间点比较近的累计项,这可以避免在训练后期,学习率过小。

(6)RMSprop

RMSprop 是 Geoff Hinton 提出的一种自适应学习率方法。RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的。实现RMSprop优化方法(Hinton提出),RMS是均方根(root meam square)的意思。RMSprop和Adadelta一样,也是对Adagrad的一种改进。RMSprop采用均方根作为分母,可缓解Adagrad学习率下降较快的问题。并且引入均方根,可以减少摆动

(7)Adam

Adaptive Moment Estimation (Adam) 也是一种不同参数自适应不同学习速率方法。除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 vt 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值。

2.书写优化器代码

# 选择不同的优化方法
opt_SGD = torch.optim.SGD(net_SGD.parameters(), lr = LR)
opt_Momentum = torch.optim.SGD(net_Momentum.parameters(), lr = LR, momentum = 0.9)
opt_RMSprop = torch.optim.RMSprop(net_RMSprop.parameters(), lr = LR, alpha = 0.9)
opt_Adam = torch.optim.Adam(net_Adam.parameters(), lr = LR, betas= (0.9, 0.99))

对不同层的参数设置不同的学习率,

optimizer = torch.optim.SGD([
            {'params': base_params},
            {'params': net.conv5.parameters(), 'lr': lr * 100},
            {'params': net.conv4.parameters(), 'lr': lr * 100},
            , lr=lr, momentum=0.9)

8.PyTorch中优化器选择

torch.optim.SGD

torch.optim.Adagrad

torch.optim.Adadelta

torch.optim.RMSprop

torch.optim.Adam(常用)

参考:深度学习必备:随机梯度下降(SGD)优化算法及可视化

          PyTorch的十个优化器 PyTorch

          pytorch 优化器(optim)不同参数组,不同学习率设置

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值