大白话 5 分钟带你走进人工智能 - 第十二节梯度下降之背后的原理之泰勒公式 (7)

大白话 5 分钟带你走进人工智能 - 第十二节梯度下降之背后的原理之泰勒公式 (7)

我们接下来给大家深化一下,梯度下降背后到底是什么原理?谈到这个,我们要谈到一个叫泰勒展开的这么一个数学定理,泰勒发现 任何一个函数不用管它有多复杂,不管它什么样,千奇百怪的任何一个函数,都可以写成关于 N 阶导数的一个多项式。即

f(x)=\sum_{n=0}^{N} \frac{f^{(n)}(a)}{n !}(x-a)^{n}+R_{n}(x)

解释下,在 A 点附近,比如说 A 为 1,那么在 1 附近,那么 f(x)=f(1), 你有个解析式,f(1) 总能算出来,把 1 丢进去算出来,那么泰勒展开即:

f(x)=\frac{f(1) (x-1)^{0}}{1}+\frac{f{}'(1) (x-1)^{1} }{1} +\frac{f{}''(x-1)^{2} }{2}+\frac{f^{\prime \prime\prime}(x-1)^{3} }{6}+...

f^{\prime \prime}是二阶导数,什么叫二阶导数?导函数再求一下导。这么一直这么往下加,加到余项为零的时候就加完了。假如余项始终不为零,它就一直无限这么加下去,加的项越多,这个函数越像原始的函数。

泰勒公式实际上用多项式函数去逼近一个光滑函数 ,什么叫逼近?因为它是把一个原始的函数拆成好多项了,那么拆项越多,这个加出来的结果就越像原函数。那好好的一个普通的函数,你为什么非得要给它拆成好多项呢? 一个 X2+1,就两项很简单的,你为什么要给它变成 N 项?实际上不是所有的函数都是能这么写,比如 sin X,在计算机里,实际上计算 sin X 背后的本质是它他先进行完了泰勒展开,展开成 200 多项,然后把这 200 多项算出来,得到 sin X 到底是多少。这个是交给计算机计算的这么一种方式。再比如f(x)=e^{x},此时我令 a=0,就相当于在零点附近给它展开。如果按照刚才展开式来讲的话,零阶展开就是 n 等于 0,F(x)=e^{0} * 1=1,X 轴是 x=1, 你发现 0 阶展开,如果把余项抛弃了的话,就是一条直线,这条直线像原函数吗?看起来不像。但在 x=0 这一点上的这条直线跟这个原函数很像。假如阶数增高的话,如图:
20190416202718348.png20190416202750278.png20190416202916336.png20190416202939195.png20190416203008506.png

可以看到,随着阶数的升高,甚至仅仅到达十阶展开的时候,在我们肉眼可及的地方,它跟原函数已经非常接近了。零阶展开,如果就光说零附近的话,即使是零阶展开,在极小的区域里它也是比较像的,对吧? 随着阶数越来越多,是不是离零越远的地方也越跟原函数很像 了?这就是 泰勒展开的本质。它实际上就是通过在某一点附近用一个多项式去逼近原来的原函数,你可以理解为它是一个原函数的近似取值。

回到我们梯度下降来说,我们梯 度下降其实就是对原函数展开一个一阶泰勒近似 。 假如对泰勒展开式在 x0 进行一阶泰勒展开,只得到两项。第一项就是 f(x0), 第二项就是(x-x0)f`(x0)。这个式子里谁是未知数?谁是已知数?可以发现只有 x 是未知数,剩下这些数虽然写的是字母,但实际上你带到真实的场景里,就能算出来是具体的数。假如此时的 f 是损失函数的话,在 x0 的值是可求的,x0 点的导数也可求。这 x0 自然也是知道的,所以它的一阶泰勒的近似公式就是已经知道的了。

我们看梯度下降是怎么来的? 回到函数最优化问题上,如果我初始出来一组 W0 了,你想让 W0 加上λd 这个东西之后带回到损失函数里,希望损失函数越小越好。也就是 我们想要找到一个 λd 使上一代的 w+λd 后 损失函数下降得最多,即 min 𝐸 𝑤0 + 𝜆𝑑 。λ是学习率,d 应该等于什么值?按照之前经验,d 应该等于负的梯度才对。为什么 d 等于负梯度?我们来一步步推导。我们 对 E 在 w0 附近进行一阶泰勒展开:

\mathrm{E}(w) \approx E\left(w_{0}\right)+\left(w-w_{0}\right) f^{\prime}\left(w_{0}\right)

如果把𝑤0 + 𝜆𝘦入到上面的展开式里面也就是:

\begin{aligned} E\left(w_{0}+\lambda d\right) & \approx E\left(w_{0}\right)+\left(w_{0}+\lambda d-w_{0}\right) \cdot g\left(w_{0}\right) \\ &=E\left(w_{0}\right)+\lambda d \cdot g\left(w_{0}\right) \end{aligned}

我们进行完一阶泰勒展开之后,我想要让损失函数:

E(w_{0}+\lambda d\right))==E\left(w_{0}\right)+\lambda d \cdot g\left(w_{0}\right)

越小越好。看第一项 E(𝑤0) 能改变大小吗?它已经是一个既成事实了,λ是你人为定的,所以只有让 d.g(𝑤0) 越小越好。我们先回顾下向量点乘的几何含义:

$a \bullet b=|a| b | \cos \theta$

也就是两个向量长度乘积再乘一个向量之间的夹角 cosθ。所以d \cdot g\left(w_{0}\right)=|d| g\left(w_{0}\right) | \cos \theta$。怎么让这结果最小,我们假设 d 向量长度变小一点,这样能让 d*g(𝑤0) 这项更小,但是你仔细想,d 如果太大小了的话,一阶泰勒展开的不等号还能成立吗?因为我们只展开了一阶,阶数越高,越接近原函数,当 d 太小的时候,展开的函数是不是就远离原来的 W0 点了?远离 W0 点的时候,不等号是不是就不成立了?相当于去求一个跟损失函数不一样的函数的最小值,这是没有意义的。 假设向量长度不变的话 ,那么怎么让它们相乘的结果越小越好?自然而然想到,让 cosθ=-1 的时候,结果就最小。那什么时候 cosθ=-1?也就是 θ等于 180 度的时候,也就是 d 向量应该跟原来的梯度向量成 180 度夹角,即当 d 向量等于负的梯度向量的时候,此时的夹角θ能使 cosθ=-1 所以我们通常利用当 d=-g(w0),此时的 d 向量和 g(w0) 之间的夹角为 180 度,这时 d*g(𝑤0) 就是最小的。这也就是为什么梯度下降每一步的迭代,加的那个东西就刚好是负梯度这么巧,是从一阶泰勒展开,一步步推导出来的。

总结下, 梯度下降的本质是什么?对损失函数进行了一阶泰勒展开的近似,然后对这个近似出来的函数求最小值,把最小值当作下一步用来迭代的值。 这就是梯度下降背后的数学原理。

欢迎关注我的公众号 LhWorld,不仅为你推荐最新的博文,还有更多惊喜和资源在等着你! 一起学习共同进步!

吴恩达老师课程笔记系列-目录