gradient descent 梯度下降算法

            今天给大家介绍一个machine learning中非常基础又非常重要的算法:gradient descent 梯度下降算法。其实在写这篇文章之前,我前面的文章中就有提到gradient descent,它实在是太“氾滥”了,几乎到处都能看到它的身影。那么,它到底是什么?能干什么?它是一种优化算法,在machine learning中经常用来优化目标函数,那什么是目标函数?目标函数根据问题的不同而不同,大家可以看我的另外两篇文章,里面就用到在gradient descent优化目标函数,大家可以看看里面的目标函数是什么,这两篇文章是BP神经网络推荐系统之矩阵分解

       这里就给大家举个稍微简单一点的例子,假设有一堆男生女生的身高体重数据(training set),假《gradient descent 梯度下降算法》一条是身高体重数据,x1是身高,x2是体重,y是类标号,y=1表示这条数据是男生的,y=-1表示这条数据是女生的。我们希望能学习出一个函数f(X),使得f(X)能够尽可能准确地描述这些数据,如果能求出这个f(X),那么任给一个身高体重,就能预测出这人是男生还是女生。

       那么f(X)长什么样?它的形式需要我们来指定,gradient descent只帮我们训练出其中的参数。为了方便讲解,我设f(X)为下面的形式,也就是一个线性的函数(一般来说,非线性的要比线性的函数的拟合能力要强,这里暂不讨论线性与非线性的问题):

《gradient descent 梯度下降算法》

       我们希望f(X)能够尽可能准确地描述training set中的样本,那么如何衡量它描述得准确不准确?那就要定义误差,而定义误差就要和类标号联系起来,因为我们的类标号是y=1表示这条数据是男生的,y=-1表示这条数据是女生的,因此我们希望f(X)对男生的数据输出的值尽量接近1,对女生的数据输出的值尽量接近-1。于是就能计算误差了,对于

男生的数据,误差就是f(X)算出来的值与1的差距,对于女生的数据,误差就是f(X)算出来的值与-1的差距,注意这里的差距,大于或小于都是差距。于是对于一个training set,总的误差函数(cost function)可以定义如下:

《gradient descent 梯度下降算法》

       Xi是第i的样本,Yi是第i个样本对应的类标号,在这里就是1或者-1,因为大于或小于类标号都是误差,而误差是非负的,因此加个平方就可以达到这个效果。但是为什么前面有个1/2呢?回想,梯度下降,那肯定要用到梯度,而求梯度是不是要求导呢?那个1/2可以在后面求导的时候把平方的那个2给消掉,方便后续计算。

       好了,现在有了cost function,那么我们下一步的目标就是,求出一最优的参数,使得cost最小,也就是求当《gradient descent 梯度下降算法》《gradient descent 梯度下降算法》《gradient descent 梯度下降算法》取什么值时,cost最小。那么怎么求呢?大家是否还记得“梯度”这个东西?一个在当时学高等数学的时候看似没用的东西,在这里却有极大的作用,还记得梯度是什么东西吗?梯度是一个向量梯度所指的方向就是函数增长最快的方向,也就是说,如果我们沿着梯度的方向调整参数(注意在cost function中,自变量是参数《gradient descent 梯度下降算法》《gradient descent 梯度下降算法》《gradient descent 梯度下降算法》,而不是x),就可以使我们的cost变化得最快。但是梯度所指的方向就是函数增长最快的方向,而我们是需要cost减少而不是增加,这怎么办呢?取反方向就好了,也就是说,梯度的反方向指向的就是函数值下降最快的方向,因此沿着梯度的反方向调整参数,就能让cost function以最快的速度下降。我们来求L的梯度,那么就要对《gradient descent 梯度下降算法》《gradient descent 梯度下降算法》《gradient descent 梯度下降算法》求偏导:

《gradient descent 梯度下降算法》

《gradient descent 梯度下降算法》

《gradient descent 梯度下降算法》

       接下来让参数沿着梯度方向走,也就是每个分量沿着对应的梯度反方向的分量走,因此参数在每次迭代的更新规则如下:

《gradient descent 梯度下降算法》

        其中《gradient descent 梯度下降算法》是学习率(learning rate),一般取值为0到1之间,它可以控制每步走的大小,走得太大的话,有可能走到临近极佳点时,下一步就跨过去了,这样就不收敛了,走得太慢的话,会迭代很多次才收敛。实际上,learning rate的选择也是有专门研究的,这里就不讨论这个问题啦。

        经过多次迭代之后,我们就得到了《gradient descent 梯度下降算法》《gradient descent 梯度下降算法》《gradient descent 梯度下降算法》的最优值,也就是在这些个参数下,f(X)对于training set的样本的识别误差最小。这样,我们就训练出了f(X),就可以用来识别新的样本。

点赞