反向传播算法如何工作

ia_200008027

前面一章,我们通过了梯度下降算法实现目标函数的最小化,从而学习了该神经网络的权重和偏置,但是有一个问题并没有考虑到,那就是如何计算代价函数的梯度,本章的重点就是介绍计算这些梯度的快速算法——反向传播算法,首先先介绍一下上图中以及下面文章中会出现的一些数学符号:

  •  : 表示网络层数

  •  : 表示第 层的第 个神经元的偏置

  •  : 表示第 层的第 个神经元的激活值

  •  : 表示从 层的第 个神经元到第 层的第 个神经元的连接上的权重

  •  : 权重矩阵,其中元素表示 层连接到 层神经元的权重

  •  : 第 层神经元的偏置向量

  •  : 第 层神经元的带权输入向量

  •  : 第 层每个神经元激活值构成的向量

  •  : 第 层第 个神经元的误差

本篇文章是公式重灾区,但是涉及的知识并不高级,这也说明一个道理:

很多看似显而易见的想法只有在事后才变得显而易见。

热⾝:神经⽹络中使⽤矩阵快速计算输出的⽅法

通过第一章,我们已经知道每个神经元的激活值的计算方法,根据上面的公式,我们可以得出 的表达方式:

举个例子: 表示第二层的第三个神经元的激活值,那么该输出值怎么同上一层的输出值以及权重关联起来的呢,根据激活值的计算公式,我们可以得出:

可以看到例子中的结果满足表达式,接下来,让我们将表达式改成向量形式:

这个式子是正确的么,我们实际根据第一层到第二层的计算来看看:

首先定义第一层的激活函数输出值向量 :

然后是第一层神经元连接到第二层神经元的权重矩阵:

同理,第二层神经元的偏置向量:

我们的目标是求得第二层神经元激活值构成的向量 :

激活值计算如下:

可以看到 的值和前面第一次举例子算出来的值一致。

关于代价函数的两个假设

我们以均方误差得出的代价函数如下:

公式说明:

  • 是目标输出

  • 是当输入是 时候网络输出的激活值向量

好了,为了应⽤反向传播,我们需要对代价函数   做出什么样的前提假设呢?

第一:代价函数可以被写成⼀个在每个训练样本   上的代价函数   的均值:

第⼆:代价可以写成神经⽹络输出的函数:

ia_200008028

为对于⼀个单独的训练样本   其⼆次代价函数可以写作:

反向传播的四个基本方程

反向传播其实是对权重和偏置变化影响代价函数过程的理解,最终极的含义其实就是计算偏导数   和 

为了计算这些值,我们引入一个中间量  ,其表示的是第 层第 个神经元的误差,其中 表示第 层的误差向量,对于这个误差,我们应该怎样表示呢:

接下来要做的就是将这些误差和   和   联系起来,解决方案就是反向传播基于四个基本⽅程:

输出层误差的⽅程

输出层误差的⽅程  :每个元素定义如下:

矩阵形式重写⽅程:

其中 就是梯度向量,其元素就是偏导数 的所有元素,以上述二次代价函数为例:

可以得出:

因此方程的矩阵形式可以改成:

推导过程如下:

ia_200008029

使用下一层的误差表示当前层的误差

推导过程如下:

ia_200008030

代价函数关于⽹络中任意偏置的改变率

推导过程如下:

ia_200008031

代价函数关于任何⼀个权重的改变率

推导过程如下:

ia_200008032

反向传播的四个基本公式,靠着一个链式法则,就全都推下来了,没有什么难度

ia_200008033

反向传播算法

反向传播算法给出了一种计算代价函数梯度的方法,算法描述如下:

  • 输入特征 x:为输⼊层设置对应的激活值

  • 前向传播:对每个 计算相应的  

  • 输出层误差:

  • 反向误差传播:对每个 ,计算 

  • 输出:代价函数的梯度由 得出

反向传播:全局观

假设我们已经对⼀些⽹络中的

ia_200008034

显然,这样会造成输出激活值的改变:

ia_200008035

然后,会让下一层所有的激活值产生改变:

ia_200008036

接着,这些改变都将影响到⼀个个下⼀层,到达输出层,最终影响代价函数:

ia_200008037

根据求导的思想,我们可以得出下面公式:

我们知道,

造成了第

层的第

神经元的激活值的变化

,这个变化由下⾯的公式给出:

的变化会造成下一层所有神经元激活值的变化,我们聚焦到其中⼀个激活值上看看影响的情况,不防设

ia_200008038

实际上,这会导致下⾯的变化:

我们已经知道,我们可以得到:

就这样一直传播下去,最终将所有的影响汇聚到输出层代价的变化,假设,那么结果的表达式就是:

影响输出层代价的权重值有很多,所以我们需要进行求和:

因为:

带入上面式子,得出:

想起一句歌词,又回到最初的起点,我们竟然就是在做反向传播,神奇。

说明

  • Neural Networks and Deep Learning[1]

  • Neural Networks and Deep Learning 中文版[2]

  • 知乎上另外一篇笔记[3]

如果你喜欢且支持本篇文章,为什么不点好看且转发让更多的朋友看到呢?

点击阅读原文,查看博文地址。

往期推荐:

《Neural Networks and Deep Learning》读书笔记系列:1.识别手写字

神经网络基础

如何用Python创建一个简单的神经网络

不论微信钉钉还是什么软件,我写了个通用的消息监控处理机器人

【教程&工具】微信同步文章到Bear

【小工具】极客时间&GitChat专栏下载脚本

我的Chrome浏览器插件

oh-my-zsh: 让终端飞

JupyterLab:程序员的笔记本神器

如何实现一个Python爬虫框架

[程序员福利] 获取Lynda视频课程免费账户

Sanic中文教程合集:免费下载

参考资料

[1]

Neural Networks and Deep Learning: http://neuralnetworksanddeeplearning.com/index.html

[2]

Neural Networks and Deep Learning 中文版: https://github.com/zhanggyb/nndl

[3]

知乎上另外一篇笔记: https://zhuanlan.zhihu.com/p/26765585

发布了34 篇原创文章 · 获赞 60 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/source_code13/article/details/102908660