本文参考 https://www.cnblogs.com/pinard/p/5970503.html 的文章,转载需注明原作者。
这一节我们为梯度下降法揭开神秘的面纱。
在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降法(Gradient Descent)是最常用的方法之一。另外常用的是最小二乘法。
1. 梯度
首先我们来认识一下什么叫做梯度。
在微积分中,对多元函数的参数求偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。如f(x,y),其梯度向量就是(∂f/∂x, ∂f/∂y)T,简称grad f(x,y)。
梯度向量的几何意义,就是代表了函数变化最快的方向。这里可以这样理解,一个函数在某一个方向上的方向向量为 grad*cos∂,于是梯度就代表了其变化最快的方向。
即沿着梯度向量的方向,就是函数增加最快的方向,更容易找到函数的最大值。这是整个梯度下降法的基本思想。
2. 梯度下降与梯度上升
在机器学习中,我们需要对损失函数求最小化,这时候我们通过梯度下降法来一步步迭代求解。同样的,做一个变化可以反过来求解损失函数 -f(θ) 的最大值,这时候就转化为了梯度上升法。
简单来说,就是上山和下山的关系。
3. 梯度下降法详解
3.1 梯度下降的直观理解
这里的一个直观解释,就是理解成为下山问题。
我们在一座大山的某个位置,这个时候不知道下山的路线,只能“走一步算一步”,每一步都按照当前最陡的方向下山,即梯度负方向;然后在下一个点继续计算当前梯度调整方向,继续走下一步,直到我们觉得已经走下了山。
当然这样的方法,有可能使得我们没有走下山,而是走到了某个山谷处。这就是局部最优解和全局最优解之间的关系。
3.2 梯度下降的相关概念
在详细了解之前,我们需要了解一些概念。
- 步长(Learning Rate):步长即为我们通常理解的步长。其决定了沿着梯度负方向与移动的长度。对应上面下山的例子就是每一步走多少。
- 特征(Feature):指的是样本的输入,即属性。
- 假设函数(Hypothesis Function):监督学习中,用于拟合输入样本而假设的拟合函数。比如在线性模型中,假设函数就是输入属性的线性组合函数。例如:f(x)=w_1x_1+w_2x_2+...+
-
损失函数(Loss Function):线性模型中的损失函数:
3.3 梯度下降的详细计算
详细计算有两种表示:代数法和矩阵法。代数法更加容易理解,但是在单属性样本时更加实用;遇到多属性样本时候,矩阵法更加实用而且好计算。
3.3.1 梯度下降法的代数描述
-
先决条件:确定待优化模型的假设函数和损失函数。
拿线性回归为例子,假设函数为(θi是参数模型):
增加一个特征 x_0=1,则有:
对应上面的假设函数,损失函数为(这里的2m就是求一下平均而已):
-
参数初始化:主要是初始化模型参数θi,算法终止距离ε ,步长α。
在没有任何先验知识的情况下,我们可以把θi初始化为0,将步长初始化为1,然后在调优的时候再优化。 - 算法过程:
这里是对于损失函数求最值,所以是针对损失函数来做梯度下降
(1) 确定损失函数的梯度 ,即对θi求偏导:
(2) 用步长乘以损失函数的梯度,就是当前位置下降的距离,对应于下山例子中的一步。
(3) 考察停止条件。对于所有的参数θi,是否梯度下降的距离都小于 算法终止距离ε,满足则停止迭代。反之进入下一步
(4) 更新所有的 θi,然后转到第一步。
需要注意的是:当前点的梯度是由所有样本决定的。至于样本的选择,下面会介绍到。
3.3.2 矩阵描述
只是把上面的换成了矩阵表示。其中涉及矩阵运算。具体见原帖中推导。
3.4 梯度下降的算法调优
使用梯度下降法时,需要进行调优。
1. 步长选择。
前面的计算中,我们默认取步长为1,但是实际上步长的选取和实际样本取值有关。我们需要多取几个步长,运行梯度下降,如果损失函数在减小就说明这个步长是有效的。
步长太大导致可能错过最优解,太小收敛太慢。
2. 参数的初始值选择
由于可能陷入局部最优解,之前也说过,一个可行的做法就是多试集中初始值。就好像刚刚下山问题中,从不同的地方开始下山。
3. 归一化
不同特征的取值量纲不同,导致迭代速度慢,我们可以对特征取值进行归一化。对于每个特征x,求出他的期望 和 标准差,转化为:
这样特征的新的期望为0,新的方差为1,迭代次数可以大大加快。
4. 梯度下降法大家族(BGD,SGD,MBGD)
这里需要注意的是,所有梯度下降法的基本思想和步骤都是一样的,不同之处在于不同形式的GD如何选取样本。
4.1 批量梯度下降法(Batch Gradient Descent)
批量梯度下降法,是梯度下降法中最常用的形式。具体做法就是在更新参数时 使用所有的样本来进行更新。
4.2 随机梯度下降法(Stochastic Gradient Descent)
随机梯度下降法,在求梯度时没有用所有m个样本数据,而是选取了一个样本 j 来求梯度,对应的更新公式:
这里可以看出,随机梯度下降法SGD和BGD是两个极端,一个选择了一个样本,另外一个选择了所有的样本。各自的优缺点都很突出,从训练速度和训练精度上面可以很好的区分。
那么有没有一种比较折中的办法呢?有
4.3 小批量梯度下降法(Mini-batch Gradient Descent)
对于m个样本,我们采用x个子样本来迭代,1<x<m。一般可以取x=10,需要根据具体的样本数量来调整取得样本数量,对应的更新公式:
5. 梯度下降法和其他无约束优化算法的比较
机器学习中的无约束优化算法,有梯度下降法、最小二乘法、牛顿法、拟牛顿法。
梯度下降法和最小二乘法相比,梯度下降法需要选择步长,而最小二乘法不需要。梯度下降法是计算迭代解,最小二乘法是计算解析解。如果样本量不大而且存在解析解,最小二乘法是更加具有优势的,计算速度快。但是如果样本量很大,用最小二乘法需要计算一个超级大的逆矩阵,这时候就很慢,很难求解。
梯度下降法和牛顿法/拟牛顿法相比,两者都是迭代求解,不过梯度下降法是梯度求解,而牛顿法/拟牛顿法是用二阶的海森矩阵的逆矩阵或伪逆矩阵求解。相对而言,使用牛顿法/拟牛顿法收敛更快。但是每次迭代的时间比梯度下降法长。
牛顿法不懂