美文网首页
[神经网络这次真的搞懂了!] (6) 使用神经网络识别手写数字

[神经网络这次真的搞懂了!] (6) 使用神经网络识别手写数字

作者: 砥砺前行的人 | 来源:发表于2021-10-20 11:09 被阅读0次

英文原文:http://neuralnetworksanddeeplearning.com/
对原文的表达有部分改动

在前几章中,我们看到了神经网络如何使用梯度下降算法确定的权重和偏差。然而,我们并没有解释一个关键问题:如何计算代价函数的梯度?在本章中,我将介绍一种用于计算此类梯度的快速算法,一种称为反向传播(backpropagation)的算法。

反向传播算法最初是在 1970 年代引入的,但直到 1986 年 David Rumelhart、Geoffrey Hinton 和 Ronald Williams 发表的一篇著名论文才让人们充分认识到其重要性。那篇论文中描述的几个神经网络,其中使用反向传播的工作速度比早期的学习方法快得多,这使得使用神经网络解决以前无法解决的问题成为可能。今天,反向传播算法是神经网络学习的主力。

与本系列的其余部分相比,本章涉及更多的数学计算,可能你的数学并不好,但理解反向传播是很有必要的。反向传播的核心是代价函数 C 的偏导 \frac {∂C}{∂w} 相对于网络中的任何权重 w(或偏差 b)的表达式。该表达式告诉我们,当我们改变权重和偏差时,成本变化的速度有多快。虽然表达方式有些复杂,但它也有一种美感,每个元素都有自然、直观的解释。因此,反向传播不仅仅是一种快速学习算法。它实际上让我们详细了解权重和偏差的变化如何改变网络的整体行为。这非常值得详细研究。

基于矩阵的快速计算神经网络输出

在讨论反向传播之前,让我们先用基于矩阵的快速算法来计算神经网络的输出。我们实际上已经在上一章的结尾处简要地看到了这个算法,但我没有详细讲述,这里值得详细回顾一下。特别是,这是熟悉反向传播中使用的各种各样符号的好机会。

让我们从一个符号开始,它让我们以明确的方式引用网络中的权重。我们将使用 w^{l}_{jk} 来表示从第 (l−1)^{th} 层中的第 k^{th} 个神经元到第 l^{th} 层中的第 j^{th} 个神经元的连接权重。因此,例如,下图显示了从第二层中的第四个神经元到网络第三层中的第二个神经元的连接权重:

这种表示法(w^{l}_{jk} 而不是 w^{l}_{kj})一开始很麻烦,掌握它确实需要一些时间。但是只要稍加努力,您就会发现符号变得简单而自然。您可能认为使用 j 来指代输入神经元,使用 k 指代输出神经元更有符合习惯,我将在下面解释其中的原因。

我们对网络的偏差和激活使用类似的符号。明确地,我们使用 b^l_j 来表示第 l^{th} 层中第 j^{th} 个神经元的偏置。并且我们使用 a^l_j 来表示第 l^{th} 层中的第 j^{th} 个神经元的激活值。下图显示了这些符号的使用示例:

有了这些符号,第 l^{th} 层中第 j^{th} 个神经元的激活 a^l_j与第 第 (l-1)^{th} 层中的激活有关,等式如下:
a^l_j = σ (\sum_k w^{l}_{jk}a^{l-1}_k + b^l_j)

其中求和是第 (l−1)^{th} 层中所有神经元的总和。为了以矩阵形式重写该表达式,我们为每一层定义了一个权重矩阵 w^l。权重矩阵 w^l的条目就是连接第(l)^{th}层神经元的权重,第j^{th}行第k^{th}列的条目是w^l_{jk}。类似地,对于每一层我们定义一个偏置向量 b^l。您可能会猜到,偏置向量的分量只是值 b^l_j。最后,我们定义了一个激活向量 a^l,它的组成部分是激活 a^l_j

我们需要以矩阵形式重写a^l_j = σ (\sum_k w^{l}_{jk}a^{l-1}_k + b^l_j),其中最后一个要素是向量化一个函数(例如 σ)的想法。我们希望将一个函数(例如 σ)应用于向量 v 中的每个元素。我们使用明显的符号 σ(v) 来表示函数的这种按元素处理。也就是说,σ(v) 的分量就是 σ(v)_j=σ(v_j)。举个例子,如果我们有函数 f(x)=x^2 那么 f 的向量化形式可得出:
f(\begin{bmatrix} 2 \\ 3 \end{bmatrix}) = \ \begin{bmatrix} f(2) \\ f(3) \end{bmatrix} = \begin{bmatrix} 4 \\ 9 \end{bmatrix}
也就是说,向量化的 f 只是对向量的每个元素进行平方。

有了这些符号,我们可以将激活方程改写为漂亮而紧凑的矢量化形式:
a^l= σ(w^la^{l-1}+ b^l)

这个表达式为我们提供了一种更全局的思考方式,让我们思考一层中的激活如何与前一层中的激活相关联:我们只需将权重矩阵应用于前一层激活,然后添加偏置向量,最后应用 σ 函数(这里体现了 w^{l}_{jk} 而不是 w^{l}_{kj} 的优势,如果使用后者,则矢量化会改写成 a^l= σ((w^l)^Ta^{l-1}+ b^l),这增加了复杂性)。该表达式在实践中也很有用,因为大多数矩阵库提供了实现矩阵乘法、向量加法和向量化的快速方法。事实上,之前手写识别代码隐含地使用了这个表达式来计算网络输出的行为。

当使用上述方程计算 a^l 时,定义中间量 z^l≡w^la^{l−1}+b^l。我们称 z^l 为第 l 层神经元的加权输入(Weighted Input)。我们将在本系列后面大量使用了加权输入 z^l。如果根据加权输入来写,则表示为 a^l=σ(z^l)。还值得注意的是,z^l 有分量 z^l_j=\sum_{k}w^l_{jk}a^{l-1}_k+ b^l_j,即 z^l_j只是第 l 层神经元第j^{th}个神经元的加权输入。

相关文章

网友评论

      本文标题:[神经网络这次真的搞懂了!] (6) 使用神经网络识别手写数字

      本文链接:https://www.haomeiwen.com/subject/juvaoltx.html