反向传播算法

以感知机为例的反向传播过程

Posted by 逸杯久 on February 6, 2019

“Action speak louder than words. ”

[TOC]

1 反向传播

反向传播的过程其实就是计算代价函数的梯度(求导计算)得过程。然后根据求得梯度,更新参数来降低代价。

代价函数是是定义在整个训练集上的,是所有样本误差的平均,也就是损失函数的平均。

损失函数是单个样本的误差。

代价函数C和w的关系如下所示: cross_func_1

根据图片可知,常见的梯度下降法由于初始值不同,会落在不同的局部最小值上(而非全局最小值)。

1.1 什么是前向传播和反向传播

​ 下面是3Blue1Brown的深度学习之反向传播算法 上/下 Part 3 ver 0.9 beta。里面生动讲解了方向传播的基本概念和计算过程,建议大家先看一下。

前向传播方向:输入层 » 隐藏层 » 输出层,目的是输出目标结果,如下图所示:

forward_pro_1

反向传播方向:输出层(代价函数) » 隐藏层 » 输出层,目的是调整参数(w和b),如下图所示:

backPro_1

1.2 反向传播的计算

​ 使⽤ 表⽰从 (l - 1) 层的第 k 个神经元到第 l 层的第 j 个神经元的链接上的权重;使⽤ 分别表⽰第 l 层第 j 个神经元的 偏置 和 激活值。下⾯的图清楚地解释了这样表⽰ 的含义: 设

backPro_2

backPro_3

​ 以感知机为例,采用梯度下降法,损失函数为平方损失函数(针对单个样本有 ),则有:

​ 设输出层误差为 ,则: ​ 令 $ \nabla_a C = \{ \frac{\partial C}{\partial a^L_j} \ | \ j \in J \}$ (将$ \nabla_a C $ 看成L层上是 C 关于J个输出 激活值的改变速度的集合,用向量表示 ),则公式(4)可推导出:

注:⊙ 是Hadamard 乘积,表⽰按元素的乘积。

1.2.1 反向传播计算过程

步骤一:公式(5)代入公式(3)这样就可以计算出最后一层(输出层)的误差: 得到最后一层的误差 ,再分别对 求导,可得到下面两个算式: 得到最后一层参数的梯度。

步骤二:L-1 层的的误差 如下:

代入公式(7)(8)可以得到倒数第二层参数的梯度。

步骤三:重复 步骤二 的过程,最后可以获得神经网络每一层关于参数的梯度。

步骤四:用下面的算式更新参数

  • 注: 是学习速率*

该反传播算式总结如下:

backPro_4

​ 可以结合博客《基于感知机的手写数字识别神经网络》中的代码一起加深理解。

参考资料: