按照个人口味做了删减),依照个人口味做了删除)

(本文是基于
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}}\).

参考

相关文章