Datawhale_Task6 PyTorch理解更多神经网络优化方法
- 了解不同优化器
- 书写优化器代码
- Momentum
- 二维优化,随机梯度下降法进行优化实现
- Ada自适应梯度调节法
- RMSProp
- Adam
- 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(常用)