赞
踩
这三种算法都用于反向传播的优化损失函数算法。在每轮迭代中更新一次权重w,根据多次迭代,最终无限的靠近我们预期的权重最优值。batch GD, mini-batch GD, SGD都可以看成SGD的范畴, 只不过区别在于每次取多少的样本了。
主要优点:梯度更新准确
公式:
(1) 如果数据集比较小,完全可以采用全数据集(Full Batch Learning)的形式,采用全数据有两个好处:
a. 由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。【在每次更新时用所有样本,要留意,在梯度下降中,对于
b. 由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。 Full Batch Learning 可以使用 Rprop 只基于梯度符号并且针对性单独更新各权值。
(2) 但是梯度下降也存在一下这些缺点:
a. 梯度下降算法并不能保证被优化函数达到全局最优解,只有当损失函数为凸函数时,梯度下降算法才能保证达到全局最优解,因此不能保证一定达到全局最优,受限于损失函数是否为凸函数。
b. 梯度下降算法的另外一个问题是计算时间太长,因为要在全部训练数据上最小化损失,在海量训练数据下,这样是十分耗时。【如果样本不多的情况下,当然是这样收敛的速度会更快啦。但是很多时候,样本很多,更新一次要很久,这样的方法就不合适】
主要优点:快
每次迭代的计算开销从梯度下降的O(n)降到了常数O(1)。
为了加速训练的过程,可以使用随机梯度下降算法(stochastic gradient descent-SGD)。随机梯度下降算法也是称为"在线学习"。
(1) 这个算法优化的不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快。【在每次更新时用1个样本,可以看到多了随机两个字,随机也就是说我们用样本中的一个例子来近似我所有的样本,来调整θ,因而随机梯度下降是会带来一定的问题,因为计算得到的并不是准确的一个梯度,对于最优化问题,凸问题,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近】
(2) 但是带来了如下问题:
在某一条数据上损失函数更小并不代表在全部数据上的损失函数更小,于是使用随机梯度下降优化得到的神经网络甚至可能无法达到全局最优。随机梯度下降中自变量的迭代轨迹相对于梯度下降中的来说更为曲折。这是由于实验 所添加的噪声使模拟的随机梯度的准确度下降。在实际中,这些噪声通常指训练数据集中的无意 义的干扰。
主要优点:快
为了综合梯度下降算法和随机梯度下降算法的优缺点,在实际应用中一般采用这两个算法的这种----->每次计算一小部分训练数据的损失函数。批梯度下降算法(Mini-batches Learning)在深度学习很多算法的反向传播算法中非常常用。这一小部分训练数据也称为一个batch,因此也引入了batch_size的概念,batch_size顾名思义就是来度量每一个batch中实例的个数。
(1) 引入batch有很好的优势:
a. 通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多。
b. 每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。
--->但是批梯度下降算法带来一个问题,那就是如何选取最优的batch_size?
(2) 可不可以选择一个适中的 Batch_Size 值呢?
当然可以,这就是批梯度下降法(Mini-batches Learning)。因为如果数据集足够充分,那么用一半(甚至少得多)的数据训练算出来的梯度与用全部数据训练出来的梯度是几乎一样的。
(3) 在合理范围内,增大 Batch_Size 有何好处?
a. 内存利用率提高了,大矩阵乘法的并行化效率提高。
b. 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
c. 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。
(4) 盲目增大 Batch_Size 有何坏处?
a. 内存利用率提高了,但是内存容量可能撑不住了。
b. 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
c. Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。
(5)实用trick
基于随机采样得到的梯度的方差在迭代过程中无法减小,因此在实际中,(小批量)随机梯度下降的学习率可以在迭代过程中自我衰减,例如ηt = ηtα(通常α = −1或者−0.5)、ηt = ηαt (如α = 0.95)或者每迭代若干次后将学习率衰减一次。
梯度下降存在的问题:迭代时,会有较大振动,甚至发散,越过最优解。
输入和输出分别为二维向量x = [x1 , x2 ]⊤ 和标量的目标函数f (x) = 0.1x21 + 2x2 。学习率为0.4时自变量的迭代轨迹:
可以看到,同一位置上,目标函数在竖直方向(x2 轴方向)比在水平方向(x1 轴方向)的斜率的 绝对值更大。因此,给定学习率,梯度下降迭代自变量时会使自变量在竖直方向比在水平方向移 动幅度更大。那么,我们需要一个较小的学习率从而避免自变量在竖直方向上越过目标函数最优 解。然而,这会造成自变量在水平方向上朝最优解移动变慢。
怎么办?
动量法的提出是为了解决梯度下降的上述问题。
迭代公式:
动量法在竖直方向上的移动更加平 滑,且在水平方向上更快逼近最优解。
所以,在动量法中,自变量在各个方向上的移动幅度不仅取决于当前梯度,还取决于 过去的各个梯度在各个方向上是否一致。
参考链接:
1.三种方法的介绍:https://zhuanlan.zhihu.com/p/37714263
2. 证明了为什么梯度下降算法可以收敛https://www.zhihu.com/question/27012077/answer/122359602
3.手动深度学习:https://zh.d2l.ai/chapter_prerequisite/install.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。