简介
在机器学习和深度学习中,需要对训练中的模型构建损失函数,这样才能在训练过程中找到最优的参数。梯度下降法是较常使用的优化算法,在求解过程中,需要求解损失函数的一阶导数。
通俗理解就是:
- 从loss的某一点出发;
- 找到当前最陡的坡(找梯度最大的方向);
- 朝最陡方向走一步(一次迭代后,一步的大小为步长);
- 循环执行2和3,走到最低点。
常见的梯度下降有三种不同的计算方法:批量梯度下降(Batch Gradient Descent)、随机梯度下降(Stochastic Gradient Descent)以及小批量梯度下降(Mini-Batch Gradient Descent)。接下来,我们将对这三种不同的梯度下降法进行探讨。
梯度下降的基本过程
以简单的线性回归模型为例:
1、假设数据集中有m个样本,那么损失函数就是
2、初始化θ0,θ1,...,θm, 算法终止距离ε,以及步长α。可以将所有的θ初始化为0, 将步长初始化为1。那么当前位置损失函数的梯度为:
3、得到了损失函数的梯度也就是找到了方向和距离,用步长乘以梯度计算出要下降的距离。确定是否所有的θi,梯度下降的距离都小于ε,如果小于ε则算法终止,当前所有的θi(i=0,1,...n)即为最终结果。
更新所有的θ,对于θi,θi 的更新表达式如下:
以上三步就是梯度下降计算的基本过程。实例中的梯度下降是一种批量梯度下降,我们在开头一共提到了三种常见的梯度下降方法,下面再继续对比下。
三种梯度下降法的对比
这里我通过列表进行了横向的对比和总结。
方法名称 |
批量梯度下降 |
随机梯度下降 |
小批量梯度下降 |
英文名称 |
BGD(Batch Gradient Descent) |
SGD(Stochastic Gradient Descent) |
MBGD(Mini-Batch Gradient Descent) |
数据集的使用情况 |
每次进行梯度迭代时,使用整个数据集进行计算。 |
每次进行梯度迭代时,随机抽取一个数据样本进行计算。 |
每次进行梯度迭代时,随机抽取小部分数据样本进行计算。 |
适用场景 |
小数据集 |
小数据集 |
大数据集 |
优点 |
1、一次迭代是对所有样本进行计算,实现了并行。 2、使用整体数据集,能够更好的确定的方向,从而代表样本总体,梯度更准确地朝向极值所在的方向。 3、偏差小,标准差小。 4、容易收敛,不易陷入局部极小值的情况。 |
1、每次迭代计算量小,整体的训练速度快。 |
1、可实现并行。 2、训练速度处于适中。批量数值越小,速度越快。 3、每次使用一个batch可以减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。 4、随机选择样例可避免重复的样例和对参数更新较少贡献的样例。 |
缺点 |
1、当数据集样本数 很大时,每迭代一步都需要对所有样本计算,需要很大的算力,训练过程会很慢。 2、每次的更新都是在遍历全部样例之后发生的,会有些例子是多余的且对参数更新没有太大的作用,有冗余的计算。 |
1、不易收敛,容易在最小值附近波动。 2、不能在一个样本中使用向量化计算,学习过程变得很慢。 3、单个样本并不能代表全体样本的规律。 4、易陷入局部极小值情况。 5、不能实现并行。 |
1、训练过程会有振荡,为更接近最小值,需要增加学习率衰减项,以降低学习率,避免过度振荡。 2、batch_size的不当选择可能会带来一些问题。 |
在这三种梯度下降方法中,步长α是都有的参数,小批量梯度下降多出一项batch_size,它实现了在批量梯度下降和随机梯度下降间的切换和平衡。下面我对这两个参数的设置情况和结果做个对比和总结。
参数名称 |
初始化偏大时 |
初始化偏小时 |
Batch_Size |
1、下降方向准确。 2、内存利用率会提高。 3、训练过程稳定,偏差小。 |
1、接近于随机梯度下降,训练过程不稳定。 2、训练速度会加快。 |
步长α |
1、loss值可能会震荡,收敛不稳定。 |
1、loss下降会比较慢。 2、容易陷入局部极小值中。 |
总结
本文可以分为两个部分,第一部分是对梯度下降的作用和计算过程进行了解析,第二部分是对常见的三种梯度下降方法做了对比和总结,小批量梯度下降方法是最常用到的。
感谢大家的浏览,如有不正确的地方还请指正评论~