这是机器学习的第一章第二节:Gradient descent(梯度下降法)
在学习本节过程中,将会涉及到高等数学中导数与偏导数的相关知识
通过这一节的学习将会了解到以下一个公式的含义:
公式1.2.1:\(\displaystyle \theta_j := \theta_j - \alpha\frac{\partial }{\partial \theta_j}J(\theta_0,\theta_1)\) \((for\:j = 1\:and\:j = 0)\)
通过第一节(Cost function)的学习,我们知道了函数1.1.1(Hypothesis)并且知道了可以通过函数1.1.2(Cost function)计算函数1.1.1适应training set的性能(函数1.1.2计算结果越接近\(0\)性能越好)。那么接下来这一节中我们就来学习如何计算函数1.1.1中的参数\(\theta_0\)和\(\theta_1\),这就引出了本节的标题,Gradient descent,也就是公式1.2.1的内容。
下面给出一个立体图,我们用它来理解梯度下降法(Gradient descent)的原理:(实际计算图像与它不同)
在这个三维坐标系统中,其\(x\)轴和\(y\)轴变成了\(\theta_0\)和\(\theta_1\),即Hypothesis中的两个参数(parameter);\(z\)轴则表示\(J(\theta_0,\theta_1)\),即Cost function的值。我们的目标是不断调整\(\theta_0\)和\(\theta_1\)的值,使得\(J(\theta_0,\theta_1)\)的值达到最小值(或极小值),即如图红色箭头所指位置是我们想要得到的最终结果。
为了到达红色箭头位置,我们采用Gradient descent方法:
1、即对于图像上的一点\((\theta_0,\theta_1,J(\theta_0,\theta_1))\),我们对函数\(J(\theta_0,\theta_1)\)进行求导操作(derivative)(此时就能理解函数1.1.2中的\(\frac{1}{2}\)能够简化计算),将得到在这一点处对图像的切线,切线的斜率是导数值,并且切线的方向将能够告诉我们\(\theta_0\)和\(\theta_1\)前进的方向;
2、根据这一数据,我们可以将\(\theta_0\)和\(\theta_1\)按照指定方向变化一小段距离,这一小段距离由\(\alpha \times J'(\theta_0,\theta_1)\)求得,其中\(\alpha\)成为学习速率(learning rate),后一部分即函数\(J(\theta_0,\theta_1)\)的导数。将产生新的点坐标作为下一次进行变换的来源;
3、重复步骤1、2,如上图黑色线段所示,直至到达最低点。
为了进一步的便于大家理解,我们仍将这一过程简化至\(\theta_0=0\)的情况,此时Cost function只有一个自变量\(\theta_1\),变回二维图像,如下所示:
此时我们计算该点的导数,则可将其带入公式1.2.1进行计算。进一步如下图所示:
首先我们看到,导函数部分,由原来的\(\frac{\partial }{\partial \theta_j}J(\theta_0,\theta_1)\)变为\(\frac{d}{d \theta_j}J(\theta_1)\),容易知道这是因为自变量少了一个\(\theta_0\)的关系,同时符号偏导数\(\partial\)变为导数\(d\)也是因为同一个道理(高等数学相关知识)。我们还会发现,如果将点选在函数最低点右侧,导数结果将为正,此时希望\(\theta_1\)左移即变小,若将点选在函数最低点左侧,导数结果将为负,此时希望\(\theta_1\)右移即变大。因此\(\alpha \times J'(\theta_0,\theta_1)\)前的负号刚好能够满足要求。
接下来讨论Learning rate值\(\alpha\),如下图所示:
我们知道,如果\(\alpha\)的值较小,那么每一次的变化也会很小,就会造成变化很慢,需要大量循环才能得到最优解;如果\(\alpha\)的值较大,那么就有可能存在经过一次变化后越过最小值,且比原函数值还大的情况,此时若循环下去,最终结果将会发散,函数值将无限变大,从而出错。
考虑到每一次求导的结果都是对当前新点的计算,即结果是变化的,因此我们按下图进行分析:
可以发现,在正确选取\(\alpha\)的情况下,新点的斜率将会逐渐趋向于\(0\),也就是\(\theta_1\)的变化将会越来越小,因此我们不难推断,在经过有限次循环后,\(\theta_1\)将能够收敛,并得到函数最小值。
接下来我们回到两个自变量的情况,在理解了其原理后,我们再看公式1.2.1:\(\theta_j := \theta_j - \alpha\frac{\partial }{\partial \theta_j}J(\theta_0,\theta_1)\),首先解释一下"\(:=\)"符号,该符号表示"定义",如果公式1.2.1用"\(=\)",那么这在数学上显然是一个错误的式子(或者\(\alpha\frac{\partial }{\partial \theta_j}J(\theta_0,\theta_1) = 0\),但此时公式将不再有意义),因此,它只是一个表示定义的符号。然后我们看到偏导数部分,符号为"\(\partial\)",由于在有两个自变量的情况下,我们将其分为\(\theta_0\)方向和\(\theta_1\)方向,偏导的作用则是将原函数分为两个方向分别求导数。
现在我们对公式1.2.1的偏导数部分进行计算,此时带入函数1.1.2即Cost function,得到如下结果:
\(\displaystyle \frac{\partial }{\partial \theta_j}J(\theta_0,\theta_1) = \frac{\partial }{\partial \theta_j} \cdot \frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x_i)-y_i)^2 = \frac{\partial }{\partial \theta_j} \cdot \frac{1}{2m}\sum_{i=1}^{m}(\theta_0+\theta_1\cdot x_i-y_i)^2\)
分别讨论\(j = 0\)即对\(\theta_0\)求偏导和\(j = 1\)即对\(\theta_1\)求偏导的情况,得到如下结果:
\(j = 0 : \frac{\partial }{\partial \theta_0}J(\theta_0,\theta_1) = \frac{1}{m}\sum_{i=1}^{m}(h_\theta(x_i)-y_i)\)
\(j = 1 : \frac{\partial }{\partial \theta_1}J(\theta_0,\theta_1) = \frac{1}{m}\sum_{i=1}^{m}(h_\theta(x_i)-y_i)\cdot x_i\)
得到这个结果的作用,是便于我们进行之后的计算。值得注意的是,我们在简化示例(\(\theta_0 = 0\))的情况下,每次变换的只有\(\theta_1\),而在上述讨论中,每次需要变化两个parameter,即\(\theta_0\)和\(\theta_1\)。这时我们需要在每一步操作中同时更新两个parameter然后进行一次循环,如下图所示:
即我们在一次变化parameter \(\theta_0,\theta_1\)的时候,定义式右半部分的\(\theta_0,\theta_1\)均为上一次的值,而不能用这一次生成的\(\theta_0\)来计算新的\(\theta_1\),也不能用这一次生成的\(\theta_1\)来计算新的\(\theta_0\)。
end~