【菜菜的CV进阶之路-神经网络的深入理解-十】热身:一个基于矩阵的快速计算神经网络输出的方法

目录

简介

第一章-使用神经网络识别手写数字

            第一节-感知机

            第二节-sigmoid神经元

            第三节-神经网络的结构

            第四节-用简单的神经网络识别手写数字

            第五节-通过梯度下降法学习参数

            第六节-实现我们的手写体数字分类神经网络

            第七节-向深度学习进发!

第二章-反向传播算法工作原理

            第一节-热身:一个基于矩阵的快速计算神                            经网络输出的方法

            第二节-关于代价函数的两个假设

            第三节-Hadamard积--s⊙t

            第四节-反向传播背后的四个基本等式

            第五节-四个基本方程的证明(自选章节)

            第六节-反向传播算法

            第七节-反向传播算法代码

            第八节-为什么说反向传播算法很高效?

            第九节-反向传播:整体描述

注:

                哈工大原版翻译地址:https://hit-scir.gitbooks.io/neural-networks-and-deep-learning-zh_cn/content/

                文章原版地址:《Neural Networks and Deep Learning》http://neuralnetworksanddeeplearning.com/


在讨论反向传播算法之前,我们先介绍一个基于矩阵的快速计算神经网络输出的方法来热热身。实际上在上一章的末尾我们经见过这个方法了,但是那时我说得很快,因此有必要详细回顾一下。另外在熟悉的上下文背景中,也能让你对反向传播会用到的符号记法感到习惯一些。

我们先介绍一种符号来表示网络中的权重参数,这种表示法不会引发歧义。我们用w_{jk}^{l}来表示从第l−1层的第k个神经元到第l层的第j个神经元的连接的权重。例如,下图展示了从第二层的第四个神经元到第三层的第二个神经元的连接的权重:

【菜菜的CV进阶之路-神经网络的深入理解-十】热身:一个基于矩阵的快速计算神经网络输出的方法_第1张图片

一开始你会觉得这种表示很麻烦,而且的确需要一些功夫来掌握它。但是经过一些努力,你就会发现这种表示简单而自然。这种表示的一个奇怪之处就是j和k下标的顺序。你可能会认为用j表示输入神经元,用k表示输出神经元更加合理。然而并不是这样的。在下面我会解释其中的原因。 

我们用一种相似的记法来表示网络的偏置和激活值。确切地,我们用b_{j}^{l}表示第l层第j个神经元的偏置,用a_{j}^{l}表示第l层的第j个神经元的激活值。下图展示了这种记法的一个例子:

【菜菜的CV进阶之路-神经网络的深入理解-十】热身:一个基于矩阵的快速计算神经网络输出的方法_第2张图片

 

利用这些记法,第l层第j个神经元的激活值 a_{j}^{l}通过下面的式子与第l−1层神经元的激活值联系起来(比较上一章节中的等式(4)和它附近的讨论内容):

这里的求和针对的是第l−1层的所有神经元k。为了将这个式子写成矩阵形式,我们为每一层ll定义一个权重矩阵 w^{l}。矩阵w^{l}的每一项就是连接到第l层神经元的权重,这就是说, w^{l}中第j行第k列的元素就是w_{jk}^{l}。相似地,我们为每一层定义一个偏置向量b^{l}。你大概可以猜到这是如何工作的——偏置向量的每一项就是b_{j}^{l}的值,每一项对应第l层中的一个神经元。最后,我们定义一个激活向量a^{l},其中的每一项就是激活值a_{j}^{l}

最后一个我们需要改写成矩阵形式的想法就是把σ这样的函数向量化。我们在上一章中简单提到了向量化,这里面的思想就是我们想把一个函数比如σ,应用到一个向量v中的每一项。我们用一个直观的记号σ(v)来表示这种作用在每一个元素上的函数操作。就是说,σ(v)的每一项就是 σ(v)_{j}\sigma \left ( v \right )_{j}=\sigma \left ( v _{j}\right )。比如,如果我们有一个函数f\left ( x \right )=x^{2},f的向量化形式具有如下作用:

就是说,向量化的函数f是对向量中的每一个元素求平方。

如果你记住了这些记法,那么等式(23)可以改写成下面简洁优美的矩阵形式:

这个式子给我们对一层的激活值是如何与上一层中激活值产生关联的进行全局思考:我们仅仅将权重矩阵作用于上一层的激活值,然后加上偏置向量,最后用σ函数作用于这个结果,(就得到了本层的激活函数值)。相比于之前我们采用的神经元到神经元的视角,这种全局的视角通常更加简明和容易理解(涉及到更少的下标!)。你可以把它当做一种脱离下标魔咒,同时还能对正在进行的事情保持精确的阐释。这种表达式在实际操作中也非常有用,因为大多数矩阵库提供了更快的方式来实现矩阵乘法,向量加法以及函数向量化操作。实际上,上一章节中的代码隐式地使用了这种表达式来计算网络的行为。 

当使用等式(25)来计算a^{l}的时候,我们顺便也计算出了中间结果 z^{l}\equiv w ^{l}a^{l-1}+b^{l}的值。这个数值非常有用,以至于值得我们专门给它一个名字:我们称 z^{l}为对第l层神经元的加权输入(weighted input)。在本章的后续部分中我们将大量地使用到加权输入 z^{l}。等式(25)有时候会被写成与加权输入有关的形式,即a^{l}=\sigma \left ( z^{l} \right )。值得注意的是 z^{l}z_{j}^{l}=\sum_{k}w_{jk}^{l}a_{k}^{l-1}+b_{j}^{l}组成,这就是说,z^{l}就是第l层第j个神经元激活函数的加权输入。

 

你可能感兴趣的:(计算机视觉)