反向传播(backpropagation)算法 | 深度学习笔记

接上一篇(多层感知机(MLP)与神经网络结构 | 深度学习笔记)的最后,我们要训练多层网络的时候,最后关键的部分就是求梯度啦。纯数学方法几乎是不可能的,那么反向传播算法就是用来求梯度的,用了一个很巧妙的方法。

反向传播算法应该是神经网络最基本最需要弄懂的方法了,要是反向传播方法不懂,后面基本上进行不下去。

非常推荐的是How the backpropagation algorithm works (http://neuralnetworksanddeeplearning.com/chap2.html)

在最开始的博客中提过,这本书是这篇笔记用到的教材之一,这节反向传播也是以上面那个链接中的内容作为笔记的,因为反向传播部分写的很好。

首先,需要记住两点:

1.反向传播算法告诉我们当我们改变权值(weights)和偏置(biases)的时候,损失函数改变的速度。 2.反向传播也告诉我们如何改变权值和偏置以改变神经网络的整体表现。

01

表达形式复习

这里的表示形式指的是,我们怎么用数学的方式来表示整个神经网络中的各个权值偏置激活函数等等,以及其矩阵形式,算是对于后面推导过程的约定。

这里稍微复习一下。

对于权值来说:

我们用w^{(i)}_{jk} 来表示从(l-1) 层的第k个神经元到第l 层第j个神经元之间的权重。

比如下面这幅图就是第2层的第4个元素到第三层的第二个元素之间的权重。

对于偏置来说:

我们用b^{i}_{j} 来表示第l 层第j个神经元上的偏置。

对于激活值来说:

我们用a^{i}_{j} 来表示第l 层第j个神经元上的激活值。

比如上面的第二层的第三个神经元的偏置和第三层第一个神经元的激活值。其实很容易理解。这里要注意,因为是多层结构,如果这层不是输出层,那么这个激活值作为下一层的一个输入。

那么激活值,偏置和权重之前有什么关系呢?

之前假设过我们现在只有sigmoid函数作为激活函数,可以知道:

解释一下这个公式,假如上一层有k个神经元,产生k和激活值,那么这些激活值在这层就被用作输入,这些输入作用在这层的的第j个神经元上,是不是就能够写成上面的表达式了。。很容易理解。

然后写成矩阵形式为:

我们把中间量w^{i}a^{i-1}+b^{i} 计算出来,单独命名为z^{i} ,我们把这个叫做加权输入。那么

可以写为a^{i}=\sigma (z^{i}) ,后面会证明,这个中间量是非常的重要的。

02 反向传播的四个基本方程

在最开始,定义l 层第j个神经元上面的误差(error) \delta ^{i}_{j}

其中的z^{i} 就是上面提到过得加权输入了。

这么定义的原因,可以看How the backpropagation algorithm works(http://neuralnetworksanddeeplearning.com/chap2.html)这里恶魔的小故事,很有趣。我们使用\delta ^{i} 向量化,表示一层上面所有神经元的误差。加入这个误差项的定义,可以让讨论变得简单。

接下来就是一个个推导反向传播的方程了,首先把这几个公式先列出来。

别晕,下面慢慢解释。

1.输出层误差(error)

我们用大写的L表示神经网络最后一层(输出层),\delta ^{L} 就表示输出层的误差了,且由以下方程给出:

证明:

解释: 首先看上面证明的第一行,我们知道损失函数的形式,输出层的每一个输出都能够看作是损失函数的一个变量。

要是不理解的话,假设我们这里的损失函数为之前提到过的二次函数:

在神经网络里面可以写为上面的形式,因为一个网络的输出就是最后一层的输出嘛。这下能不能够明显的理解上面的那句话了呢?

那么证明第一行就是通过链式法则得到的。

然后只有a^{L}_{k}z^{L}_{j} 是有依赖关系的,其他的没有依赖关系的求导为0不见了,因此,只剩下第二行。第二行出来了,又因为

,那么后面的也就都容易推出来了。

怎么理解: 我们怎么形象来理解BP1这个公式呢? \ \frac {\partial C} {\partial a^{L}_{j}}

度量了损失函数作为第j个激活输出的函数的变化程度。\sigma '(z^{L}_{j}) :

度量了激活函数在某个加权输入处的变化程度.

向量化: BP1是以某个神经元为单位的,写成向量化也很容易:

这里的误差表示的是输出层一整层的误差向量(每一个神经元误差的向量):

不理解的看下面的细节:

或者写为下面的形式:

细节如下:

2.非输出层的误差依赖于其下一层误差

怎么理解这句话呢?先丢一个公式:

证明:

解释: 首先看(I)式,

就是误差(error)的定义,这个简单。

这个就是链式法则啦,我们知道前一层的输出可以作为后一层的输入,也就是说,可以认为前一层的z算式后一层z的变量(别晕)。应用复合函数链式法则,就能够得到这个式子了。\frac {\partial C} {\partial z^{l+1}_{k}} 相当于l+1层的误差啦,所以可以简化为\delta ^{l+1}_{k}

再来看(II)式,这个公式就是计算z的,更加简单。不解释了。然后(II)式求偏导之后得到

代入(I)的最终结果,就得到上面的结果了

BP2是上面这个式子的向量形式。在之前链接的博客中有权值矩阵的详细说明。可以看一下,这里不浪费篇幅了。

理解:

通过这个公式,只要我知道l+1层的误差,那么我就能够知道l层的误差,由此,我就能够倒退直到第1层的误差。

这个式子就体现了误差的反向传播的特点。

然后BP1和BP2结合起来,我们就能够求出神经网络中任何一层,任何一个神经元上面的误差。

矩阵形式:

其中

3.损失函数关于任意偏置的偏导数

证明:

还是链式法则的老套路,很简单,就不解释啦。

理解:

这个公式告诉我们,某个神经元上面误差对于偏置的偏导要等于在这个神经元上面的误差。

而我们之前已经说过了,我们要求梯度的话就需要求出这些偏导,现在通过误差间接得到了偏导。很巧妙。

4.损失函数关于任意权值的偏导数

证明:

同样也是链式求导老套路,不解释啦。

理解:

如果还记得之前讲过的下标的意义的话,可以知道这个公式链接了第l层第j个神经元的误差,以及上一层第k个神经元的输出。不影响含义的情况下可以写为:

可以用下图形象表示:

从这个式子可以知道,当输入的激活值(activation)

a_{in}很小的时候,比如:a_{in}\approx 0 ,那么相应的梯度 \frac {\partial C} {\partial w} 也会变得很小。要是梯度变得很小的话,那么依赖于梯度下降算法来更新权重将会变得很慢。也就是说,某个权重连接的上一个输入激活值很小的话,那么这个权重的学习就会很慢。

至此,四个基本的公式就介绍完成了,再贴一次加深印象。

这里要说明一下,其实很多的深度学习框架已经帮你把求导,梯度等等工作都完成了,使用框架的时候可以很轻松的不去想底层的东西。但是这并不意味着不需要了解原理了。这些公式可以不用记下来。但是要知道他们是怎么推出来的,背后的思想是什么。

然后再来深入回顾一下这几个公式:

BP1:假如我们这里的输出层用的是sigmoid(以后会讨论不同的激活函数),这个函数的形状你应该很熟悉了。他的值域为(0,1),而且函数值趋向于0和趋向于1的时候,函数都变得平坦,意味着这个函数的导数越来越趋向于0。

。那么根据BP1你可以知道最后一层的误差也会变得很小,根据BP3和BP4,权值和偏置学习的速度也会变得很小。所以,对于sigmoid激活函数来说,当输出层的激活值过大或者过小的时候,学习速度都会变小,我们称输出函数已经饱和(saturated)

BP2:因为非输出层的误差受到其下一层的误差决定(具体看公式),也就是说,要是输出层“饱和”,那么输出层的误差变小,那么非输出层的误差也将变得小(这里可能要思考一下)。而误差变小,根据BP3和BP4,直接导致学习速度的变小。

前面说的总结起来就是:当输入的神经元的激活值很低,或者输出层神经元饱和了(过高激活或者过低激活),都将导致学习速度的降低。

上面的结论也启发我们设计一些激活函数:比如说避免激活函数的导数等于0(原因见上面),这里不讨论过多了,后面的笔记再说。

03

反向传播过程总结

1.输入

对于输入x,为输入层设置合适的激活函数

2.前向传播

对于各层:l=2,3,…,L 前向的计算一遍结果

3.计算输出层的误差

4.反向传播误差

对于各层: l=L−1,L−2,…,2

5.计算并且更新权重和偏置

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2017-09-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏计算机视觉战队

CNN的全面解析(带你简单轻松入门)

亲爱的关注者您好!真的是好久不见,上次与您相见还是8月18日的晚上,不知道35天的时间不见,你们都有了哪些成果?有了哪些成就?有了哪些offer?但是,本平台的...

3037
来自专栏SIGAI学习与实践平台

反向传播算法推导-全连接神经网络

反向传播算法是人工神经网络训练时采用的一种通用方法,在现代深度学习中得到了大规模的应用。全连接神经网络(多层感知器模型,MLP),卷积神经网络(CNN),循环神...

571
来自专栏云时之间

深度学习与TensorFlow:实现卷积神经网络

1724
来自专栏机器学习算法与理论

逻辑回归与梯度下降详解

逻辑回归 Sigmoid函数: ? Sigmoid函数 梯度: ? 梯度的表达式 这个梯度是指:沿着x方向移动 ? 个单位,沿着y方向移动 ? 个...

2649
来自专栏专知

【干货】走进神经网络:直观地了解神经网络工作机制

【导读】1月4日,Mateusz Dziubek发布了一篇基础的介绍神经网络的博文,作者用一种直观的方法来解释神经网络以及其学习过程,作者首先探讨了导致神经网络...

36113
来自专栏绿巨人专栏

机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能

3518
来自专栏marsggbo

DeepLearning.ai学习笔记(四)卷积神经网络 -- week1 卷积神经网络基础知识介绍

一、计算机视觉 ? 如图示,之前课程中介绍的都是64* 64 3的图像,而一旦图像质量增加,例如变成1000 1000 * 3的时候那么此时的神经网络的计...

20210
来自专栏机器之心

学界 | 中科院NIPS 2017论文提出深度离散哈希算法,可用于图像检索

2756
来自专栏机器之心

深度 | 从朴素贝叶斯到维特比算法:详解隐马尔科夫模型

选自davidsbatista 作者:David S. Batista 机器之心编译 参与:蒋思源、路雪 本文首先简要介绍朴素贝叶斯,再将其扩展到隐马尔科夫模型...

33413
来自专栏ATYUN订阅号

【行业】2018年你应该知道的十大机器学习算法

本文简要介绍一些最常用的机器学习算法,没有代码,没有抽象理论,只有图片和一些如何使用它们的例子。

1014

扫码关注云+社区