按照个人口味做了除去),按照个人口味做了除去)

(本文是依据
neuralnetworksanddeeplearning
这本书的第五章Why are deep neural networks hard to
train?

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

(本文是基于
neuralnetworksanddeeplearning
这本书的第二章How the backpropagation algorithm
works
重整而成的读书笔记,依据个人口味做了删减)

在头里的笔记中,我们早已学习了神经网络最中央的 BP
算法,以及一些更上一层楼的方案(如:引入交叉熵函数)来提升网络磨炼的速度。但万一条分缕析思考会发现,前面例子中的网络都很「浅」,最多就一多少个隐藏层,而只要网络层数增加,有众多题材将不可防止地表表露来。明日,我们就来认识一个最蛋疼的题目:深度神经网络十分难磨炼。

在上一章的上学中,我们介绍了神经网络可以用梯度下降法来练习,但梯度的计量情势却尚未交给。在本章中,大家将学习一种统计神经网络梯度的法门——后向传来算法(backpropagation)。

网络越深效果越好

近几年的钻探已经申明,网络的层数越深,模型的表明能力就越强。在图像识别中,网络的首先层学会怎么着分辨边缘,第二层在率先层的功底上学会怎么鉴别更扑朔迷离的形制,如三角形等,然后第三层又继续在其次层的底蕴上学会辨别出更扑朔迷离的形状。如此往返,最终网络便学会辨别出更尖端的语义音信。这也是怎么深度学习近几年能赢得突破的,因为吃水神经网络的表明能力实在太强了。

然而,在操练深度神经网络的过程中,人们也赶上一个严重的问题:当前边层的网络疾速锻练时,后边层的网络却「僵住」了,参数不再更新;有时候,事情又恰好相反,前边层的网络练习飞速,前边层的网络却消失了。

通过本节的上学,我们将精晓这整个背后的深层原因。

backpropagation 算法起点于上个世纪 70 年代,但直接到
Hinton 等人在 1986
年登出的这篇出名论文后才最先境遇关注。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])

那些网络的绝无仅有区别是,每一个网络都比前边的多了一个涵盖 30
个神经元的隐藏层。实验中,其他参数,包括锻练多少完全一样。在 MNIST
数据集上,得出这三个试验的准确率分别为:96.48%,96.90%,96.57%,96.53%。

看得出来,第二个网络操练的结果比第一个好一些,但当隐藏层继续增多时,效果反而降低了。这让大家很诧异,不是说网络层数越深,效果越好吧?况且,尽管中间的网络什么都未曾上学到,也总不至于其负效用吧。

为了更加精通背后的由来,大家打算跟踪一下网络的参数,确认网络是否确实得到训练。

总而言之起见,我们解析一下次之个网络 ([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
的梯度。

是因为权重的初阶化是随意的,所以每个神经元的梯度都有所不同,可是很显然的一点是,第
2 个隐藏层的梯度总体上比第 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\) 以及一个激活层向量 \(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

其一函数最大值才 1/4。加上大家的参数 \(W\) 是遵照均值为 0,标准差为 1
的高斯分布开首化的,即 \(|w_j|<1\) ,所以\(|w_j
\sigma'(z_j)<1/4|\)。这么些项累乘起来,最后的结果就会更加小。再留意看上面这幅图,由于不同隐藏层的导数累乘的数据不同,由此相应的梯度也就有了音量之分。

图片 11

如上的推理尽管不是很正统,但它早已丰裕注脚问题的来源于。

梯度爆炸的题材这里就不再赘述了,原理和梯度消失一样,当每一项的值都大于 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} \]
这些定义来源于这样一个真情:代价函数 \(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\)
越大时,声明网络还远没有消失,即网络的「误差」还很大,由此需要上学更多,反之,则印证网络的「误差」相比较小,学习可以告一段落了。

网络中每一层的误差都需要依靠前一层的误差举办测算,那个历程实际上是一个导数的增大过程,可以感觉地认为,整个神经网络其实是由一个个函数复合在联合形成的,由此,导数的精打细算其实就是链式法则的持续使用,后边层神经元的导数需要前边层神经元导数不断增大,这几个历程就结成了后向传播算法。

公式求证

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. 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}}\).

参考

相关文章