原文:http://blog.csdn.net/OrthocenterChocolate/article/details/39374939
今天给大家介绍一个machine learning中非常基础又非常重要的算法:gradient descent 梯度下降算法。其实在写这篇文章之前,我前面的文章中就有提到gradient descent,它实在是太“泛滥”了,几乎到处都能看到它的身影。那么,它到底是什么?能干什么?它是一种优化算法,在machine learning中经常用来优化目标函数,那什么是目标函数?目标函数根据问题的不同而不同,大家可以看我的另外两篇文章,里面就用到在gradient descent优化目标函数,大家可以看看里面的目标函数是什么,这两篇文章是BP神经网络和推荐系统之矩阵分解。
这里就给大家举个稍微简单一点的例子,假设有一堆男生女生的身高体重数据(training set),假
那么f(X)长什么样?它的形式需要我们来指定,gradient descent只帮我们训练出其中的参数。为了方便讲解,我设f(X)为下面的形式,也就是一个线性的函数(一般来说,非线性的要比线性的函数的拟合能力要强,这里暂不讨论线性与非线性的问题):
我们希望f(X)能够尽可能准确地描述training set中的样本,那么如何衡量它描述得准确不准确?那就要定义误差,而定义误差就要和类标号联系起来,因为我们的类标号是y=1表示这条数据是男生的,y=-1表示这条数据是女生的,因此我们希望f(X)对男生的数据输出的值尽量接近1,对女生的数据输出的值尽量接近-1。于是就能计算误差了,对于
男生的数据,误差就是f(X)算出来的值与1的差距,对于女生的数据,误差就是f(X)算出来的值与-1的差距,注意这里的差距,大于或小于都是差距。于是对于一个training set,总的误差函数(cost function)可以定义如下:
Xi是第i的样本,Yi是第i个样本对应的类标号,在这里就是1或者-1,因为大于或小于类标号都是误差,而误差是非负的,因此加个平方就可以达到这个效果。但是为什么前面有个1/2呢?回想,梯度下降,那肯定要用到梯度,而求梯度是不是要求导呢?那个1/2可以在后面求导的时候把平方的那个2给消掉,方便后续计算。
好了,现在有了cost function,那么我们下一步的目标就是,求出一最优的参数,使得cost最小,也就是求当
接下来让参数沿着梯度方向走,也就是每个分量沿着对应的梯度反方向的分量走,因此参数在每次迭代的更新规则如下:
其中
经过多次迭代之后,我们就得到了
网友评论