大白话5分钟带你走进人工智能-第七节梯度下降之梯度概念和梯度迭代过程(2)

                                                        第七节梯度下降之梯度概念和梯度迭代过程(2)

上一节中针对一元函数,找到了一个看起来还不错的一种寻求数值上的最小值的这种方式。大致是这么一个流程,F(w)和F'(w),上来先瞎蒙出来一组w,然后带到这里边能得到一个结果,然后该开始迭代了,w1等于w0加上负的F`(w)还得乘一个λ,我们通常称λ叫做学习率。 在API的接口里叫Learning rate,加上学习率之后,就让它一直往下迭代就可以了,通常W是个向量,之前是一个数,更新的话是先求导,再更新,现在变成向量了,需要怎么做呢?求偏导,再更新。所谓偏导就是对F(w)求导,假如它四个自变量你对谁求导就把它看成唯一的自变量,其他的这些东西都当做常数来看,这就是求偏导。它是逐个击破的思路。 原来我们只有一个W对吧?我们就对它求个倒数就完了,把W带进去,加上一个负导数乘以λ,即w1=w0+λ(-f’(w))。我们现在有四个W,我就逐个求导,假设此时的F(w)=4w1+w1*w2+4w3+2w4*w3,我在更新W1的时候,是把这个函数对谁求导?对W1求导。此时W2,W3,W4是不是当做常数来看待?你会得到一个新的函数,叫J',我就给它起名叫J',它也是是关于W1,W2,W3,W4这四个数的解析式J'(W1,W2,W3,W4),结果为F'(w1)=4+w2+0,把原来的W1,W2,W3,W4往J'里带,得到一个具体的数。F'(w1)=4+w2+0=5,假如α=0.1,那么更新我的第一代W也就是(w零)的时候,就是2-0.5,此时(W一)变成了1.5。

w零 w一
w1----2  
w2----1  
w3-----3  
w4-----2  

接下来是不是咱们更新(w零)的第二个数(表格中的第二行)了,应该怎么办?对W2求偏导,F'(w2)=w1。那此时还把这四个带进去,虽然只用上了W1,得到什么结果?F'(w2)=w1=2,这个α还是0.1,此时新的(W一)应该等于多少? 1-0.2=0.8。你发现还一样吗?不一样的差异在哪儿?差异在于你对不同的自变量求完偏导之后,得到的这个函数是不一样的,虽然你同样都带2,1,3,4进去,但导函数不同了,结果也是不同的,所以每个w的更新的步幅是不一样的。

引入梯度下降法的迭代公式应为:

                                                                    \theta =\theta -\alpha \cdot \frac{\partial J(\theta )}{\partial \left ( \theta \right )}

 把梯度下降法的公式写开来看如下:

                                                                     \\w_{1new}=w_{1}old-\alpha \partial J(w1)/\partial w_{1}old \\w_{2new}=w_{2}old-\alpha \partial J(w2)/\partial w_{2}old \\w_{3new}=w_{3}old-\alpha \partial J(w3)/\partial w_{3}old \\w_{4new}=w_{4}old-\alpha \partial J(w4)/\partial w_{4}old

虽然看起来这个向量是更新了一次,但实际上它内部更新了几次?是不是每一个变量自己都更新了一次?实际上它是一个双重for循环的感觉,外层for循环是迭代k次(我们人为设置的,在程序里指定的迭代次数),内层for循环是迭代n次,我们不是有n个W吗(n个维度)?迭代n次就是每个W都要单独的加上自己偏导数的结果的相反数,我们把内部的for循环看成一个模块的话,就会得到一个什么? 得到一个W向量, W向量是一个什么情况呢?是一个列向量(N*1),我一次性的把所有这一组W的更新看成一个整体的话,它是不是要加上一个向量?也是一个N*1的,那么这个向量第一个元素应该是什么?实际上把它看成一个整体的话,每一次是不是原来的W向量加上这么一个东西:

                                                                                         \left.\begin{matrix} \frac{\partial J}{\partial w0} \\ \\ \frac{\partial J}{\partial w1}\\\\ \frac{\partial J}{\partial w2}\\\\ \\....\\ \\ \frac{\partial J}{\partial wn}\\ \end{matrix}\right\}

这个就叫做梯度(gradient)。所谓梯度是什么?是数还是函数?其实梯度是数。因为这个更新实际上是两步。第一步求完偏导之后,得到的是一个函数,就像刚才咱们举的excel里的列例子一样,第一步求完偏导之后得到的是导函数F'(w1)=4+w2+0,接下来你把数代入,带进去的是W1,W2,W3,W4共同带进去,有谁就带谁,把数带进去得到的数才是梯度,我们称那一组函数写在向量里的叫梯度函数,就像导函数和导数的关系一样。那么当(w零)变成了(w一)的时候,梯度里边的每一个数会不会变? 因为你虽然都是求导数,但求完导数代的数不一样,(w零)代的是2,1,3,2,(w一)代的是(w一)所对应的数,假设为1.8,2.4,3.7,4.6,所以每一次代入的数都不一样,梯度每一次也都在变。

我们再从另一个角度看,能不能把2,1,3,2看作一个高维空间中的点,那么在空间中每个点跟每个点的梯度是一样的吗?是不一样的。 因为点一但变了,你带到导函数每一个元素的数是不是都变了?得到结果是不是也变了?所以我们想象假设二维空间就一平面,现在没有这么多w了,就两个w,也是一个列向量。为\begin{bmatrix} W_{1}^{0}\\ W_{2}^{0} \end{bmatrix},那每个元素的偏导数是\begin{bmatrix} \frac{\partial J}{\partial w_{1}^{0}} \\\\ \frac{\partial J}{\partial w_{2}^{0}} \end{bmatrix},我们称这个为梯度。那么此时算出来的梯度是不是把\begin{bmatrix} W_{1}^{0}\\ W_{2}^{0} \end{bmatrix}这个向量里面第一个数数带到第一个元素的偏导数里,第二个数代到第二个元素的偏导函数里边得到两个新的数。随着\begin{bmatrix} W_{1}^{0}\\ W_{2}^{0} \end{bmatrix}这两个点的数变化,\begin{bmatrix} \frac{\partial J}{\partial w_{1}^{0}} \\\\ \frac{\partial J}{\partial w_{2}^{0}} \end{bmatrix}这两个点的数也在变化,实际上\begin{bmatrix} \frac{\partial J}{\partial w_{1}^{0}} \\\\ \frac{\partial J}{\partial w_{2}^{0}} \end{bmatrix}这个两点的数代表一个向量向量代表了一个方向,指向了方向下降最快的方向。

假如画一个等高线图,

大白话5分钟带你走进人工智能-第七节梯度下降之梯度概念和梯度迭代过程(2)_第1张图片

颜色越浅(内环)代表损失函数越小,越深(外环)代表损失函数越大,它实际上就是一个三维图了,只不过用等高线的方式来比较,现在这个图里有两个W?两个W加一个损失函数的值构成了三维空间,那两个W,假如点在图中所示位置,是不是它会对θ1求一次偏导,对θ2求一次偏导?它求的结果会发现θ1求偏导应该往下走,θ2求偏导应该往左走,这两个东西共同形成了一个方向,θ1减了这么多,θ2减了这么多,这个点相当于从x1跑到x2这儿来了,x1-->x2这个方向就代表在x1这个点,梯度下降最快的方向,也就是梯度负方向,这是梯度的几何意义,梯度标示的就是在三维空间中或者在N维空间中这个坡最陡的方向,只不过正梯度方向是往上指的,而负梯度方向是往下指的,在高维空间中实际上梯度指的就是这个。所以你不要光记着高维空间中梯度这个名字了,你一定要记住梯度是怎么来的,就是他逐个求完偏导之后,把它从上到下依次写下来的一个高高的向量而已。 正好你原来的θ减去现在梯度,相当于每个θ在自己维度上都照着偏导数的方向更新了一次,跟咱们一维情况下更新是一致的。这样实际上是把梯度和咱们原来一维的联系起来了。这就是多维空间的梯度下降。这个东西非常重要。我们还有其它很多种高级的求函数最优化的方法,但梯度下降,它计算成本小,特别适用于参数多的情况下,比方 深度神经网络参数多。所以在参数这么多的情况下,深度神经网络全都是通过反向传播来计算负梯度的方式,更新自己的每一个参数的。至此,我们官方引入梯度的概念 ,梯度就是把每一个维度的偏导数集合在一起做一个向量。对于多元函数的θ,每次减去梯度值就能让多元损失函数朝着最佳解迈进一步。解释一下,梯度就是一个向量,向量中的每一个元素是偏导数,其实就是把每一个维度的偏导数给集合在一起拼成一个向量,对于θ来说,用θ减去梯度相当于就是每一个维度(θ本身也有若干的维度(w1,w2..wn)),每一个维度都减去了原来这个维度的偏导数,和咱们一元的是能够对上的。

我们再看下当梯度下降法应用于MSE损失函数是:

                                            \frac{\partial J(\theta )}{\theta _{j}}=\frac{\partial J(\theta )}{\theta _{j}}\cdot \frac{1}{2}(h_{\theta(x)}-y)^{2}

                                                        =2.\frac{1}{2}(h_{\theta}(x)-y)\cdot\frac{\partial }{\partial \theta_j}(h_{\theta}-y)

                                                        =(h_{\theta}(x)-y)\cdot\frac{\partial}{\partial\theta_{j}}(\sum_{i=1}^{n}{\theta_{i}}{x_{i}}-y)

                                                         =(h_\theta(x)-y)x_{j}

解释下上面的公式:从第1步到第2步,根据链式求导法则,这个函数\frac{1}2{}(h_{\theta(x)}-y)^{2},先对整个外边求导,等于2\cdot\frac{1}{2}(h_{\theta(x)}-y),在对内部的这个(h_{\theta(x)}-y)求导,等于\frac{\partial }{\partial \theta_j}(h_{\theta}-y)。把h(θ)展开为\sum_{i=1}^{n}{\theta_{i}}{x_{i}}。那么在第三步中对\frac{\partial}{\partial\theta_{j}}(\sum_{i=1}^{n}{\theta_{i}}{x_{i}}-y)这里边求偏导,这个东西写开了之后,谁会死掉,谁会活着? 只有跟θj有关系的项会活着,其他项全是常数项,求导的时候是不是直接就变成零了?所以就剩下跟θj对着的Xj还活着,那么整个这一项求完偏导就剩一个Xj了。也就是最后一步。\frac{\partial J(\theta )}{\partial \theta _{j}}=(h_{\theta }(x)-y)xj,其中\frac{\partial J(\theta )}{\partial \theta _{j}}就是对mse中把除了θj之外的其他θ都看成常数,单独对θj一个求导。

至此,你大概了解了梯度的概念,梯度迭代的方式和过程,但你可能会有几个问题?\frac{\partial J(\theta )}{\theta _{j}}=\frac{\partial J(\theta )}{\theta _{j}}\cdot \frac{1}{2}(h_{\theta(x)}-y)^{2}这里面的损失函数不应该是m个样本累加\sum_{i=1}^{m}吗?。我们更新梯度的时候每一次都要把全部的w代入计算一遍吗?这样会不会太耗时间?有没有其他的办法。带着这些问题请继续阅读第八节梯度下降的不同方式。

你可能感兴趣的:(机器学习,机器学习)