添加时间:2024-07-01 13:16:51
Optimizer优化器封装好的函数作为神经网络的两大框架:PyTorch和TensorFlow,
? ? ? ? 当前使用的许多优化算法,是对梯度下降法的衍生和优化。在微积分中,对多元函数的参数求偏导数,把求得的各个参数的导数以向量的形式写出来就是梯度。梯度就是函数变化最快的地方。梯度下降是迭代法的一种,在求解机器学习算法的模型参数时,即无约束问题时,梯度下降是最常采用的方法之一。
? ? ? ? 梯度下降算法中,模型参数的更新调整,与代价函数关于模型参数的梯度有关,即沿着梯度的方向不断减小模型参数,从而最小化代价函数。基本策略可以理解为”在有限视距内寻找最快路径下山“
标准的梯度下降主要有两个缺点:
1.1训练速度慢:在应用于大型数据集中,每输入一个样本都要更新一次参数,且每次迭代都要遍历所有的样本,会使得训练过程及其缓慢,需要花费很长时间才能得到收敛解。
1.2容易陷入局部最优解:由于是在有限视距内寻找下山的反向,当陷入平坦的洼地,会误以为到达了山地的最低点,从而不会继续往下走。所谓的局部最优解就是鞍点,落入鞍点,梯度为0,使得模型参数不在继续更新。
? ? ? ? BGD相对于标准GD进行了改进,改进的地方通过它的名字应该也能看出来,也就是不再是想标准GD一样,对每个样本输入都进行参数更新,而是针对一个批量的数据输入进行参数更新。
? ? ? ? BGD其实是在一个批量的样本数据中,求取该批量样本梯度的均值来更新参数,即每次权值调整发生在批量样本输入之后,而不是每输入一个样本就更新一次模型参数,这样就会大大加快训练速度,但是还是不够
? ? ? ? 随机梯度下降法,不像BGD每一次参数更新,需要计算整个数据样本集的梯度,而是每次参数更新时,仅仅选取一个样本计算其梯度,公式看起来和上面标准GD一样,但是注意了,这里的样本是从批量中随机选取一个,而标准GD是所有的输入样本都进行计算。可以看到BGD和SGD是两个极端,SGD由于每次参数更新仅仅需要计算一个样本的梯度,训练速度很快,即使在样本量很大的情况下,可能只需要其中一部分样本就能迭代到最优解,由于每次迭代并不是都向着整体最优化方向,导致梯度下降的波动非常大(如下图),更容易从一个局部最优跳到另一个局部最优,准确度下降。当缓慢降低学习率时,SGD会显示与BGD相同的收敛行为,几乎一定会收敛到局部(非凸优化)或全局最小值(凸优化)。
SGD的优点:
? ? ? ? 3.1 虽然看起来SGD波动非常大,会走很多弯路,但是对梯度的要求很低(计算梯度快),而且对于引入噪声,大量的理论和实践工作证明,只要噪声不是特别大,SGD都能很好地收敛。
? ? ? ? 3.2 应用大型数据集时,训练速度很快。比如每次从百万数据样本中,取几百个数据点,算一个SGD梯度,更新一下模型参数。相比于标准梯度下降法的遍历全部样本,每输入一个样本更新一次参数,要快得多。
SGD的缺点:
? ? ? ? 3.3 SGD在随机选择梯度的同时会引入噪声,使得权值更新的方向不一定正确(次要)。
? ? ? ? 3.4 SGD也没能单独克服局部最优解的问题。
? ? ? ? 小批量梯度下降法就是结合BGD和SGD的折中,对于含有个训练样本的数据集,每次参数更新。小批量梯度下降法即保证了训练的速度,又能保证最后收敛的准确率,目前的SGD默认是小批量梯度下降算法。常用的小批量尺寸范围在50到256之间,但可能因不同的应用而异。
MBGD的缺点:
? ? ? ? Mini-batch gradient descent 不能保证很好的收敛性,learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离(有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点)。对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点所有维度的梯度都接近于0,SGD 很容易被困在这里(会在鞍点或者局部最小点震荡跳动,因为在此点处,如果是BGD的训练集全集带入,则优化会停止不动,如果是mini-batch或者SGD,每次找到的梯度都是不同的,就会发生震荡,来回跳动)。
? ? ? ? SGD对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新, 且learning rate会随着更新的次数逐渐变小。
? ? ? ? momentum算法思想:参数更新时在一定程度上保留之前更新的方向,同时又利用当前batch的梯度微调最终的更新方向,简言之就是通过积累之前的动量来加速当前的梯度。
动量主要解决SGD的两个问题:
5.1 随机梯度的方法(引入的噪声)
5.2 Hessian矩阵病态问题(可以理解为SGD在收敛过程中和正确梯度相比来回摆动比较大的问题)
? ? ? ? NAG(Nesterov accelerated gradient)算法,是Momentum动量算法的变种。momentum保留了上一时刻的梯度,对其没有进行任何改变,NAG是momentum的改进,在梯度更新时做一个矫正。
? ? ? ?加上nesterov项后,梯度在大的跳跃后,进行计算对当前梯度进行校正。?
? ? ? ?Nesterov动量梯度的计算在模型参数施加当前速度之后,因此可以理解为往标准动量中添加了一个校正因子。在凸批量梯度的情况下,Nesterov动量将额外误差收敛率从(k步后)改进到,然而,在随机梯度情况下,Nesterov动量对收敛率的作用却不是很大。Momentum和Nexterov都是为了使梯度更新更灵活。
? ? ? ? Adagrad其实是对学习率进行了一个约束,对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。而该方法中开始使用二阶动量,才意味着“自适应学习率”优化算法时代的到来。
? ? ? ? Adagrad还是存在一个很明显的缺点:
? ? ? ? 7.1 仍需要手工设置一个全局学习率, 如果设置过大的话,会使regularizer过于敏感,对梯度的调节太大
? ? ? ? 7.2 中后期,分母上梯度累加的平方和会越来越大,使得参数更新量趋近于0,使得训练提前结束,无法学习
地址:海南省海口市电话:0898-08980898传真:0898-1230-5678
Copyright © 2012-2018 耀世娱乐-耀世注册登录入口 版权所有ICP备案编号:琼ICP备xxxxxxxx号