机器学习的核心思想就是不断优化寻找更合适的参数,当给定一个目标函数之后,自然就是想办法 使真实值和预测值之间的差异越小越好,那么该怎么去做这件事呢?
可以先来想一想下山问题:
为什么是下山呢?因为在这里把目标函数比作山,到底是上山还是下山问题,取决于你优化的目标是越大越好(上山)还是越小越好(下山),而基于最小二乘法判断是下山问题。
那该如何下山呢?看起有两个因素可控制——方向与步长,首先需要知道沿着什么方向走,并且按照该方向前进,在山顶大致一看很多条路可以下山,是不是随便选择一个差不多的方向呢?这好像有点随意,随便散散步就下山了。但是现在情况有点紧急,目标函数不会让你慢慢散步下去,而是希望能够 快速准确地到达山坡最低点,这该怎么办呢?别着急——梯度下降算法来了。
下山方向选择
首先需要明确的是什么方向能够使得下山最快,那必然是最陡峭的,也就是当前位置梯度的反方向 (目标函数J(θ)关于参数θ的梯度是函数上升最快的方向,此时是一个下山问题,所以是梯度的反方向)。当沿着梯度方向下山的时候,位置也在不断发生变化,所以每前进一小步之后,都需要停下来再观察一下接下来的梯度变成什么方向,每次前进都沿着下山最快的也就是梯度的反方向进行。
到这里相信大家已经对梯度下降有了一个直观的认识了,总结一下,就是当要求一个目标函数极值的时候,按照机器学习的思想直接求解看起来并不容易,可以逐步求其最优解。首先确定优化的方向 (也就是梯度),再去实际走那么一步(也就是下降),反复执行这样的步骤,就慢慢完成了梯度下降 任务,每次优化一点,累计起来就是一个大成绩。
在梯度下降过程中,通常每一步都走得很小心,也就是每一次更新的步长都要尽可能小, 才能保证整体的稳定,因为如果步长过大,可能偏离合适的方向。
梯度下降优化
还记得要优化的目标函数吧:
目标就是找到最合适的参数θ,使得目标函数值最小。这里x是数据,y是标签,都是固定的,所以只有参数θ会对最终结果产生影响,此外,还需注意参数θ并不是一个值,可能是很多个参数共同决定了最终的结果,如图所示:
当进行优化的时候,该怎么处理这些参数呢?其中
θ
0
θ_0
θ0与
θ
1
θ_1
θ1分别和不同的数据特征进行组合(例如工资 和年龄),按照之前的想法,既然
x
1
x_1
x1和
x
2
x_2
x2是相互独立的,那么在参数优化的时候自然需要分别考虑
θ
0
θ_0
θ0和
θ
1
θ_1
θ1 的情况,在实际计算中,需要分别对
θ
0
θ_0
θ0和
θ
1
θ_1
θ1求偏导,再进行更新。
下面总结一下梯度下降算法。
第①步:找到当前最合适的方向,对于每个参数都有其各自的方向。
第②步:走一小步,走得越快,方向偏离越多,可能就走错路了。
第③步:按照方向与步伐去更新参数。
第④步:重复第1步~第3步。
首先要明确目标函数,可以看出多个参数都会对结果产生影响,那么要做的就是在各个参数上去寻 找其对应的最合适的方向,接下来就是去走那么一小步,为什么是一小步呢?因为当前求得的方向只是 瞬时最合适的方向,并不意味着这个方向一直都是正确的,这就要求不断进行尝试,每走一小步都要寻找接下来最合适的方向。
梯度下降策略对比
原理还是比较容易理解的,接下来就要看实际应用了,这里假设目标函数仍然是
。
在梯度下降算法中有3种常见的策略:批量梯度下降、随机梯度下降和小批量梯度下降,这3种策略的基本思想都是一致的,只是在计算过程中选择样本的数量有所不同,下面分别进行讨论。
(1)批量梯度下降。
此时需要考虑所有样本数据,每一次迭代优化计算在公式中都需要把所有的样本计算一遍,该方法容易得到最优解,因为每一次迭代的时候都会选择整体最优的方向。方法虽好,但也存在问题,如果样本数量非常大,就会导致迭代速度非常慢,下面是批量梯度下降的计算公式:
细心的读者应该会发现,在更新参数的时候取了一个负号,这是因为现在要求解的是一个下山问 题,即沿着梯度的反方向去前进。1/m其中 表示对所选择的样本求其平均损失,i表示选择的样本数据,j表示特征。例如表示工资所对应的参数,在更新时数据也需选择工资这一列,这是一一对应的关系。在更 新时还涉及系数a,其含义就是更新幅度的大小,也就是之前讨论的步长,下节还会详细讨论其作用。
(2)随机梯度下降。
考虑批量梯度下降速度的问题,如果每次仅使用一个样本,迭代速度就会大大提升。那么新的问题又来了,速度虽快,却不一定每次都朝着收敛的方向,因为只考虑一个样本有点太绝对了,要是拿到的样本是异常点或者错误点可能还会导致结果更差。下面是随机梯度下降的计算公式,它与批量梯度下降的计算公式的区别仅在于选择样本数量:
(3)小批量梯度下降。
综合考虑批量和随机梯度下降的优缺点,是不是感觉它们都太绝对了,要么全部,要么一个,如果在总体样本数据中选出一批不是更好吗?可以是10个、100个、1000个,但是程序员应该更喜欢16、32、64、128这些数字,所以通常见到的小批量梯度下降都是这类值,其实并没有特殊的含义。下面我们来看一下选择10个样本数据进行更新的情况:
对比不同梯度下降的策略,实际中最常使用的是小批量梯度下降,通常会把选择的样本个数叫作batch,也就是32、64、128这些数,那么数值的大小对结果有什么影响呢?可以说,在时间和硬件配置允许的条件下,尽可能选择更大的batch吧,这会使得迭代优化结果更好一些。
学习率对结果的影响
选择合适的更新方向,这只是一方面,下面还需要走走看,可以认为步长就是学习率(更新参数值 的大小),通常都会选择较小的学习率,以及较多的迭代次数,正常的学习曲线走势如图所示:
随着迭代的进行,目标函数会逐渐降低,直到达到饱和收敛状态,这里只需观察迭代 过程中曲线的形状变化,具体数值还是需要结合实际数据。
如果选择较大的学习率,会对结果产生什么影响呢?此时学习过程可能会变得不平稳,因为这一步可能跨越太大了,偏离了正确的方向,如下图所示:
在迭代过程中出现不平稳的现象,目标函数始终没能达到收敛状态,甚至学习效果越来越差,这很 可能是学习率过大或者选择样本数据过小以及数据预处理问题所导致的。
学习率通常设置得较小,但是学习率太小又会使得迭代速度很慢,那么,如何寻找一个适中的值呢?
如下图所示,较大的学习率并不会使得目标函数降低,较小的学习率看起来还不错,可以选择较多 的迭代次数来保证达到收敛状态,所以,在实际中宁肯花费更多时间,也不要做无用功。
学习率的选择是机器学习任务中非常重要的一部分,调参过程同样也是反复进行实验以选择最合适的各项参数,通用的做法就是从较小的学习率开始尝试,如果遇到不平稳现象,那就调小学习率。