1.
http://blog.cvmarcher.com/posts/2015/06/27/gradient-descent/
梯度下降法是求解神经网络的方法中最流行的一个,思想很简单,就是函数沿着梯度的方向下降的最快。通常来讲,我们在求解机器学习问题的时候,都会定义一个目标函数,然后基于这个目标函数又定义出损失函数,通过最小化损失函数来使得目标函数达到最优。那么在最小化损失函数的时候就可以用上梯度下降了。
思想简单,实现也很简单。在这篇文章里面,我主要是想讲讲梯度这个东西,因为我经常会被这个概念搞糊涂掉。梯度大一高数(记忆中高中也是讲过…)有教。什么是梯度?首先,它是一个向量,那向量肯定会有方向嘛,梯度的方向呢是使得方向导数达到最大值的方向,它的模就是方向导数的最大值。那什么是方向导数?理解这个东西需要知道导数这个概念,下面我打算从数学定义来说明导数/偏导数/方向导数/梯度这四个东西。
导数
这个我想没有人会不知道。
定义:
当函数 y=f(x) 的自变量在一点 x0 上产生一个增量 Δx 时,函数输出值的增量与自变量增量 Δx 的比值在 Δx 趋于 0 时的极限如果存在,即为 f(x) 在 x0 处的导数,记作 f′(x0) 、 dfdx(x0) 或 dfdx∣∣x=x0
我们从小到大对导数的认识就是认为它是函数曲线在相应点的切线的斜率。
偏导数
慢慢的,我们当然不能仅限于一元函数的情况,那么多元函数求导是一个怎么概念?在多元函数情况下,通常我们计算的是偏导数,那么什么是偏导数?简单来讲,就是函数只对某个变量求导得到的导数就是函数关于这个变量的偏导数。比方说,对于二元函数 z=f(x,y) ,当我们把 y 固定住,然后对 x 求导,那么得到的导数称为 f(x,y) 对 x 的偏导数,记为 dzdx 。同样的,固定 x ,对 y 求导得到的便是对 y 的偏导数,记为 dzdy 。
方向导数
那么实际上,偏导数 dzdx 跟 dzdy 是函数沿着相应的坐标轴方向的变化率(因为每次我们都固定住其它的变量),那么如果需要同时考虑其他方向的变化率,该怎么办?这就引申出方向导数的概念了。
定义:
设 z=f(x,y) 在一点 P0(x0,y0) 的一个邻域内有定义,又设 l→ 是给定的一个方向,其方向余弦为 (cosα,cosβ) ,若极限
limt→0f(x0+tcosα,y0+tcosβ)−f(x0,y0)t存在,则称此极限值为函数 z=f(x,y) 在 P0 点沿方向 l→ 的方向导数,记为 dzdl→∣∣∣x0,y0
实际上, dzdl→∣∣∣x0,y0 是等于 dzdx∣∣x0,y0cosα+dzdy∣∣x0,y0cosβ
其中 t 为点 P0(x0,y0) 到点 Pt(x0+tcosα,y0+tcosβ) 的距离。
很容易推广到多元的情况,比如三元函数 u=f(x,y,z) 在点 P0(x0,y0,z0) 沿方向 l→ 的方向导数如下面是式子, l→ 方向的方向余弦为 (cosα,cosβ,cosγ)
梯度
因为引入了方向导数,那么自然而然就会想,在同一点上的所有方向导数中是否有最大值?显然是有的,而且这个方向导数就是梯度了!
假设令 g→=(dzdx∣∣x0,y0,dzdy∣∣x0,y0) ,那么就有
显然,当 ⟨g→,l→⟩=0 的时候,也就是 g→跟l→ 同向的时候,函数关于 l→ 的方向导数最大,且最大值为 |g→| 。
这里, g→=(dzdx∣∣x0,y0,dzdy∣∣x0,y0) 就成为函数在点 P0(x0,y0) 的梯度,记为 grad z|x0,y0 。
梯度下降法也是从这里来,当我们在求解的时候没办法直接得到最优解,只能不断逼近最优解,而逼近的时候又想尽可能的快,那么只能沿着函数变化最剧烈的方法(也就是梯度方向)的反方向走。这里顺便提一下梯度上升法,其实是跟梯度下降法一样,只是它是用于求解函数的最大值,在逼近最优解的时候,沿着梯度方向走。