前言
之前已经提到了代价函数,它是衡量我们目前的预测函数h的好坏程度的,可是不能光让它在那坏着,我们需要让我们的代价函数变好起来,这就需要我们的梯度下降算法登场了(gradient descent)。
怎么下降
首先优化代价函数的方法肯定不止这一种,但是这一种比较常见而且也是很通俗易懂的,所以一般入门都会提到这个算法。还记得我们的代价函数长什么样子吗。
可以看到如果只看每一项(把求和符号和前面的除2m去掉),它就是一个二次函数(关于θ的),高中时候就知道二次函数是一个抛物线的形式。这里假设它是个开口朝上的二次函数,我们在经过初始化后的θ带进去后值比较靠上方的位置如下
我们知道这个函数的值代表着我们的输出结果离我们的目标值的差距,所以如果像上面的图一样我们的点对应的y值很大,我们需要让我们的点尽可能的下降到最低点。这里有两个办法,我们知道这种抛物线的最低点我们可以直接计算获得,这种方法这里暂时不说,所说它就是一条公式,但是要推导出来可没那么容易(这里的公式可不是高中那种就一个输入X的公式,而是输入很多的更为复杂的),直接套公式适用于训练集不算太大的情况下,因为数据多的时候计算量超大。
下面还是说回我们的主角,我们需要一种办法,每一步的计算量不大让它的值慢慢下降到最低点,就如一个人下山一样每次只迈一小步,然后慢慢向下到山底。
很巧的是我们有一个东西可以反映出我们曲线在每一点的陡峭程度——导数,大学知识还没忘都还记得,在某一点的导数就是该函数在这一点的切线,曲线越接近垂直,导数在这一点的值就越大。这是一种很好的方法让我们减小我们的θ值。
上图中那个点的切线斜率是正的,并且比较大的,那么让我们的初始θ减去它自己在这一点的导数(也就是斜率),现在我们的点便会下降一点,而且根据图形可以看出,越往下降,切线的斜率越小,慢慢的就会接近最低点了。
如何计算
一定记住一点,代价函数是关于θ的函数而不是x,预测函数h才是关于x的,在代价函数里x都是已知的量。
其实不难发现上面介绍的梯度下降是在只考虑θ1的情况下,并没有考虑之前公式里的θ0。现在我们就只考虑θ1的情况下来看看该如何计算上述方法。
这个式子有几个地方需要注意,首先就是减号后面,忽略掉α后这个式子就是代价函数对θ1的导数。记住现在的h(x):
h(xi)=θ1*xi;
导数没忘的计算出这个结果不是难事。
第二点就是刚才我们忽略掉的α,它被称作学习率(learning rate),就是让导数乘上它,用来决定下降的幅度,如何选取它并没有明确的规定,需要你在实际问题中去尝试。太小的学习率会让这个算法执行很多遍才能到达理想的效果。但是太大的学习率则更为致命,它可能导致你这个函数最终发散,永远得不到你想要的结果。
为什么还会发散呢,根据上图,假设我们的初始点在a点,然后下降到b点再到c点,此时如果学习率太大,下一次的下降有可能跨过了最低点而到了d点,至此我们的算法就走上了不归路,此时点到了左边,斜率变成负的了,根据上面的梯度下降的式子,减去一个负数就是加上它的绝对值,所以我们的点会越来越高,而且每次跨度会比上一次更大。
综上,过大的学习率会让我们的点冲破天际,一去不复返,所以选取学习率也是比较重要的。
最后还有一点,上面例子都是举了开口朝上的函数以及初始点处的切线斜率为正的情况。其它情况经过验证其实都是正确的,这里不一一列举。
两个参数呢
如果我们把θ0加上呢,其实跟上面没什么两样,我们只不过是对两个θ分别减去它们的导数,循环一定的次数,只不过多变量求导我们给了它另外的名字,叫做偏导数,球θ0偏导的时候只要把θ1看作常量,然后正常对θ0求导就行了(不知道的只能去翻翻高数书了-。-).所以最终的梯度下降的数学算式如下:
可以看到θ1跟刚才一样,θ0也很容易得出。
那么经过循环执行这一步骤,可能是100次,或者500次,我们就可以得到我们想要的θ,这时我们的预测函数h表现那是very good的。
结尾
至此单变量的线性回归模型已经大致讲完了,具体实现的话,基本所有语言都能做,像matlab,python,java,octave之类的。不过现在的大趋势是python,可以说它在这方面真的很火,而且又有封装的很好的各种科学计算库,像numpy之类的,所以实现上述过程并不困难。
不过还有一些技巧并没有写出来,像上面的梯度下降,我们真的要写个for循环然后一遍一遍的执行吗。
答案是否定的,有一种叫做向量化的办法可以让我们只需要一行代码就可以执行for循环做的所有工作。下面还会继续介绍这种方法,简洁才是王道对吧,况且速度也快了不止一点。
当然这是最最简单的模型了,我们还有多变量的线性回归,逻辑回归,还有近几年大火的神经网络以及各种其它模型......
人工智能的领域是十分广阔的,没有人精通人工智能的所有部分,有的从事深度网络,有的从事计算机视觉或是语音等等。
人类发展到现在真的是不可思议不是吗。
当然我也只是个入门的小菜,接下来我也还会继续学习,不断充实自己,人的一生就是不断学习的过程这话说的还真不错,学累了就去玩会吧(><)。