首页 > 代码库 > 神经网络与深度学习(4):改进神经网络的学习方法

神经网络与深度学习(4):改进神经网络的学习方法

本文总结自《Neural Networks and Deep Learning》第3章的内容。 

目录

  1. 交叉熵代价函数(The cross-entropy cost function)

  2. 柔性最大值(softmax)

  3. 过度拟合(Overfitting)

  4. 规范化(regularization)

  5. 权重初始化(Weight initialization)

  6. 神经网络的其他技术

 

交叉熵代价函数(The cross-entropy cost function)

1. 神经网络学习很慢的含义?

学习慢 => 偏导数 ∂C/∂w 和 ∂C/∂b 值小。

2. 交叉熵的基本定义

引入交叉熵代价函数就是为了解决学习慢的问题。

交叉熵代价函数的定义如下:

技术分享

 

将交叉熵看作代价函数,是基于它的以下两个特性:

(1)它是非负的。

(2)如果对于所有的训练输入x,神经元实际的输出接近目标值,那么交叉熵将接近0。

相比于二次代价函数,交叉熵还有一个特性可以避免学习速度下降的问题。

3. 为什么交叉熵代价函数代价函数可以解决学习慢的问题?

因为交叉熵函数关于权重和偏置的偏导数的表达式中不存在σ′(z)这样的项,从而避免了学习缓慢。具体分析如下:

二次函数关于权重和偏置的偏导数分别是:

技术分享

而σ函数的图像在神经元的输出接近1的时候,曲线变得相当平,所以σ′(z) 就很小了。上述公式也告诉我们∂C/∂w 和 ∂C/∂b 值会非常小。这其实就是学习缓慢的原因所在。

交叉熵函数关于权重和偏置的偏导数分别是:

技术分享

技术分享

上述公式表明权重学习的速度受到σ(z)-y,也就是输出中的误差的控制。同时交叉熵函数还避免了像在二次代价函数中类似σ′(z) 导致的学习缓慢。

4. 学习率的选择

不同的代价函数应该搭配不同的学习率。

5. 在什么时候用交叉熵来替换二次代价函数?

如果在输出神经元是S 型神经元时,交叉熵一般都是更好的选择。

如果输出神经元是线性的那么二次代价函数不再会导致学习速度下降的问题。在此情形下,二次代价函数就是一种合适的选择。

 

柔性最大值(softmax)

另外一种解决学习缓慢问题的方法。

柔性最大值的想法其实就是为神经网络定义一种新式的输出层。

1. 基本原理

(1)首先计算带权输入

技术分享

(2)不在带权输入z上使用S型函数来获得输出,而是使用softmax函数来获得输出。

技术分享公式(1)

其中,分母中的求和是在所有的输出神经元上进行的。

另外一个特性:根据定义,输出的激活值加起来正好为1。

技术分享公式(2)

由公式(1)(2),我们看到柔性最大值层的输出是一些相加为1正数的集合。换言之,柔性最大值层的输出可以被看做是一个概率分布。

在很多问题中,使用softmax是很方便的。比如在MNIST分类问题中,我们可以将输出层第j个神经元的激活值解释成网络估计正确数字分类为j的概率。

2. softmax如何解决学习缓慢的问题

先定义一个对数似然(log-likelihood)代价函数。

技术分享

对数似然函数满足我们期待的代价函数的条件。

对数似然代价函数关于权重和偏置的偏导数分别是:

技术分享

这些方程其实和之前的交叉熵得到的类似。只是之前的是平均值。

正如前面的分析,这些表达式确保我们不会遇到学习缓慢的问题。事实上,把一个具有对数似然代价的柔性最大值输出层,看作与一个具有交叉熵代价的S型输出层非常相似,这是很有用的。

3. 应该使用一个具有交叉熵代价的S 型输出层,还是一个具有对数似然代价的柔性最大值输出层呢?

实际上,在很多应用场景中,这两种方式的效果都不错。
柔性最大值加上对数似然的组合更加适用于那些需要将输出激活值解释为概率的场景。

 

 

过度拟合(Overfitting)

1. 看个栗子

(1)cost上的对比

先在训练集上跑,训练集上cost和epoch(截取200-400之间)的关系如下:

<iframe id="iframe_0.773041302317441" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://neuralnetworksanddeeplearning.com/images/overfitting1.png?_=6150086%22%20style=%22border:none;max-width:686px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById(‘img‘);%20window.parent.postMessage(%7BiframeId:‘iframe_0.773041302317441‘,width:img.width,height:img.height%7D,%20‘http://www.cnblogs.com‘);%7D%3C/script%3E" frameborder="0" scrolling="no" width="320" height="240"></iframe>

测试集上:

<iframe id="iframe_0.33370405389393354" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://neuralnetworksanddeeplearning.com/images/overfitting3.png?_=6150086%22%20style=%22border:none;max-width:686px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById(‘img‘);%20window.parent.postMessage(%7BiframeId:‘iframe_0.33370405389393354‘,width:img.width,height:img.height%7D,%20‘http://www.cnblogs.com‘);%7D%3C/script%3E" frameborder="0" scrolling="no" width="320" height="240"></iframe>

(2)分类准确率上的对比

<iframe id="iframe_0.8242547673103813" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://neuralnetworksanddeeplearning.com/images/overfitting4.png?_=6150086%22%20style=%22border:none;max-width:686px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById(‘img‘);%20window.parent.postMessage(%7BiframeId:‘iframe_0.8242547673103813‘,width:img.width,height:img.height%7D,%20‘http://www.cnblogs.com‘);%7D%3C/script%3E" frameborder="0" scrolling="no" width="320" height="240"></iframe>

<iframe id="iframe_0.7947613219835439" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://neuralnetworksanddeeplearning.com/images/overfitting2.png?_=6150086%22%20style=%22border:none;max-width:686px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById(‘img‘);%20window.parent.postMessage(%7BiframeId:‘iframe_0.7947613219835439‘,width:img.width,height:img.height%7D,%20‘http://www.cnblogs.com‘);%7D%3C/script%3E" frameborder="0" scrolling="no" width="320" height="240"></iframe>

2. 检测过度拟合

我们在每个迭代期的最后都计算在validation_data 上的分类准确率。一旦分类准确率已经饱和,就停止训练。这个策略被称为提前停止。

3. 降低过度拟合

(1)一般来说,最好的降低过度拟合的方式之一就是增加训练样本的量。有了足够的训练数据,就算是一个规模非常大的网络也不大容易过度拟合。不幸的是,训练数据其实是很难或者很昂贵的资源,所以这不是一种太切实际的选择。

(2)降低网络规模。但是更深层更大的网络潜在有更强的学习能力。

(3)规范化。即使对于固定的神经网络和固定的训练集, 仍然可以减少overfitting。

 

规范化(regularization)

1. 基本原理

规范化有很多技术,这里给出一种最为常用的规范化手段—— 有时候被称为权重衰减(weight decay)或者L2 规范化

L2 规范化的想法是增加一个额外的项到代价函数上,这个项叫做规范化项

技术分享

其中C0是原始的代价函数,第二个现在加入的就是所有权重的平方的和。然后使用一个因子λ/2n 进行量化调整,其中λ>0 可以称为规范化参数,而n就是训练集合的大小。

需要注意的是,规范化项里面并包含偏置。

规范化的效果是让网络倾向于学习小一点的权重。

规范化可以当做一种寻找小的权重和最小化原始的代价函数之间的折中。由λ的取值决定,λ越小,就偏向于最小化原始代价函数,反之,倾向于小的权重。

2. 好处

(1)减轻过度拟合和提高分类准确率。

(2)规范化的网络能够提供更容易复制的结果。无规范化的网络会偶然被限制住,不同的运行会给出相差很大的结果。

3. 为何规范化可以帮助减轻过度拟合?

规范化的神经网络常常能够比非规范化的泛化能力更强,这只是一种实验事实(empirical fact)。目前还没有一整套具有说服力的理论解释。仅仅是一些不完备的启发式规则或者经验。

4. 规范化的其他技术

(1)L1 规范化:是在未规范化的代价函数上加上一个权重绝对值的和。

(2)弃权(Dropout):从随机(临时)地删除网络中的一半的隐藏神经元开始,同时让输入层和输出层的神经元保持不变。

(3)人为增加训练样本

 

权重初始化(Weight initialization)

理解这部分需要先弄明白正态分布(高斯分布)、均值、标准差、方差的意义。 

结论:我们会使用均值=0,标准差= 1/sqrt(n_in)的正态随机分布初始化这些权重。

原因:若这样初始化的话,那么大部分带权输入z的取值都在1和-1之间,隐藏神经元的输出σ(z) 就不太会接近1或者0。也就是神经元没有饱和,学习过程不会被减慢。

 

神经网络的其他技术

1.其他的优化代价函数的技术

(1)Hessian 技术

(2)基于momentum 的梯度下降

(3)更多技术介绍参考这篇论文:http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf

2.人工神经元的其他模型

(1)S型神经元

(2)tanh神经元

使用双曲正切(hyperbolic tangent)函数替换了S 型函数。tanh 神经元的输出的值域是(-1,1) ,而非(0,1)。

(3)ReLU

修正线性神经元(rectified linear neuron)或者修正线性单元(rectified linear unit),简记为ReLU。

输入为x,权重向量为w,偏置为b 的ReLU 神经元的输出是:max(0, w*x + b)。

像sigmoid, tanh一样, 也可以扑模拟何函数。

优势:提高ReLU 的带权输入并不会导致其饱和,所以就不存在sigmoid, tanh那样的学习速度下降。若带权输入是负数,则梯度消失为0,所以神经元就停止学习了。这两点从ReLU的图像即可看出来。

问题:如何选择神经元?要靠实验比较sigmoid, tanh和ReLU的好坏。

神经网络与深度学习(4):改进神经网络的学习方法