读书笔记:neuralnetworksanddeeplearning chapter3(1)

(本文是依据
neuralnetworksanddeeplearning
这本书的第三章Improving the way neural networks
learn
整治而成的读书笔记,依照个人口味做了剔除)

上一章中,大家领略了神经网络中最关键的算法:后向传来算法(BP)。它使得神经网络的训练成为可能,是此外高档算法的根底。今日,我们要持续学习其他格局,这么些措施使得网络的教练结果更好。

那多少个形式包括:

  • 更好的代价函数:交叉熵(cross-entropy)函数
  • 四种标准方法:L1L2dropout以及数据集的人工增广
  • 一种更好的开始化权值的方法
  • 一文山会海选取 hyper-parameters 的开导策略
  • 其它部分小技巧

陆续熵函数(cross-entropy)

实在生活中,大家都会有这么的阅历:当遭逢错误的时候,往往是我们学到东西最多的时候,而一旦我们对团结的不当模糊不清,提升反而会变慢。

一样地,大家希望神经网络可以从错误中更快地读书。这实在情形是哪些的吗?来看一个简单的例证。

图片 1

这一个事例只包含一个神经元,并且只有一个输入。我们会磨练那多少个神经元,使得:当输入为
1 时,输出为 0。大家将权重和谬误分别最先化为 0.6 和 0.9。当输入为 1
时,网络出口为 0.82 (\(\frac{1}{1+e^{-1.5}}
\approx
0.82\))。我们应用平方差函数来练习网络,并将学习率设为 0.15。

本条网络其实已经落后成一个线性回归模型。下边用一个卡通来演示网络的教练过程:

图片 2

从中我们能够看出,神经元迅速地读书参数,最后输出 0.09 (已经很类似 0
了)。现在,我们将参数和偏差开头化为 2.0,网络的开首输出为 0.98
(跟我们想要的结果偏离甚远),学习率依旧为
0.15。看看这几次网络会怎么着学习:

图片 3

虽说学习率和上次一致,但网络一开头上学的速度却很慢,在最最先的 150
次学习里,参数和错误几乎没有变动,之后,学习进度突然增长,神经元的出口快速降到接近
0.0。这点很令人差别,因为当神经元的出口严重错误时,学习的速度反而不是很快。

上边我们需要理解问题暴发的根源。神经元在教练的时候,学习进度除了受学习率影响外,还受偏导数
\(\partial C/ \partial w\) 和 \(\partial C / \partial b\)
影响。所以,学习进度很慢,也就是偏导数的值太小。按照
\[ C=\frac{(y-a)^2}{2} \tag{54}
\]
(其中,\(a=\sigma(z)\),\(z=wx+b\)),咱们可以求出(下面六个姿态中,已经将
x 和 y 的值替换为 1 和 0):
\[ \frac{\partial C}{\partial w} =
(a-y)\sigma'(z)x=a\sigma'(z) \tag{55} \]

\[ \frac{\partial C}{\partial b} =
(a-y)\sigma'(z)=a\sigma'(z) \tag{56} \]

要想深刻精晓这五个姿态,我们需要回顾一下 sigmoid 函数的内容,如下图:

图片 4

从函数图像我们可以窥见,当函数值接近于 1 或 0 时,函数导数趋于
0,从而导致 (55) 和 (56) 六个姿态的值趋于
0。这也是干什么神经元一开端的上学速率会那么慢,而中等有些学习进度会突然提升。

引入交叉熵代价函数

要缓解学习进度下跌的题材,我们需要从五个偏导数上边做作品。要么换一个代价函数,要么更换
\(\sigma\)
函数。这里,我们利用第一种做法,将代价函数更换为交叉熵函数(cross-entropy)。

首先用一个例证来介绍陆续熵函数。

一旦我们有如下神经元:

图片 5

则陆续熵函数被定义为(这里假定 y 是个票房价值值,在 0~1 里面,这样才能跟 a
相搭):
\[ C=-\frac{1}{n}\sum_x{[y \ln a +
(1-y) \ln (1-a)]} \tag{57} \]
本来,直觉上看不出这一个函数能缓解上学速率下降的题材,甚至看不出这可以变成一个代价函数。

俺们先表达为什么这么些函数可以看成代价函数。首先,这个函数是非负的,即
\(C>0\)(注意 \(a\) 的值在 0~1
里边)。其次,当神经元实际出口跟我们想要的结果接近时,交叉熵函数值会趋近
0。因而,交叉熵满意代价函数的主题原则。

除此以外,交叉熵解决了读书速率下降的题材。大家将 \(a=\sigma(z)\) 代入 (57)
式,并应用链式法则可以获得(这里的 \(w_j\) 应该特指最后一层的参数,即 \(w_j^L\)):
\[ \begin{eqnarray} \frac{\partial
C}{\partial w_j} & = & -\frac{1}{n} \sum_x \left( \frac{y
}{\sigma(z)} -\frac{(1-y)}{1-\sigma(z)} \right) \frac{\partial
\sigma}{\partial w_j} \tag{58}\\ & = & -\frac{1}{n} \sum_x
\left( \frac{y}{\sigma(z)} -\frac{(1-y)}{1-\sigma(z)}
\right)\sigma'(z) x_j. \tag{59}\end{eqnarray} \]
化简上式并将 \(\sigma(z)=\frac{1}{1+e^{-z}}\)
代入后获取:
\[ \frac{\partial C}{\partial
w_j}=\frac{1}{n}\sum_x {x_j(\sigma(z)-y)} \tag{61} \]
其一表明式正是我们想要的!它阐明,学习速率由 \(\sigma(z)-y\)
控制,也就是说,当误差越大时,学习速率越快。而且避免了 \(\sigma'()\) 导致的就学速率下降的题材。

仿佛地,大家得以统计出:
\[ \frac{\partial C}{\partial
b}=\frac{1}{n}\sum_x{(\sigma(z)-y)} \tag{62} \]
近来,我们将接力熵应用到事先的例证中,看看神经元的教练有什么样变动。

首先是权重和错误的起先值为 0.6 和 0.9 的事例:

图片 6

可以看到网络的教练进度近乎完美。

接下来是权重和不是开首值均为 2.0 的例证:

图片 7

这一遍,正如大家意在的那么,神经元学习得老大快。

这一遍实验中,接纳的学习率是
0.005。事实上,对于不同的代价函数,学习率要作出相应的调整。

下面对交叉熵函数的座谈都只针对一个神经元,其实很容易将它延伸到多层神经元的网络布局。假如
\(y=y_1, y_2, \dots\)
是想要的网络出口,而 \(a_1^L, a_2^L,
\dots\) 是网络的实际上出口,则 cross-entropy 函数可以定义为:
\[ C=-\frac{1}{n}\sum_x \sum_y {[y_j
\ln a_j^L + (1-y_j) \ln(1-a_j^L)]} \tag{63} \]
好了,介绍了这般多,这我们啥时候用平方差函数,何时用交叉熵呢?作者给出的见地是,交叉熵几乎连接更好的抉择,而原因也跟上文提到的同等,平方差函数容易在上马的时候碰着练习速率较慢的题材,而交叉熵则没有那种烦扰。当然,这么些题目出现的前提是平方差函数中用了
sigmoid 函数。

穿插熵到底是怎么,它是怎么来的?

这一节中,我们想精通,第一个吃螃蟹的人是怎么想到交叉熵函数的。

假设我们发现了读书速率下降的起点在于 \(\sigma'(z)\)
函数,大家要什么化解这些题目呢?当然,方法有成百上千,这里大家着想这么的思路:是否能找一个新的代价函数,将
\(\sigma'(z)\)
这些项消掉?假使大家盼望最终的偏导数满意下边的花样:
\[ \frac{\partial C}{\partial w_j}=x_j
(a-y) \tag{71} \]

\[ \frac{\partial C}{\partial b}=(a-y)
\tag{72} \]

那六个偏导数能使神经网络在误差越大时,磨练进度越快。

记念 BP 的多少个公式,可以拿到:
\[ \frac{\partial C}{\partial
b}=\frac{\partial C}{\partial a}\sigma'(z) \tag{73} \]
这里的 \(\sigma()\) 函数接纳的是
sigmoid,所以 \(\sigma'(z)=\sigma(z)(1-\sigma(z))=a(1-a)\),将以此姿势代入
(73) ,得到:
\[ \frac{\partial C}{\partial
b}=\frac{\partial C}{\partial a}a(1-a) \]
跟大家最后的靶子 (72) 式相比较,需要满意:
\[ \frac{\partial C}{\partial
a}=\frac{a-y}{1(1-a)} \tag{75} \]
对 (75) 举办积分后,便拿走:
\[ C=-\frac{1}{n}\sum_x{[y\ln
a+(1-y)\ln(1-a)]}+constant \tag{77} \]
至今,我们早已生产了接力熵函数的样式。

自然啦,交叉熵真正的来源于是消息论,更实际的介绍超出了本课程的范畴,所以就不再深入了。

Softmax

前一节中,大家根本介绍了接力熵怎样解决操练进度下落的题目,那是从代价函数的角度思考问题。其实,我们还有另一种模式,那就是更换
\(\sigma()\)
函数。这里要简明介绍一个新的 \(\sigma()\) :Softmax。

Softmax 的功效和 sigmoid 类似,只不过前者的函数情势是这么的:
\[
a_j^L=\frac{e^{z_j^L}}{\sum_k{e^{z_k^L}}} \tag{78} \]
⚠️分母是富有出口神经元的总数。这代表,经过 Softmax
函数后,所有神经元的输出会展现出概率分布的体制。

图片 8

当增大其中一个神经元输出时,其他神经元的输出值会变小,而且变小的总额分外前者扩展的值。反之亦然。这是因为具有神经元的输出值总和始终为
1。

除此以外,Softmax 的出口始终为正在。

Softmax 解决上学速率下降的问题

这三遍,大家定义一个 log-likelihood 代价函数,通过它来询问 Softmax
怎么着解决 learning slowdown 的问题。

log-likelihood 的函数格局为:
\[ C \equiv -\ln a_y^L \tag{80}
\]
先解释一下 \(a_y^L\),比方说,在
MNIST 数据集中,我们要一口咬定一张图纸属于 10
类中的哪种,那么,输出结果应该是一个 10 维的向量 \(a^L\),而实在结果则是数字 \(y\),比如 7。那么,\(a_y^L\) 则表示 \(a_7^L\)
这多少个项对应的几率值有多高。假设概率值(靠近
1)越高,表明臆度结果越正确,那么 \(C\) 的值就越小,反之越大。

有了代价函数后,大家照例求出偏导数:
\[ \frac{\partial C}{\partial
b_j^L}=a_j^L-y_j \tag{81} \]

\[ \frac{\partial C}{\partial
w_{jk}^L}=a_k^{L-1}(a_j^L-y_j) \tag{82} \]

此处不存在类似 sigmoid 导数这样使学习速率下降的情事。

(写到这里的时候,我突然暴发一个迷惑:不管是此处的
Softmax,仍然的穿插熵,我们都只是对终极一层的导数和不是求了偏导,但前边层的偏导数却从不统计,怎么能肯定后面层的偏导就不会遇到
\(\sigma'()\) 趋于 0
的题材呢?要清楚,按照 BP 算法的公式,误差有这样的传递公式:\(\delta^l\)=\(((W^{l+1})^T \delta^{l+1}) \odot
\sigma'(z^l)\),注意,这里依旧会现身 \(\sigma'()\),而后边层的权重和谬误的偏导数又是基于这多少个误差统计的,这样的话,前边层的读书速率下降的题目不如故没解决吧?那些问题先暂时放着,看看之后作者有没有解答。)

写了这样多,大家又要问一个像样的题材:哪天用 sigmoid 和
cross-entropy,何时用 softmax 和
log-likelihood。事实上,大部分境况下这五个挑选都能带来不利的结果,当然,假设想要输出结果表现概率分布的话,Softmax
无疑会更好。

参考

相关文章