梯度下降法与反向传播法

169 阅读5分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 21天,点击查看活动详情

梯度下降法与反向传播法

梯度下降法

参考资料:推荐系统玩家 之 随机梯度下降(Stochastic gradient descent)求解矩阵分解 - 知乎 (zhihu.com)

什么是梯度?

在这里插入图片描述

  • 首先一元函数曲线上的切线斜率叫做导数,也就是函数在该点的变化率。
  • 如果延申到多元函数为一个曲面的时候,那么我们找曲面上沿x轴方向的切线斜率就是我们常说的偏导数,那么偏导数就是该多元函数沿坐标轴的变化率
  • 当想要知道任何方向的变化率的时候,就出现了方向导数的概念,如果我们可以求任意方向的变化率那么我们就可以得到变化率最大的方向,则变化率最大的方向就是梯度的方向,这个点函数的最大变化率就是梯度

梯度下降的推导,为什么梯度反方向是函数值局部下降最快的方向?

  • 关于变化率的问题,使用一阶泰勒展开为例:
    f(θ)f(θ0)+(θθ0)f(θ0)(1.0)f{(\theta)} \approx f{(\theta_{0})} + (\theta - \theta_{0})f’{(\theta_{0})}\tag{1.0}

在这里插入图片描述

  • 在[θ-θ0]区间上,f(θ)就是黑线部分,f'(θ)就是红线部分,为f(θ)在θ0处的切线。

  • 公式中1.0中(θ-θ0)是一个微小的矢量,其实就类似于Δθ,其大小我们用η来表示,然后单位向量用v表示:

    θθ0=ηv(1.1)\theta - \theta_{0} = \eta*v\tag{1.1}
    f(θ)f(θ0)+ηvf(θ0)(1.2)f{(\theta)} \approx f{(\theta_{0})} + \eta*v*f’{(\theta_{0})}\tag{1.2}
  • 我们做梯度下降的目的就是为了最小化损失函数,也就是f(θ),梯度下降是个迭代的过程。也就是说,我们希望每次更新θ的时候,都能让f(θ)的值变小,即有:

    f(θ)f(θ0)ηvf(θ0)<0(1.3)f{(\theta)} - f{(\theta_{0})} \approx \eta*v*f’{(\theta_{0})} < 0\tag{1.3}
  • 其中η为标量且为正,简化得到

    vf(θ0)<0(1.4)v*f’{(\theta_{0})} < 0\tag{1.4}
  • v和f'(θ)都是向量,因此v和f'(θ)想要小于零必须是异号,即反方向

  • 从这里我们就可以看出,为什么梯度反方向是函数值局部下降最快的方向。在上面我们提到过梯度方向是指函数变化率最大的方向,也就是斜率越来越大的方向,曲线会越来越陡。那么梯度的反方向,就是函数值局部下降最快的方向,斜率是越来越小的,斜率最终会为0。这也就是为什么我们高中求解二元一次方程组的最小值的时候,求导后需要导数等于0。

  • 我们知道v和f'(θ)反方向后,那么可以表达成:(因为v是单位向量,所以除以f'(θ)的模)

    v=f(θ0)f(θ0)(1.5)v = -\frac{f’{(\theta_{0})}}{\|f’{(\theta_{0})}\|}\tag{1.5}
  • 1.5带入1.1中:

    θ=θ0ηf(θ0)f(θ0)(1.6)\theta = \theta_{0} - \eta\frac{f’{(\theta_{0})}}{\|f’{(\theta_{0})}\|}\tag{1.6}
  • 因为向量的模是标量,所以化简:

    θ=θ0ηf(θ0)(1.7)\theta = \theta_{0} - \eta{f’(\theta_{0})}\tag{1.7}
  • 其中,θ0就是当前参数,η就是步长,也就是学习率,f'(θ)就是梯度方向,符号表示梯度的反方向,那么1.7式也就是梯度下降法中参数θ的更新表达式了。

随机梯度下降如何运用于损失函数求解呢?

  • 由1.7式即可带入损失函数中,如:J(θ)表示损失函数,损失函数中多个参数依次求偏导即可,重复θ更新操作
    θ=θ0ηθ0J(θ)(1.8)\theta = \theta_{0} - \eta{\frac{\partial}{\partial{\theta_{0}}}}J(\theta)\tag{1.8}

反向传播法

参考资料:推荐系统玩家 之 反向传播法(BackPropagation) - 知乎 (zhihu.com)

主题:

  • 神经网络的前向传播
  • 误差的反向传播
  • 前向传播的目的是在当前网络参数的基础上,得到模型对于输入的预估值。而反向传播的目的就是更新梯度来优化预估值,使得模型的损失函数达到最小。

前向传播:

在这里插入图片描述

  • 首先第一层是输入层,即绿色的i1和i2神经元,以及灰色的偏置项b1,第二层是隐藏层即蓝色部分的神经元h1和h2以及偏置项b2,第三层是输出层,包含o1和o2。 每条线上的w代表连接权重,激活函数默认是sigmoid函数
  • 我们先假设一组初始值,如下图即前向传播:

在这里插入图片描述

  • 如图,h1接收到的输入为i1和i2分别乘以权重再相加,在经过sigmoid激活函数即为h1的输出。同理,o1的输入就是h1和h2的输出乘以权重相加。
h1=w1i1+w2i2+b11(1.0)h1 = w_{1}*i_{1} + w_{2}*i_{2} + b_{1}*1\tag{1.0}
h1=11+eh1(1.1)h1 = \frac{1}{1+e^{-h1}}\tag{1.1}
  • 1.0为h1的输入,1.1为h1的输出,h2的输入输出同理

  • 那么隐藏层到输出层的运算同1.0 1.1一样,先计算输入然后计算输出得到o1和o2

  • 算出的o1和o2与初始设定的o1,o2显然是不会刚好一次就相同的,那么我们就要对误差进行反向传播更新权重w

反向传播:

  • 计算总误差

    E1total=12(目标值计算输出值)2(1.2)E1_{total} = \sum\frac{1}{2}(目标值-计算输出值)^2\tag{1.2}
  • 同理计算处o2的误差,那么在输出值只有o1和o2的情况下总误差即:

    Etotal=E2total+E2total(1.3)E_{total} = E2_{total} + E2_{total}\tag{1.3}
  • 那么反向传播开始计算,先从输出层到隐藏层,即o1--> h1

  • 梯度反向传播的主要原则就是求导过程中的链式法则(Chain Rule)。那么我们以w5权重为例,我们用整体误差对w5求偏导,其意义就是看w5对整体误差产生了多少影响

Etotalw5=Etotalo1输出o1输出o1输入o1输入w5(1.4)\frac{\partial{E_{total}}}{\partial{w_{5}}} = \frac{\partial{E_{total}}}{\partial{o_{1}输出}} * \frac{{\partial{o_{1}输出}}}{{\partial{o_{1}输入}}} * \frac{{\partial{o_{1}输入}}}{\partial{w_{5}}}\tag{1.4}
  • 对1.4式各个部分求偏导即可求得整体误差对于w5的偏导值。

  • 那么根据梯度下降的参数更新公式得到:(即梯度下降部分1.8)

    w5+=w5ηEtotalw5(1.5)w^+_{5} = w_{5} - \eta*\frac{\partial{E_{total}}}{\partial{w_{5}}}\tag{1.5}
  • 同理更新w6 w7 w8

在这里插入图片描述

  • 对于隐藏层-->输入层的权重更新:

  • 与输出层-->隐藏层更新参数不同的地方在于h1输出会接收从输出层传来的o1和o2的误差;

    Etotalw1=Etotalh1输出h1输出h1输入h1输入w1(1.6)\frac{\partial{E_{total}}}{\partial{w_{1}}} = \frac{\partial{E_{total}}}{\partial{h_{1}输出}} * \frac{{\partial{h_{1}输出}}}{{\partial{h_{1}输入}}} * \frac{{\partial{h_{1}输入}}}{\partial{w_{1}}}\tag{1.6}
  • 其中

    Etotalh1输出=Eo1h1输出+Eo2h1输出(1.7)\frac{\partial{E_{total}}}{\partial{h_{1}输出}} = \frac{\partial{E_{o1}}}{\partial{h_{1}输出}} + \frac{\partial{E_{o2}}}{\partial{h_{1}输出}}\tag{1.7}
  • 同理更新得到w2 w3 w4

在这里插入图片描述

  • 此文章中公式与图不是完全对应,是按照个人习惯写的伪公式,详情可以看参考的文章,写的步骤推导较为详细因此只提取出关键处理流程,本文只作为个人理解笔记总结用。