大白话 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} 这个两点的数代表一个向量向量代表了一个方向,指向了方向下降最快的方向。

假如画一个等高线图,

20190318203941223.png

颜色越浅(内环)代表损失函数越小,越深(外环)代表损失函数越大,它实际上就是一个三维图了,只不过用等高线的方式来比较,现在这个图里有两个 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 代入计算一遍吗?这样会不会太耗时间?有没有其他的办法。带着这些问题请继续阅读第八节梯度下降的不同方式。