一、什么是梯度
在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。
比如函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(∂f/∂x, ∂f/∂y)T,简称grad f(x,y)或者▽f(x,y)。
对于在点(x0,y0)的具体梯度向量就是(∂f/∂x0, ∂f/∂y0)T.或者▽f(x0,y0),如果是3个参数的向量梯度,就是(∂f/∂x, ∂f/∂y,∂f/∂z)T,以此类推。
几何意义:函数变化增加最快的地方。
具体来说,对于函数f(x,y),在点(x0,y0),沿着梯度向量的方向就是(∂f/∂x0, ∂f/∂y0)T的方向是f(x,y)增加最快的地方。或者说,沿着梯度向量的方向,更加容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,也就是 -(∂f/∂x0, ∂f/∂y0)T的方向,梯度减少最快,也就是更加容易找到函数的最小值。
二、梯度下降与梯度上升
在机器学习算法中,在最小化损失函数时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数,和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。
梯度下降法和梯度上升法是可以互相转化的。比如我们需要求解损失函数f(θ)的最小值,这时我们需要用梯度下降法来迭代求解。但是实际上,我们可以反过来求解损失函数 -f(θ)的最大值,这时梯度上升法就派上用场了。
三、梯度下降算法
比如我们在一座大山上的某处位置,由于我们不知道怎么下山,于是决定走一步算一步,也就是在每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,然后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置走一步。这样一步步的走下去,一直走到觉得我们已经到了山脚。当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处。
可以看出,梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解。当然,如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。
相关概念:
步长(Learning rate):步长决定了在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度。用上面下山的例子,步长就是在当前这一步所在位置沿着最陡峭最易下山的位置走的那一步的长度。
特征(feature):指的是样本中输入部分,比如2个单特征的样本(x(0),y(0)),(x(1),y(1))
假设函数(hypothesis function):在监督学习中,为了拟合输入样本,而使用的假设函数,记为hθ(x)。比如对于单个特征的m个样本(x(i),y(i))(i=1,2,...m)。可以采用拟合函数如下: hθ(x)=θ0+θ1x
损失函数(loss function):为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。损失函数用 J(θ)表示。
四、梯度下降算法的三种方式(以线性回归为例)
假设特征和结果都满足线性。即不大于一次方。这个是针对 收集的数据而言。收集的数据中,每一个分量,就可以看做一个特征数据。每个特征至少对应一个未知的参数。这样就形成了一个线性模型函数,向量表示形式:
这个就是一个组合问题,已知一些数据,如何求里面的未知参数θ,给出一个最优解。 一个线性矩阵方程,直接求解,很可能无法直接求解。有唯一解的数据集,微乎其微。基本上都是解不存在的超定方程组。因此,需要退一步,将参数求解问题,转化为求最小误差问题,求出一个最接近的解,这就是一个松弛求解。
求一个最接近解,直观上,就能想到,误差最小的表达形式。仍然是一个含未知参数的线性模型,一堆观测数据,其模型与数据的误差最小的形式,模型与数据差的平方和最小:
更新目标函数的参数:
对目标函数求导:
α is calledthe learning rate,代表下降幅度,步长,小会导致收敛慢,大会导致错过最优点。所以公式含义就是,每次在梯度方向下降一步。
把(1)式带到(2)式,令α为1,则参数更新为:
(3)式就是批量梯度下降法(Batch Gradient Descent,简称BGD),它的具体思路是在更新每一参数时都使用所有的样本来进行更新。这个方法问题就是,容易得到最优解,但是由于每次考虑所有样本,速度很慢,当样本点很大的时候,基本就没法算了。
所以提出一种stochastic gradient descent(随机梯度下降SGD)。想法很简单,即每次只考虑一个样本点,而不是所有样本点。那么公式就变为:
每次迭代一个样本,只是考虑让该样本点的J(θ)趋向最小,而不管其他的样本点 。这样算法会很快,但是收敛的过程会比较曲折,不一定每次都朝着收敛的方向。
比较:随机梯度下降法和批量梯度下降法是两个极端,一个采用所有数据来梯度下降,一个用一个样本来梯度下降。自然各自的优缺点都非常突出。对于训练速度来说,随机梯度下降法由于每次仅仅采用一个样本来迭代,训练速度很快,而批量梯度下降法在样本量很大的时候,训练速度不能让人满意。对于准确度来说,随机梯度下降法用于仅仅用一个样本决定梯度方向,导致解很有可能不是最优。对于收敛速度来说,由于随机梯度下降法一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。所以提出一个折中的方法:
小批量梯度下降法(Mini-batch Gradient Descent):
它的具体思路是在更新每一参数时都使用一部分样本来进行更新,也就是式(3)中的m的值大于1小于所有样本的数量。批处理数量:32、64、128等。
如果样本量比较小,采用批量梯度下降算法。如果样本太大,或者在线算法,使用随机梯度下降算法。在实际的一般情况下,采用小批量梯度下降算法。
五、梯度下降算法矩阵法推导
我们先将参数使用矩阵表示:
其中m代表是m个样本。
当我们将样本使用矩阵表示以后,h(θ)的表示就变成了:
既然我们的h(θ)可以使用矩阵表示,那我们的误差函数J(θ)自然也可以使用矩阵去表示。
通过一个m*n的矩阵我们就可以将有N个特征值、M个训练样本的误差值表示出来。
让我们来看看使用矩阵的时候,θ在何种情况下J(θ)取得最小值,也就是我们的目标θ矩阵。
则推导如下:
所以,使用矩阵表示损失函数最小值的最终公式变为:
六、更新参数时(学习率)步长 α 的选择
学习率的选择对结果会产生巨大的影响,一般小一些,根据上图进行调节。小的学习率,意味迭代速度很慢。用小的学习率进行学习,用大的迭代次数进行迭代。α刚开始一般选择0.01
刚开始时,学习率大一些,越往后,学习率选择越小。如前1万次,α=0.01,1万到2万,α=0.001,2万到3万,α=0.0001。