基于个人口味做了去除),依据个人口味做了去除)

(本文是依照
neuralnetworksanddeeplearning
那本书的第⑤章Why are deep neural networks hard to
train?

整理而成的读书笔记,根据个人口味做了删减)

(本文是依照
neuralnetworksanddeeplearning
那本书的第一章How the backpropagation algorithm
works
整理而成的读书笔记,依据个人口味做了剔除)

在事先的笔记中,大家早就学习了神经互联网最大旨的 BP
算法,以及部分创新的方案(如:引入交叉熵函数)来增进互联网陶冶的进程。但万一仔细思考会发现,前面例子中的互联网都很「浅」,最多就一多少个隐藏层,而一旦网络层数扩大,有为数不少难题将不可防止地透表露来。前些天,大家就来认识多个最蛋疼的标题:深度神经互连网相当难练习。

在上一章的学习中,大家介绍了神经网络可以用梯度下落法来演练,但梯度的计量方法却不曾付诸。在本章中,大家将学习一种总计神经互连网梯度的法子——后向传播算法(backpropagation)。

网络越深效果越好

近几年的研商已经注解,互连网的层数越深,模型的表明能力就越强。在图像识别中,互连网的率先层学会怎样鉴定分别边缘,第③层在第1层的功底上学会怎么样分辨更扑朔迷离的形制,如三角形等,然后第③层又三番五次在第叁层的底蕴上学会辨别出更扑朔迷离的模样。如此往返,最终互联网便学会辨别出更尖端的语义新闻。那也是干什么深度学习近几年能得到突破的,因为吃水神经互联网的表达能力实在太强了。

只是,在教练深度神经互联网的长河中,人们也蒙受二个严重的标题:当前面层的互连网赶快磨练时,前边层的互联网却「僵住」了,参数不再更新;有时候,事情又凑巧相反,前边层的互连网训练急忙,前边层的互连网却没有了。

通过本节的读书,大家将驾驭这整个背后的深层原因。

backpropagation 算法起点于上个世纪 70 时代,但直接到
Hinton 等人在 一九九零年刊载的那篇有名论文后才起来受到关心。BP
算法使得神经网络的磨炼进度迅猛升高,由此它是学习神经互联网的要害。

流失的梯度

流传在此之前 MNIST 的例证,我们先做几组实验,来看望哪些是梯度消失。

这几组实验中,大家的网络布局分别如下:

net = network2.Network([784, 30, 10])
net = network2.Network([784, 30, 30, 10])
net = network2.Network([784, 30, 30, 30, 10])
net = network2.Network([784, 30, 30, 30, 30, 10])

那多少个互联网的绝无仅有不相同是,每多少个网络都比后边的多了一个富含 叁12个神经元的隐藏层。实验中,别的参数,包涵磨练多少完全等同。在 MNIST
数据集上,得出这三个试验的准确率分别为:96.45%,96.9/10,96.58%,96.50%。

看得出来,第①个互连网练习的结果比第一个好有的,但当隐藏层继续增多时,效果反而下落了。那让大家很好奇,不是说网络层数越深,效果越好吧?况且,固然中间的互连网什么都没有上学到,也总不至于其负成效吧。

为了进一步掌握背后的原因,大家打算跟踪一下互连网的参数,确认网络是还是不是真正得报到并且接受集磨炼。

粗略起见,大家分析一下次之个网络 ([784, 30, 30, 10])
中五个隐藏层的梯度。下图演示了当练习开头时,那八个层里面每一个神经元的梯度值,为了方便,只选拔了前多少个神经元:

图片 1

图中神经细胞上的柱状图表示梯度值 \(\partial C/
\partial b\),在 BP
五个公式中,大家精晓:\(\frac{\partial C}{\partial
b_j^{l}}=\delta_j^l \tag{BP3}\) \(\frac{\partial C}{\partial
w_{jk}^{l}}=a_{k}^{l-1}\delta_{j}^{l} \tag{BP4}\)

之所以,柱状图表示的除外是错误 bias 的梯度外,也有点能够反射权重 weights
的梯度。

由于权重的初叶化是轻易的,所以每个神经元的梯度都有所不相同,不过很显明的一些是,第② 个隐藏层的梯度总体上比第 二个隐藏层要大,而梯度越大,学习进度也绝对的越快。

为了研商那是或不是是偶然(也许那两层中后边的神经元会不相同呢),大家决定用1个大局的梯度向量
\(\delta\)
来相比那八个隐藏层参数的一体化梯度情形。大家定义 \(\delta_j^l=\partial C/ \partial
b_j^l\),所以您能够把 \(\delta\)
看作是上图中享有神经元梯度的向量。大家用向量尺寸 \(||\delta^i||\) 来代表每 i
个隐藏层的读书进程。

当唯有四个隐藏层时(即上海体育场面),\(||\delta^1||=0.07\)、\(||\delta^2||=0.31\),这更是印证了:首个隐藏层的学习率高于第叁个隐藏层。

假定有多少个隐藏层呢?结果是:\(||\delta^1||=0.012\)、\(||\delta^2||=0.060\)、\(||\delta^3||=0.283\)。同样的,前面包车型大巴隐藏层学习进程都比后面包车型客车要高级中学一年级些。

有人大概会说,以上的梯度皆以在刚开首磨练后某些时刻总计获得的,在互联网磨炼进度中,这一个梯度又是或不是会愈发升级呢?为精晓答这么些题材,大家总计出事后更加多轮学习后的梯度,并绘制成上边包车型大巴曲线图:

图片 2

图片 3

图片 4

总之地是,不管隐藏层有微微,后边层的求学进程都比前一层要高 5 到 10
倍,那样一来,第②个隐藏层的学习进程甚至只有最终一层的百分之一,当背后的参数正大踏步陶冶的时候,前边层的参数就焦点停滞了。那种光景,就叫做梯度消失。梯度消失并不表示网络已经趋于收敛,因为在尝试中,大家尤其在教练初始时计算出了梯度,对于叁个参数随机开首化的网络,要想在刚开首时就让互连网趋于收敛,那差不离是一点都不大概的,因而大家认为梯度消失并不是互联网没有引起的。

除此以外,随着研讨透彻,大家也会发觉,有时候前边层的梯度纵然没有消失,但却变得一点都不小,大概是前边层的好多倍,导致出现了
NaN,大致「爆炸」了。对于这种情形,大家又称之为梯度爆炸

任由是梯度消失照旧爆炸,都以我们不愿见到的。下边大家必要更为研商那种气象时有产生的原因,并想艺术缓解它。

热身:一种基于矩阵的高效总计神经网络输出的主意

在初步谈论 BP
算法在此之前,大家先想起一种基于矩阵方式的计量神经网络输出的不二法门。

率先,引入多少个标志表示。

假设 \(w_{jk}^{l}\) 表示从第 l-1
层的第 k 个神经元到第 l 层的第 j 个神经元的权值,如下图所示。

图片 5

假设 \(b_{j}^{l}\) 表示 l 层第 j
个神经元的谬误,\(a_{j}^{l}\) 表示 l
层第 j 个神经元的激活层,如下图所示:

图片 6

有了这一个标记,第 l 层的第 j 个神经元的激活层 \(a_{j}^{l}\) 就能够和 l-1
层的激活层关联起来:
\[ a_{j}^l =
\sigma(\sum_{k}{w_{jk}^{l}a_{k}^{l-1}+b_{j}^{l}}) \tag{23}
\]
其中,\(\sigma()\)
是三个激活函数,例如 sigmoid 函数之类的。

近来,为了便于书写,大家为每一层定义一个权值矩阵 \(W^l\),矩阵的各类成分对应上边提到的 \(w_{jk}^{l}\)。类似地,大家为每一层定义一个过错向量
\(b^l\) 以及1个激活层向量 \(a^l\)。

下一场,我们将公式 (23) 表示成矩阵的款型:
\[ a^l=\sigma(W^la^{l-1}+b^l) \tag{25}
\]
注意,那里我们对 \(\sigma()\)
函数做了点拉开,当输入参数是向量时,\(\sigma()\)
会每一个作用到向量的各种成分上(elementwise)。

在 (25) 式中,有时为了书写的有利,大家会用 \(z^l\) 来表示 \(W^la^{l-1}+b^l\)。下文中,\(z^l\) 将会反复出现。

梯度消失的原由

这一节,大家来探索一下:为啥互联网的梯度会破灭?只怕说,为何深度神经互联网的梯度会那样不安定。

简简单单起见,大家来分析三个唯有多个神经元的互联网:

图片 7

\(b\) 和 \(w\) 表示参数,\(C\) 是代价函数,激活函数采取sigmoid,每层网络的出口为 \(a_j=\sigma(z_j)\),\(z_j=w_ja_{j-1}+b_j\)。

上面,大家渴求出 \(\partial C/\partial
b_1\),看看是何许来头促成那几个值十分的小。

依照 BP 的公式能够生产:

图片 8

其一公式看起来有点相比复杂,不急,大家来探视它是怎么来的。由于网络尤其粗略(唯有一条链),所以大家准备从另二个更形象的角度来生产那一个姿势(BP
也是一点一滴能够生产该姿势的)。

倘诺有二个增量 \(\Delta b_1\)
出现,由于 \(a_1=\sigma(z_1)=\sigma(w_1a_0+b_1)\),能够推出:

\(\Delta a_1 \approx \frac{\partial
\sigma((w_1\ a_0+b_1)}{\partial b_1} \Delta
b_1=\sigma'(z_1)\Delta b_1\)(注意 \(\Delta a_1\) 不是导数,而是由 \(\Delta b_1\) 引起的增量,所以是斜率乘以
\(\Delta b_1\))。

然后一发的,\(\Delta a_1\)
又会唤起 \(z_2\) 的变化,根据 \(z_2=w_2 a_1+b_2\) 能够汲取:

\(\Delta z_2 \approx \frac{\partial
z_2}{\partial a_1}\Delta a_1=w_2 \Delta a_1\)。

将之前 \(\Delta a_1\)
的公式代入上式就足以博得:

\(\Delta z_2 \approx \sigma'(z_1)w_2
\Delta b_1\)。

能够看看,这些姿势和我们最开首的架子已经很相似了。之后,大家依葫芦画瓢不断未来总括,就能够获得
\(C\) 的增量:

\(\Delta C \approx \sigma'(z_1)w_2
\sigma'(z_2) \ldots \sigma'(z_4) \frac{\partial C}{\partial
a_4} \Delta b_1 \tag{120}\)

除以 \(\Delta b_1\)
后,就足以博得最开始的等式:

\(\frac{\partial C}{\partial b_1} =
\sigma'(z_1) w_2 \sigma'(z_2) \ldots\sigma'(z_4)
\frac{\partial C}{\partial a_4}.\tag{121}\)

代价函数的五个前提倘诺

BP 算法的对象是要总计偏导数 \(\partial
C\)/\(\partial w\) 和 \(\partial C\)/\(\partial b\),要让 BP
算法起功用,大家需求几个前提假若:

  1. 代价函数可以代表成 \(C=\frac{1}{n}\sum_{x}{C_x}\),其中
    \(C_x\) 是每种磨练样本 x
    的代价函数。
  2. 代价函数用神经网络的输出作为函数的输入:

图片 9

为何梯度会消失

有了上边那个姿势做铺垫,你是还是不是早已猜出了梯度消失的原故。没错,就跟 \(0.9^n \approx 0\) 道理同样。

首先,我们记忆一下 \(\sigma'()\)
函数的图像:

图片 10

本条函数最大值才 百分之二十五。加上大家的参数 \(W\) 是依照均值为 0,标准差为 1
的高斯分布开端化的,即 \(|w_j|<1\) ,所以\(|w_j
\sigma'(z_j)<1/4|\)。那么些项累乘起来,最终的结果就会愈来愈小。再理会看下边那幅图,由于不一致隐藏层的导数累乘的数量不一致,因而相应的梯度也就有了音量之分。

图片 11

如上的演绎纵然不是很正统,但它早已足足注明难点的来自。

梯度爆炸的题材那里就不再赘述了,原理和梯度消失一样,当每一项的值都大于 1
时,累乘起来就会变得极大。

记念在头里的学习笔记的最后,作者曾经建议1个题材:就算交叉熵函数化解了互连网学习进程下落的标题,但它针对的只是最后一层,对于日前的隐藏层,学习进程还是大概下跌。小编在此以前之所以避而不谈那个标题,是因为事先针对的网络层数都很少,而本文中也早已体现地址出并分析了难题的来自。

BP 算法背后的多少个着力公式

BP 算法本质上是为着总计出 \(\partial
C\) / \(\partial
w_{jk}^{l}\) 和 \(\partial
C\) / \(\partial
b_{j}^{l}\)。为了总结那七个导数,我们引入壹在那之中路变量 \(\delta_{j}^{l}\),这么些个中变量表示第 l
层第 j 个神经元的误差。BP
算法会总计出那些误差,然后用它来计量\(\partial C\) / \(\partial w_{jk}^{l}\) 和 \(\partial C\) / \(\partial b_{j}^{l}\)。

\(\delta_{j}^{l}\) 被定义为:
\[ \delta _{j}^{l}=\frac{\partial
C}{\partial z_{j}^{l}} \tag{29} \]
本条概念来源于那样1个真情:代价函数 \(C\) 能够作为是关于 \(z\) 的函数,而 \(z\) 是 \(W\) 和 \(b\)
的线性组合(考虑到代价函数的八个前提假如,\(C\) 是有关互连网出口 \(a\) 的函数,而 \(a\) 又是 \(z\) 的函数,所以 \(C\) 也足以当作是 \(z\)
的函数)。其实,大家也足以将它定义为:\(\delta_{j}^{l}=\frac{\partial C}{\partial
a_{j}^{l}}\)(\(a\)
是神经互联网某一层的出口),但诸如此类会导致未来的测算拾叁分复杂,所以,大家依然保留原来的概念。

BP 算法基于 4 个着力公式,这几个公式会报告我们什么样计算 \(\delta^{l}\) 和代价函数的梯度。

复杂网络中的梯度同样不安静

上边的例子中大家只是用了一个差不离的例证来表达原因,在更复杂的网络中,大家还能用类似的不二法门解释梯度的不安宁现象。

比如,对于上边这些纷纷的网络:

图片 12

我们得以正视 BP 公式推出:
\[ \begin{eqnarray} \delta^l =
\Sigma'(z^l) (w^{l+1})^T \Sigma'(z^{l+1}) (w^{l+2})^T \ldots
\Sigma'(z^L) \nabla_a C \tag{124}\end{eqnarray} \]
这里面,\(\Sigma'(z^l)\)
是对角矩阵,矩阵对角线上的因素由 \(\sigma'(z)\) 的值构成。\(\nabla_a C\) 则是由 \(C\) 对 输出层求偏导后得来的向量。

本条姿势就算不少,但款式上依旧是一模一样的,最后矩阵相乘的聚积效应如故会招致梯度消失恐怕爆炸。

输出层误差 \(\delta^{L}\)的总计公式

\[ \delta_{j}^{L}=\frac{\partial
C}{\partial z_{j}^{L}}=\frac{\partial C}{\partial
a_{j}^{L}}\sigma'(z_{j}^{L}) \tag{BP1} \]

本条公式是最直白的,只要求知道 \(a^{L}=\sigma(z^{L})\),然后根据链式法则即可获得。

为了更好地运用矩阵运算,大家转移一下方面式子的款型:
\[ \delta^{L}=\nabla_a C \odot
\sigma'(z^L). \tag{BP1a} \]
其中,\(\odot\) 表示 elementwise
运算,而 \(\nabla_a C\) 能够视作是
\(\partial C / \partial
a_{j}^{L}\) 组成的向量。

举个例证,倘若 \(C=\frac{1}{2}\sum_{j}{(y_j –
a_{j}^{L})}^2\),则 \(\partial C /
\partial a_{j}^{L}=\begin{bmatrix} \partial C / \partial a_0^l
\\ \partial C / \partial a_1^l \\ \vdots \\ \partial C /
\partial a_n^l \end{bmatrix}=(a_{j}^{L}-y_j)=\begin{bmatrix}
a_0^l-y_0 \\ a_1^l-y_1 \\ \vdots \\ a_n^l-y_l
\end{bmatrix}\),那么公式(BP1)能够代表成:\(\delta^{L}=(a_{L}-y) \odot
\sigma'(z^L)\)。

纵深学习的别的障碍

即使这一章中大家只是提到梯度不平稳的难题,但实际上,有无数研讨显示:深度学习同样存在许多其余的阻力。

比如说:激活函数的选项会潜移默化互连网的求学(参见随想:Understanding the
difficulty of training deep feedforward neural
networks
)。

又比如:参数的早先化也会影响互联网的锻炼(参见随想:On the importance of
initialization and momentum in deep
learning
)。

足见,关于深度神经互联网的教练障碍,近期依旧七个参差不齐的难点,要求更进一步的商量。在下一章中,大家将持续求学有个别深度学习的主意,这么些艺术在某种程度上,能够摆平深度神经互联网的那些学习障碍。

\(\delta^L\)与\(\delta^{L+1}\)的总括公式

\[ \delta^L=((w^{l+1})^T\delta^{l+1})
\odot \sigma'(z^l) \tag{BP2} \]

近日公式 (BP1) 可以让大家总括出终极输出层 \(\delta^L\) 的值,而 (BP2)
那些公式能够依照最终一层的误差,逐步前行传递总计前边输出层的 \(\delta^L\) 值。

参考

bias 的导数计算公式

\[ \frac{\partial C}{\partial
b_j^{l}}=\delta_j^l \tag{BP3} \]

这几个公式申明,第 l 层偏差 bias 的导数和第 l 层的误差值相等。

权重 W 的导数计算公式

\[ \frac{\partial C}{\partial
w_{jk}^{l}}=a_{k}^{l-1}\delta_{j}^{l} \tag{BP4} \]

同理,那几个公式揭暴露权重 W
的导数和误差以及互连网出口之间的关系。用一种更简单的法门意味着为:
\[ \frac{\partial C}{\partial w} =
a_{in}\delta_{out} \tag{32} \]
其中,\(a_{in}\) 是权重 \(W\) 的输入,而 \(\delta_{out}\) 是权重 \(W\) 对应的 \(z\) 的误差。用一幅图表示如下:

图片 13

公式 (32) 四个很好的成效是:当 \(a_{in}
\approx 0\) 时,梯度公式的值会相当小,换句话说,当权重 \(W\) 的输入 \(a_{in}\),也正是上一层激活层的出口接近 0
时,那么那个激活层对互连网的熏陶就变得相当小,\(W\) 的求学也会变得非常慢。

一部分启发(insights)

传闻地点几个公式,能够发现,当最终输出层的导数 \(\sigma'(z^L)\)
变的不大时(即网络本人已经八九不离十收敛),权重 \(W\) 和偏差 \(b\) 会慢慢甘休学习(因为误差 \(\delta\) 逐步趋向 0)。

本来,不单单是最终一层会潜移默化学习进度,依照公式 (BP2),当中间层的导数
\(\sigma'(z^l)\) 也初叶趋向 0
时,那么上一层的误差 \(\delta^l\)
也会趋于 0,从而导致上一层权重 \(W\)
和偏差 \(b\) 的求学也会初叶结束。

总之,当 \(W\) 的输入 \(a\) 变的十分的小或许输出层 \(\sigma(z^l)\)
收敛时,网络权值的教练将会变得非常的慢。

急需注意的少数是,那多少个公式的演绎适用于任何激活函数。因而,大家完全能够用此外函数来代替
\(sigmoid()\)。比如,大家得以设计二个函数
\(\sigma()\),那个函数的导数 \(\sigma'()\) 永远为正,且 \(\sigma()\) 函数值永远不会接近
0,那么就能够制止下边提到的学习截止的难题。

最后,总计一下 BP 的 4 个主题公式:

图片 14

个人对于误差以及 BP 的知晓

依据误差 \(\delta\)
的定义,不难窥见,它实际上正是代价函数关于参数 \(W\) 和 \(b\)
的直接导数,那一点跟第叁章中对梯度的概念是平等的。当 \(\delta\)
越大时,评释网络还远没有消失,即网络的「误差」还十分大,由此需求上学越来越多,反之,则印证网络的「误差」比较小,学习能够告一段落了。

网络中每一层的误差都亟需依靠前一层的误差实行总括,这几个进度实际上是3个导数的增大进程,能够感觉地觉得,整个神经互连网其实是由叁个个函数复合在联合形成的,因而,导数的计量其实就是链式法则的接连不断选用,前边层神经元的导数需求前面层神经元导数不断增大,这几个过程就重组了后向传播算法。

公式求证

BP1

公式 (BP1) 的验证是老大概括的,不过要求习惯向量或矩阵的 elementwise
的求导方式。

我们倘诺 \(C=f(\sigma(z^L))=f(\sigma(z_0^L),
\sigma(z_1^L), \cdots, \sigma(z_n^L))\),依据定义 \(\delta_j^L=\frac{\partial C}{\partial
z_j^L}\),由于 \(z_j^L\)
只跟 \(a_j^L\)
相关,于是我们用链式法则可以得到(能够画个网络图支持驾驭):
\[ \delta_j^L=\frac{\partial
f}{\partial \sigma(z_j^L)}\frac{\partial \sigma(z_j^L)}{\partial
z_j^L}=\frac{\partial C}{\partial a_j^L}\frac{\partial
a_j^L}{\partial z_j^L} \tag{38} \]
其中,\(a_j^L=\sigma(z_j^L)\),我们也能够将它象征成另一种样式:
\[ \delta_j^L=\frac{\partial
C}{\partial a_j^L}\sigma'(z_j^L) \tag{39} \]
上式正是 BP1 的样式了。

BP2

BP2 供给用到后一层计算出来的 \(\delta^{l+1}\),因而,咱们先依照 BP1
得出:\(\delta_k^{l+1}=\frac{\partial
C}{\partial z_k^{l+1}}\)。

由 \(\delta_k^{l}=\frac{\partial
C}{\partial z_k^l}\) 和 \(C=f(\sigma(z_0^L), \sigma(z_1^L), \cdots,
\sigma(z_n^L))\) 能够收获:
\[ \begin{eqnarray} \delta_j^{l} & = &
\frac{\partial C}{\partial z_0^{l+1}}\frac{\partial
z_0^{l+1}}{\partial z_j^{l}}+\cdots+\frac{\partial C}{\partial
z_n^{l+1}}\frac{\partial z_n^{l+1}}{\partial z_j^{l}} \notag \\
& = & \sum_k{\frac{\partial C}{\partial z_k^{l+1}}\frac{\partial
z_k^{l+1}}{\partial z_j^j}} \notag \\ & = & \sum_k
\delta_k^{l+1}\frac{\partial z_k^{l+1}}{\partial z_j^{l}}
\tag{42} \end{eqnarray} \]

大家还要更进一步找出 \(z_k^{l+1}\) 和
\(z_k^{l}\)
之间的关系。根据前向传来,能够博得:
\[
z_k^{l+1}=\sum_j{w_{kj}^{l+1}a_j^l+b_k^{l+1}}=\sum_j{w_{kj}^{l+1}\sigma(z_j^l)+b_k^{l+1}}
\tag{43} \]
跟着能够获取:
\[ \frac{\partial z_k^{l+1}}{\partial
z_j^l}=w_{kj}^{l+1}\sigma'(z_j^l) \tag{44} \]

将式 (44) 代入 (42) 得:
\[
\delta_j^l=\sum_k{w_{kj}^{l+1}\sigma'(z_j^l)\delta_k^{l+1}}=\sigma'(z_j^l)\sum_k{w_{kj}^{l+1}\delta_k^{l+1}}
\tag{45} \]
表示成矩阵的样式正是:
\[ \delta^L=((w^{l+1})^T\delta^{l+1})
\odot \sigma'(z^l) \]
即 BP2 的公式,注意矩阵的转置运算。

BP3

\[ z_j^l=\sum_k{W_{jk}^l
a_k^{l-1}}+b_j^l \]

\[ \frac{\partial z_j^l}{\partial
b_j^l}=1 \]

\[ \frac{\partial C}{\partial
b_j^l}=\frac{\partial C}{\partial z_j^l}\frac{\partial
z_j^l}{\partial b_j^l}=\frac{\partial C}{\partial
z_j^l}=\delta_j^l \]

BP4

证实进程同 BP3:
\[ z_j^l=\sum_k{W_{jk}^l
a_k^{l-1}}+b_j^l \]

\[ \frac{\partial z_j^l}{\partial
W_{jk}^l}=a_k^{l-1} \]

\[ \frac{\partial C}{\partial
W_{jk}^l}=\frac{\partial C}{\partial z_j^l}\frac{\partial
z_j^l}{\partial W_{jk}^l}=\frac{\partial C}{\partial
z_j^l}a_k^{l-1}=\delta_j^la_k^{l-1} \]

后向传来算法(BP)

  1. Input x: Set the corresponding activation class=”math inline”>\(a^1\) for the input layer.
  2. Feedforward: For each l = 2, 3, …, L compute class=”math inline”>\(z^l=w^la^{l-1}+b^l\) and class=”math inline”>\(a^l=\sigma(z^l)\).
  3. Output error \(\delta^L\):
    Compute the vector class=”math inline”>\(\delta^L=\nabla_a C \odot
    \sigma'(z^L)\).
  4. Backpropagate the error: For each l = L-1, L-2, …, 2 compute
    \(\delta^l=((W^{l+1})^T \delta^{l+1})
    \odot \sigma'(z^l)\).
  5. Output: The gradient of the cost function is given by class=”math inline”>\(\frac{\partial C}{\partial
    w_{jk}^l}=a_k^{l-1}\delta_j^{l}\) and class=”math inline”>\(\frac{\partial C}{\partial
    b_j^l}=\delta_j^l\).

以上算法是指向1个锻炼样本进行的,实操中,常常是用随机梯度下跌算法,用多少个样本举办磨炼,因而大家将算法略微修改如下:

  1. Input a set of training examples
  2. For each training example x: Set the corresponding input
    activation \(a^{x, 1}\), and
    perform the following steps:
  • Feedforward: For each l = 2, 3, …, L compute class=”math inline”>\(z^{x, l}=w^la^{x, l-1}+b^l\) and
    \(a^{x, l}=\sigma(z^{x,l})\).
  • Output error \(\delta^{x,
    L}\): Compute the vector class=”math inline”>\(\delta^{x, L}=\nabla_a C_x \odot
    \sigma'(z^{x,L})\).
  • Backpropagate the error: For each l = L-1, L-2, …, 2 compute
    \(\delta^{x,l}=((W^{l+1})^T
    \delta^{x,l+1}) \odot \sigma'(z^{x,l})\).
  1. Gradient descent: For each l = L, L-1, …, 2 update the weights
    according to the rule \(W^l
    \rightarrow W^l-\frac{\eta}{m} \sum_x
    \delta^{x,l}(a^{x,l-1})^T\), and the biases according to
    the rule \(b^l \rightarrow b^l –
    \frac{\eta}{m} \sum_x{\delta^{x,l}}\).

参考

相关文章