深入浅出神经网络与深度学习 第二章:反向传播算法工作原理

1. 一种基于矩阵计算神经网络输出的快速方法

​ 首先给出网络中权重的清晰定义。wjklw^l_{jk} 表示从 (l1l-1) 层的 kk 个神经元到 ll 层的 jj 个神经元的链接上的权重。例如,下图给出了网络中第 2 层的第 4 个神经元到第 3 层的第 2 个神经元的链接上的权重:

​ 网络的偏置和激活值也会使用类似的表示。 bjlb^l_j 表示在 ll 层第 jj 个神经元的偏置, ajla^l_j 表示 ll 层第 jj 个神经元的激活值。下面的图清楚地解释了这样表示的含义:

ajl=σ(kwjklakl1+bjl)(23)\large a^l_j=\sigma(\sum_kw^l_{jk}a^{l-1}_{k}+b^l_j) \tag {23}

​ 其中求和是在 (l1)(l-1)层的所有 kk 个神经元上进行的。为了用矩阵的形式重写这个表达式,我们对层 ll 都定义一个权重矩阵 wlw^l 。权重矩阵 wlw^l 的元素正是连接到 ll 层神经元的权重,更确切地说,在第 jj 行第 kk 列的元素是 wjklw^l_{jk} 。类似的,对层 ll ,定义一个偏置向量 blb^l 。偏置向量的每个元素其实就是前面给出的 bjlb^l_j ,每个元素对应于 ll 层的每个神经元。最后,我们定义激活向量 ala^l ,其元素是那些激活值 ajla^l_j

​ 方程可以写成简洁的向量形式,如下所示:

al=σ(wlal1+bl)(25)\large a^l=\sigma(w^la^{l-1}+b^l) \tag {25}

​ 在使用方程(25)计算 ala^l 的过程中,我们计算了中间量zlwlal1+blz^l\equiv w^la^{l-1}+b^l 。这个量其实是非常有用的:我们称 zlz^lll 层神经元的带权输入。方程(25)有时候会以带权输入的形式:al=σ(zl)a^l=\sigma(z^l)。同样要指出的是 zlz^l 的每个元素是 zjl=kwjklakl1+bjlz^l_j=\sum_kw^l_{jk}a^{l-1}_k+b^l_j ,其实 zjlz^l_j 就是第 ll 层第 jj 个神经元的激活函数的带权输入。

​ 其实,这就是让我们使用之前的矩阵下标表示 (wjkl)(w^l_{jk}) 的初因。如果我们使用 jj 来索引输入神经元, kk 索引输出神经元,那么在方程(25)中我们需要将这里的矩阵换做其转置。这是一个小的改变,但是令人困惑,这会使得我们无法自然地讲出(思考)“应用权重矩阵到激活值上”这样的简单的表达。

2 代价函数的两个假设

  1. 代价函数CC是训练样本上每个代价函数CxC_x的均值:反向传播实际是对单个训练样本计算偏导数,然后对所有训练样本求平均,即C=1nxCxC=\frac{1}{n}\sum_xC_x
  2. 代价函数可以表示为网络输出的函数:这使得我们可以固定输入训练样本,并将代价函数视为仅依赖于输出激活值的函数。

3 阿达马(Hadamard)乘积

​ 阿达马乘积(舒尔积)是按元素进行的向量乘积运算。虽然在其他领域中不常见,但在反向传播中非常有用,因为它允许我们逐元素地操作矩阵和向量,从而简化了计算过程。

​ 假设sstt是两个维度相同的向量,那么sts\bigodot t表示按元素乘积.举例如下:

[12][34]=[1324]=[38]\begin{bmatrix} 1 \\ 2 \\ \end{bmatrix} \bigodot \begin{bmatrix} 3 \\ 4 \\ \end{bmatrix}=\begin{bmatrix} 1*3 \\ 2*4 \\ \end{bmatrix}=\begin{bmatrix} 3 \\ 8 \\ \end{bmatrix}

3. 反向传播的四个基本方程

反向传播算法的核心在于以下四个基本方程,它们描述了如何从输出层反向传播误差,并计算每层的梯度:

  1. 输出层误差:计算输出层每个神经元的误差。

    δL=aCσ(zL)\delta^L=\nabla_aC\bigodot\sigma'(z^L)

  2. 误差反向传播:利用当前层的误差计算前一层的误差。

    δL=((wl+1)Tδl+1)σ(zL)\delta^L=((w^{l+1})^T\delta^{l+1})\bigodot\sigma'(z^L)

  3. 偏差的梯度:计算偏差对代价函数的梯度。

    Cbjl=δjl\frac{\partial C}{\partial b^l_j}=\delta^l_j

  4. 权重的梯度:计算权重对代价函数的梯度。

    Cwjkl=akl1δjl\frac{\partial C}{\partial w^l_{jk}}=a^{l-1}_k\delta^l_j

4. 反向传播算法的步骤

反向传播算法的具体步骤如下:

4.1 输入设置

为输入层设置激活值,即将训练样本输入到网络中。

4.2 前向传播

计算每层的带权输入(即加权求和)和激活值。前向传播步骤将输入数据通过网络传递,最终计算出输出层的激活值。

4.3 输出层误差计算

根据网络输出和期望输出(标签),计算输出层的误差。这一步通过比较实际输出与期望输出之间的差异,得出输出层的误差。

4.4 误差反向传播

从输出层向前一层一层地计算误差。利用输出层误差,通过反向传播算法,将误差逐层向前传播,计算每层的误差。

4.5 计算梯度

利用误差计算代价函数对权重和偏差的梯度。这一步通过利用前向传播和反向传播得到的值,计算出代价函数相对于网络中每个权重和偏差的偏导数。