本文总结自《Neural Networks and Deep Learning》第3章的内容。 html
学习慢 => 偏导数 ∂C/∂w 和 ∂C/∂b 值小。网络
引入交叉熵代价函数就是为了解决学习慢的问题。函数
交叉熵代价函数的定义以下:post
将交叉熵看做代价函数,是基于它的如下两个特性:学习
(1)它是非负的。测试
(2)若是对于全部的训练输入x,神经元实际的输出接近目标值,那么交叉熵将接近0。优化
相比于二次代价函数,交叉熵还有一个特性能够避免学习速度降低的问题。spa
由于交叉熵函数关于权重和偏置的偏导数的表达式中不存在σ′(z)这样的项,从而避免了学习缓慢。具体分析以下:3d
二次函数关于权重和偏置的偏导数分别是:htm
而σ函数的图像在神经元的输出接近1的时候,曲线变得至关平,因此σ′(z) 就很小了。上述公式也告诉咱们∂C/∂w 和 ∂C/∂b 值会很是小。这其实就是学习缓慢的缘由所在。
交叉熵函数关于权重和偏置的偏导数分别是:
上述公式代表权重学习的速度受到σ(z)-y,也就是输出中的偏差的控制。同时交叉熵函数还避免了像在二次代价函数中相似σ′(z) 致使的学习缓慢。
不一样的代价函数应该搭配不一样的学习率。
5. 在何时用交叉熵来替换二次代价函数?
若是在输出神经元是S 型神经元时,交叉熵通常都是更好的选择。
若是输出神经元是线性的那么二次代价函数再也不会致使学习速度降低的问题。在此情形下,二次代价函数就是一种合适的选择。
另一种解决学习缓慢问题的方法。
柔性最大值的想法其实就是为神经网络定义一种新式的输出层。
(1)首先计算带权输入
(2)不在带权输入z上使用S型函数来得到输出,而是使用softmax函数来得到输出。
公式(1)
其中,分母中的求和是在全部的输出神经元上进行的。
另一个特性:根据定义,输出的激活值加起来正好为1。
公式(2)
由公式(1)(2),咱们看到柔性最大值层的输出是一些相加为1正数的集合。换言之,柔性最大值层的输出能够被看作是一个几率分布。
在不少问题中,使用softmax是很方便的。好比在MNIST分类问题中,咱们能够将输出层第j个神经元的激活值解释成网络估计正确数字分类为j的几率。
先定义一个对数似然(log-likelihood)代价函数。
对数似然函数知足咱们期待的代价函数的条件。
对数似然代价函数关于权重和偏置的偏导数分别是:
这些方程其实和以前的交叉熵获得的相似。只是以前的是平均值。
正如前面的分析,这些表达式确保咱们不会遇到学习缓慢的问题。事实上,把一个具备对数似然代价的柔性最大值输出层,看做与一个具备交叉熵代价的S型输出层很是类似,这是颇有用的。
实际上,在不少应用场景中,这两种方式的效果都不错。
柔性最大值加上对数似然的组合更加适用于那些须要将输出激活值解释为几率的场景。
(1)cost上的对比
先在训练集上跑,训练集上cost和epoch(截取200-400之间)的关系以下:
测试集上:
(2)分类准确率上的对比
咱们在每一个迭代期的最后都计算在validation_data 上的分类准确率。一旦分类准确率已经饱和,就中止训练。这个策略被称为提早中止。
(1)通常来讲,最好的下降过分拟合的方式之一就是增长训练样本的量。有了足够的训练数据,就算是一个规模很是大的网络也不大容易过分拟合。不幸的是,训练数据实际上是很难或者很昂贵的资源,因此这不是一种太切实际的选择。
(2)下降网络规模。可是更深层更大的网络潜在有更强的学习能力。
(3)规范化。即便对于固定的神经网络和固定的训练集, 仍然能够减小overfitting。
规范化有不少技术,这里给出一种最为经常使用的规范化手段—— 有时候被称为权重衰减(weight decay)或者L2 规范化。
L2 规范化的想法是增长一个额外的项到代价函数上,这个项叫作规范化项。
其中C0是原始的代价函数,第二个如今加入的就是全部权重的平方的和。而后使用一个因子λ/2n 进行量化调整,其中λ>0 能够称为规范化参数,而n就是训练集合的大小。
须要注意的是,规范化项里面并不包含偏置。
规范化的效果是让网络倾向于学习小一点的权重。
规范化能够当作一种寻找小的权重和最小化原始的代价函数之间的折中。由λ的取值决定,λ越小,就偏向于最小化原始代价函数,反之,倾向于小的权重。
(1)减轻过分拟合和提升分类准确率。
(2)规范化的网络可以提供更容易复制的结果。无规范化的网络会偶然被限制住,不一样的运行会给出相差很大的结果。
规范化的神经网络经常可以比非规范化的泛化能力更强,这只是一种实验事实(empirical fact)。目前尚未一整套具备说服力的理论解释。仅仅是一些不完备的启发式规则或者经验。
(1)L1 规范化:是在未规范化的代价函数上加上一个权重绝对值的和。
(2)弃权(Dropout):从随机(临时)地删除网络中的一半的隐藏神经元开始,同时让输入层和输出层的神经元保持不变。
(3)人为增长训练样本
理解这部分须要先弄明白正态分布(高斯分布)、均值、标准差、方差的意义。
结论:假设咱们有一个有 n_in 个输入权重的神经元,咱们会使用均值=0,标准差= 1/sqrt(n_in)的正态随机分布初始化这些权重。
缘由:若这样初始化的话,那么大部分带权输入z的取值都在1和-1之间,隐藏神经元的输出σ(z) 就不太会接近1或者0。也就是神经元没有饱和,学习过程不会被减慢。
(1)Hessian 技术
(2)基于momentum 的梯度降低
(3)更多技术介绍参考这篇论文:http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf
(1)S型神经元
(2)tanh神经元
使用双曲正切(hyperbolic tangent)函数替换了S 型函数。tanh 神经元的输出的值域是(-1,1) ,而非(0,1)。
修正线性神经元(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的好坏。