神经网络与深度学习笔记(三)
第三章 改进神经网络的学习方法
3.1 交叉熵代价函数
理想的情况:我们希望神经网络可以从错误中快速地学习。
例子:只包含一个输入的神经元,要做的是让输入1转化为0.
一开始的时候,随机初始化权重和偏置,那么初始神经元的输出是0.82。设置学习率,使用二次函数作为代价函数。训练之后,神经元的输出、权重、偏置和代价的变化如下图所示,虽然不是目标输出0.0,但是已经很接近了。
假设现在将初始权重和偏置都设成:,此时 初始神经元的输出是0.98。看看神经元的学习过程:
可以看到刚开始学习速度是比较缓慢的,对于前150轮迭代,损失并没有太大变化,随后学习速度加快,最后输出接近0.0。
比较两个实验,神经元在其犯错较大的情况下学习很缓慢(第二种初始化方式犯错比第一种方式更明显)。这和人类学习行为差异很大,人类通常是在犯错比较明显的时候学习的速度最快。那么造成这种情况的原因是什么?
神经元是通过改变权重和偏置,并以一个代价函数的偏导数(和)决定学习的速度。当学习缓慢的时候,实际上就是说这些偏导数很小。对此例的证明如下:
代价函数,其中是神经元的输出,训练输入为,目标输出为。并且。使用链式法则求权重和偏置的偏导数:
仔细观察这一项。从下图中可以看出,当神经元的输出接近1的时候,曲线很平滑,所以就很小了。因此和就会非常小,这就是学习缓慢的原因所在。
3.1.1 引入交叉熵代价函数
交叉熵代价函数定义为:
其中是训练数据的总数,求和是在所有的训练输入上进行的,是对应的目标输出。
可以将交叉熵看做代价函数的原因有两点:
1.交叉熵是非负的;
2.对于所有的训练输入,神经元实际的输出接近目标值,那么交叉熵将接近0。也就是说,实际输出和目标输出之间的差距越小,交叉熵的值就越低。
但是这些特性二次代价函数也具备。但是交叉熵代价函数有一个比二次代价函数更好的特性是它避免了学习速度下降的问题。计算交叉熵函数关于权重的偏导数:
由于,可得,因此最终的形式就是:
在这个式子里,权重学习的速度受到,也就是输出中的误差控制。更大的误差,更快的学习速度。避免了二次代价函数出现的学习缓慢。类似的交叉熵代价函数关于偏置的偏导数:,在偏置更新时,再一次避免了二次代价函数的学习缓慢问题。
当交叉熵作为代价函数时,进行上述例子的训练。开始时,权重,偏置。
权重,偏置。
这一次神经元的学习速度相当快。交叉熵代价函数使得当神经元开始出现严重错误时能以最快速度学习。
结论:当输出神经元是S型神经元时,交叉熵代价函数一般是更好的选择。因为初始化网络的权重和偏置时,通常采用某种随机方法,那么可能这些初始的选择会使得某些训练输入误差相当大,如果使用二次代价函数,会出现学习速度缓慢的问题。
当输出层使用线性神经元时,可以使用二次代价函数,因为此时代价函数关于输出层的权重和偏置的偏导数为:
表明,如果输出神经元是线性的,那么二次代价函数不会导致学习速度下降的问题。
3.1.2 交叉熵的含义
衡量学习到的正确值的平均起来的不确定性。如果输出是我们期望的结果,那么不确定性就会小一点;反之,不确定性就大一点。
3.1.3 softmax神经元层
不使用S型函数作为神经元的输出**函数。换成softmax函数。
那么,softmax层的输出是一些相加为1的集合,softmax的输出可以被看作是一个概率分布。
一个具有对数似然代价的softmax输出层和具有交叉熵代价的S型输出层非常相似,它们都没有学习缓慢的问题。ps:对数似然代价,该代价函数对权重和偏置的偏导数为:
3.2 过度拟合和正则化
拥有大量参数的模型能够描述几乎所有给定大小的数据集。但是即使这样的模型能够很好的拟合已有的数据,也不是一个好模型。这样的模型不需要真正洞察现象的本质,它们对新的数据很难泛化。对模型真正的测验就是它对没有见过的场景的预测能力。
构造一个网络泛化能力很差的例子。网络参数如下:30个隐藏神经元,共23860个参数。使用MNIST数据集,从数据集中挑选出1000张进行训练。学习率,batchsize=10,训练400个迭代期。
训练集的代价曲线:
测试集的分类准确率曲线:
训练集图像上代价函数持续下降。但是测试集图像上在280迭代期左右准确率就停止增长,后面的迭代期准确率出现了随机的小波动,网络在280迭代期后就过度拟合或者过度训练了。
上述两幅图像,我们对比的是训练集的代价和测试集的准确率。会不会是因为对比不一致导致的?以下是测试集上的代价曲线:
可以看到测试集上的代价在15迭代期前一直下降,随后越来越差。这也是模型过拟合的迹象。究竟应该将15还是280迭代期当做过拟合开始影响学习的时间点?要从实践的角度来看,在这个问题中,我们关心的是提升测试数据集上的分类准确率,而测试集上的代价是准确率的一个反应。所以更加合理的选择是将280迭代期看成过拟合开始影响学习的时间点。
另一个过度拟合的迹象在训练数据上的分类准确率也能看出来:
准确率一直在提升接近100%。而在同时,测试集准确率仅仅82%。模型只是在单纯记忆训练集,而不是对数字本质进行理解,不能泛化到测试集。
检验过拟合的方法:跟踪测试数据集合上的准确率随训练变化情况,如果测试数据上的准确率不再提升,那么就停止训练,这个策略被称为提前停止。实际应用中,我们不会立即知道什么时候准确率会饱和,我们要一直训练直到我们确信准确率已经饱和。(如果分类准确率在一段时间内不再提升的时候终止。)我们会使用验证集数据,每个迭代期的最后都计算在验证集上的分类准确率。然后在测试集上使用相同的策略。
3.2.1 正则化
减轻过拟合的方法:增加样本数量,降低网络规模,正则化。最常用的正则化手段:权重衰减(L2正则化),他的想法是增加一个额外的项(所有权重的平方和)到代价函数。以下是L2正则化的一般形式:
是原始的代价函数,因子进行量化调整,称为正则化系数,是训练集合的大小。在正则化中不包含偏置(本节末解释原因)。
正则化的效果是让网络倾向于学习小一点的权重。正则化可以当做一种寻找小的权重和最小化原始代价函数之间的折中。这两部分相对的重要性由正则化系数控制,越小,就偏向于最小化原始代价函数,反之,倾向于小的权重。
正则化如何减轻过拟合
1.将随机梯度下降法应用在正则化的神经网络上
2.正则化后的代价函数训练网络
其中,。训练集上的代价函数曲线:
和前面无正则化的情况规律相同。测试集上的准确率曲线:
在整个400个迭代期内持续增加。显然正则化能够减轻过拟合的问题。准确率最高到达了87.1%,超过之前的82.27%。
如果使用全量50000张图像的训练集,超参数和之前相同,修改。因为训练数据的大小从,改成了,这个会改变权重衰减因子(增大,衰减因子增大,减小得慢),如果持续使用就会产生很小的权重衰减,正则化效果会降低。
3.2.2 为何正则化可以帮助减轻过拟合
通常的说法:小的权重在某种程度上,意味着更低的复杂性,也就对数据给出了一种更简单却更强大的选择。
更小的权重意味着网络的行为不会因为随便改变了一个输入而改变太大,这会减轻局部噪声对网络的影响。相反,大权重的网络会因为输入的微小改变而产生比较大的行为改变。所以,一个无正则化的网络可以使用大的权重在包含大量噪声的训练集上来学习一个复杂的模型。
最后,L2正则化没有限制偏置。因为,实践中正则化偏置项不会对结果改变太多。有一个大的偏置并不会像大的权重那样会让神经元对输入太敏感。同时,大的偏置能够让网络更加灵活,大的偏置让神经元更容易饱和,这有时候是我们所要达到的效果。
3.2.3 其他正则化
L1正则化
L1正则化和L2正则化都惩罚大的权重,但权重缩小的方式不同。L1正则化,权重向0进行缩小;L2正则化中,权重均匀缩小。L1正则化的最终结果是,网络的权重倾向于聚集在相对少量的高重要度连接上,而其他权重会被驱使向0接近。
dropout
人为扩展训练集
3.3 权重初始化
之前初始化的方式是根据独立高斯随机变量来选择权重和偏置,其被归一化为均值为0,标准差1。有一种比这更好的初始化方式:假设有一个个输入权重的神经元,我们会使用均值为0,标准差为的高斯随机分布初始化权重,继续使用均值为0,标准差为1的高斯分布来对偏置进行初始化(或者将偏置初始化为0也可行,如何初始化偏置影响不大,因为权重初始化已经避免了神经元饱和的问题)。好处是,这样的神经元不可能饱和,因此也不大可能遇到学习速度下降的问题。(神经元饱和容易使学习速度下降。)
实验:新旧权重初始化
权重初始化仅仅会加快训练,不会改变网络的最终性能。