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

(本文是基于
neuralnetworksanddeeplearning
那本书的第陆章Why are deep neural networks hard to
train?

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

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

在事先的笔记中,我们已经学习了神经互联网最焦点的 BP
算法,以及一些改善的方案(如:引入交叉熵函数)来增加网络练习的速度。但假诺条分缕析思考会发现,前面例子中的网络都很「浅」,最多就一四个隐藏层,而只要网络层数增添,有广大题材将不可制止地展表露来。明日,咱们就来认识五个最蛋疼的标题:深度神经互连网非凡难陶冶。

在上一章的学习中,大家介绍了神经互联网能够用梯度降低法来磨炼,但梯度的估测计算办法却尚无交给。在本章中,大家将学习一种总计神经互联网梯度的不二法门——后向传来算法(backpropagation)。

网络越深效果越好

近几年的切磋已经申明,网络的层数越深,模型的表明能力就越强。在图像识别中,网络的首先层学会怎么辨别边缘,第三层在第叁层的根基上学会怎么识别更扑朔迷离的形态,如三角形等,然后第1层又持续在第2层的功底上学会辨别出更扑朔迷离的形态。如此往复,最终互连网便学会辨别出更高级的语义新闻。那也是干吗深度学习近几年能获取突破的,因为吃水神经网络的表明能力实在太强了。

而是,在锻炼深度神经网络的历程中,人们也蒙受七个严重的题目:当前边层的互联网飞速磨练时,前边层的互连网却「僵住」了,参数不再更新;有时候,事情又凑巧相反,前边层的互联网操练快速,后边层的网络却没有了。

透过本节的求学,大家将明白这一切背后的深层原因。

backpropagation 算法起点于上个世纪 70 时期,但直接到
Hinton 等人在 1989年登载的那篇有名论文后才起来面临关怀。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])

那么些互连网的绝无仅有差异是,每1个互联网都比后面包车型大巴多了1个饱含 贰拾陆个神经元的隐藏层。实验中,其余参数,包涵练习多少完全相同。在 MNIST
数据集上,得出这三个实验的准确率分别为:96.57%,96.9/10,96.四分之一,96.58%。

看得出来,第3个网络陶冶的结果比第三个好一些,但当隐藏层继续增多时,效果反而下跌了。那让咱们很好奇,不是说互联网层数越深,效果越好吧?况且,尽管中间的网络什么都尚未上学到,也总不至于其负效用吧。

为了进一步精晓背后的原因,大家打算跟踪一下互联网的参数,确认互连网是或不是真正得报到并且接受集操练。

简易起见,大家分析一下次之个互联网 ([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
的梯度。

出于权重的开端化是私下的,所以每种神经元的梯度都有所差别,可是很醒目标少数是,第一 个隐藏层的梯度总体上比第 3个隐藏层要大,而梯度越大,学习进度也相对的越快。

为了斟酌那是或不是是偶然(可能那两层中前面包车型大巴神经元会分歧啊),大家决定用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\) 以及2个激活层向量 \(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\) 将会一再出现。

梯度消失的原由

这一节,大家来探索一下:为啥网络的梯度会熄灭?或许说,为何深度神经互连网的梯度会如此不平稳。

简简单单起见,大家来分析一个唯有1个神经元的网络:

图片 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

这几个公式看起来有点相比较复杂,不急,大家来看望它是怎么来的。由于互连网特别不难易行(只有一条链),所以大家准备从另1个更形象的角度来生产那个姿势(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
时,累乘起来就会变得非常大。

记念在事先的上学笔记的末尾,作者一度提议叁个难点:固然交叉熵函数消除了网络学习进程下跌的标题,但它针对的只是终极一层,对于日前的隐藏层,学习进程如故也许下挫。小编从前之所以避而不谈那么些标题,是因为以前针对的网络层数都很少,而本文中也曾经体现地址出并分析了难题的来源于。

BP 算法背后的几在那之中央公式

BP 算法本质上是为着总结出 \(\partial
C\) / \(\partial
w_{jk}^{l}\) 和 \(\partial
C\) / \(\partial
b_{j}^{l}\)。为了计算那四个导数,大家引入2个中档变量 \(\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} \]
其一概念来源于那样3个事实:代价函数 \(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\)
的间接导数,这点跟第1章中对梯度的定义是一模一样的。当 \(\delta\)
越大时,注明互连网还远没有没有,即互联网的「误差」还相当的大,由此要求学习越多,反之,则注明互连网的「误差」比较小,学习能够告一段落了。

互联网中每一层的误差都急需依靠前一层的误差进行测算,这一个进度实际上是2个导数的叠加进程,可以感觉地觉得,整个神经网络其实是由一个个函数复合在一道形成的,因而,导数的盘算其实正是链式法则的穿梭利用,前边层神经元的导数须要后边层神经元导数不断叠加,这么些进程就结成了后向传来算法。

公式求证

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

参考