大白话 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 的更新的步幅是不一样的。
引入 梯度下降法的迭代公式 应为:
把梯度下降法的公式写开来看如下:
虽然看起来这个向量是更新了一次,但实际上它内部更新了几次?是不是每一个变量自己都更新了一次?实际上它是一个双重 for 循环的感觉,外层 for 循环是迭代 k 次(我们人为设置的,在程序里指定的迭代次数),内层 for 循环是迭代 n 次,我们不是有 n 个 W 吗(n 个维度)?迭代 n 次就是每个 W 都要单独的加上自己偏导数的结果的相反数,我们把内部的 for 循环看成一个模块的话,就会得到一个什么? 得到一个 W 向量, W 向量是一个什么情况呢?是一个列向量(N*1),我一次性的把所有这一组 W 的更新看成一个整体的话,它是不是要加上一个向量?也是一个 N*1 的,那么这个向量第一个元素应该是什么?实际上把它看成一个整体的话,每一次是不是原来的 W 向量加上这么一个东西:
这个就叫做 梯度 (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, 也是一个列向量。为,那每个元素的偏导数是,我们称这个为梯度。那么此时算出来的梯度是不是把这个向量里面第一个数数带到第一个元素的偏导数里,第二个数代到第二个元素的偏导函数里边得到两个新的数。随着这两个点的数变化,这两个点的数也在变化,实际上 这个两点的数代表一个向量 , 向量代表了一个方向,指向了方向下降最快的方向。
假如画一个等高线图,
颜色越浅(内环)代表损失函数越小,越深(外环)代表损失函数越大,它实际上就是一个三维图了,只不过用等高线的方式来比较,现在这个图里有两个 W?两个 W 加一个损失函数的值构成了三维空间,那两个 W, 假如点在图中所示位置,是不是它会对θ1 求一次偏导,对θ2 求一次偏导?它求的结果会发现θ1 求偏导应该往下走,θ2 求偏导应该往左走,这两个东西共同形成了一个方向,θ1 减了这么多,θ2 减了这么多,这个点相当于从 x1 跑到 x2 这儿来了,x1-->x2 这个方向就代表在 x1 这个点,梯度下降最快的方向,也就是梯度负方向, 这是梯度的几何意义,梯度标示的就是在三维空间中或者在 N 维空间中这个坡最陡的方向,只不过正梯度方向是往上指的,而负梯度方向是往下指的, 在高维空间中实际上梯度指的就是这个。所以你不要光记着高维空间中梯度这个名字了,你一定要记住梯度是怎么来的,就是他逐个求完偏导之后,把它从上到下依次写下来的一个高高的向量而已。 正好你原来的θ减去现在梯度,相当于每个θ在自己维度上都照着偏导数的方向更新了一次,跟咱们一维情况下更新是一致的。这样实际上是把梯度和咱们原来一维的联系起来了。这就是多维空间的梯度下降。这个东西非常重要。我们还有其它很多种高级的求函数最优化的方法,但梯度下降,它计算成本小,特别适用于参数多的情况下,比方 深度神经网络参数多。所以在参数这么多的情况下,深度神经网络全都是通过反向传播来计算负梯度的方式,更新自己的每一个参数的。 至此,我们官方引入梯度的概念 , 梯度就是把每一个维度的偏导数集合在一起做一个向量。对于多元函数的θ,每次减去梯度值就能让多元损失函数朝着最佳解迈进一步 。解释一下, 梯度就是一个向量,向量中的每一个元素是偏导数 ,其实就是把每一个维度的偏导数给集合在一起拼成一个向量,对于θ来说,用θ减去梯度相当于就是每一个维度(θ本身也有若干的维度 (w1,w2..wn)), 每一个维度都减去了原来这个维度的偏导数,和咱们一元的是能够对上的。
我们再看下当 梯度下降法应用于 MSE 损失函数是:
解释下上面的公式:从第 1 步到第 2 步,根据链式求导法则,这个函数,先对整个外边求导,等于,在对内部的这个求导,等于。把 h(θ) 展开为。那么在第三步中对这里边求偏导,这个东西写开了之后,谁会死掉,谁会活着? 只有跟θj 有关系的项会活着,其他项全是常数项,求导的时候是不是直接就变成零了?所以就剩下跟θj 对着的 Xj 还活着,那么整个这一项求完偏导就剩一个 Xj 了。也就是最后一步。,其中就是对 mse 中把除了θj 之外的其他θ都看成常数,单独对θj 一个求导。
至此,你大概了解了梯度的概念,梯度迭代的方式和过程,但你可能会有几个问题?这里面的损失函数不应该是 m 个样本累加吗?。我们更新梯度的时候每一次都要把全部的 w 代入计算一遍吗?这样会不会太耗时间?有没有其他的办法。带着这些问题请继续阅读第八节梯度下降的不同方式。