《神经网络和深度学习》系列文章二十:交叉熵损失函数
出处: Michael Nielsen的《Neural Network and Deep Learning》,点击末尾“阅读原文”即可查看英文原文。
本节译者:哈工大SCIR本科生 赵怀鹏 (https://github.com/zhaohuaipeng)
声明:我们将不定期连载该书的中文翻译,如需转载请联系wechat_editors[at]ir.hit.edu.cn,未经授权不得转载。
使用神经网络识别手写数字
反向传播算法是如何工作的
改进神经网络的学习方法
改进神经网络的学习方式
交叉熵损失函数
使用交叉熵损失来分类MNIST数字集
交叉熵意味着什么?它从哪里来?
Softmax
过拟合和正则化
正则化
为什么正则化能够降低过拟合?
其他正则化技术
参数初始化
重温手写数字识别:代码
如何选择神经网络的超参数
其他技术
神经网络能够计算任意函数的视觉证明
为什么深度神经网络的训练是困难的
深度学习
大多数人都会对犯错感到不愉快。在我刚学钢琴不久时,我将要在观众面前进行我的第一场表演。我当时很紧张,把一个八度弹奏低了。我卡住了,直到别人指出我的错误后,我才得以继续弹奏。我当时非常尴尬。尽管犯错时很不愉快,但是我们能够从明显的错误中学到东西。你能猜到在我下次弹奏的时候会把这个八度弹对。相反,如果错误很不明显的话,我们的学习速度将会很慢。
理想情况下,我们希望神经网络能够快速地从错误中学习。这种想法现实么?为了回答这个问题,让我们看一个小例子。这个例子包含仅有一个输入的单个神经元:
我们将要训练这个神经元去做一些极其简单的事:输入
为了更明确,我将为权重选定初始值
正如你所见,神经元能够迅速地学习权重和偏移来降低代价函数,并最后给出大概
尽管在这个例子中用了相同的学习率(
当和人类的学习对比时,我们发现这种行为很奇怪。正如我在这一节开始所提到的那样,我们常常能够在错误很大的情况下能学习地更快。但是正如刚才所见,我们的人工神经元在错误很大的情况下学习遇到了很多问题。另外,事实证明这种行为不仅在这个简单的例子中出现,它也会在很多其他的神经网络结构中出现。为什么学习变慢了呢?我们能找到一种方法来避免这种情况么?
为了搞清问题的来源,我们来考虑一下神经元的学习方式:通过计算代价函数的偏导
(54)
这里
(55) 和 (56)
这里我已经替换了
我们能够从图像看出当神经元输出接近
交叉熵代价函数简介
我们如何来避免这种减速呢?事实证明我们可以用不同的代价函数比如交叉熵(cross-entropy)代价函数来替代二次代价函数。为了理解交叉熵,我们暂时先不用管这个示例神经元模型。我们假设要训练一个拥有多个输入变量的神经元:输入
神经元的输出为
(57)
这里
仅从等式(57)我们看不出为何能解决速度下降的问题。事实上,老实讲,这个甚至看不出这个式子为何能称之为代价函数!在了解它能避免学习减速之前,我们还是有必要解读交叉熵为何能作为代价函数。
交叉熵有两个特性能够合理地解释为何它能作为代价函数。首先,它是非负的,也就是说,
其次,如果对于所有的训练输入
总结一下,交叉熵是正的,并且当所有输入
(58)
(59)
通分化简之后得到:
(60)
利用sigmoid函数的定义,
(61)
这是一个非常优美的表达式。它告诉我们权重的学习速率可以被
同样,我们能够计算偏移的偏导。我在这里不详细介绍它了,你可以很容易证明:
(62)
同理,它也能够避免
为了证明这个结论,我需要假设
练习
证明
让我们回到之前的例子中来,一块研究一下如果我们使用交叉熵代价函数而不是均方误差会发生些什么。我们先从均方误差表现好的情况开始:权重为
不出所料,神经元在这种情况下和之前使用均方误差时一样好。那么现在我们就要看一下之前均方误差表现较差的情况:权重和偏移都设置成
成功了!这次神经元学习速度很快。如果你细心观察你会发现代价函数曲线在初始的时候比使用均方误差时更陡峭。这意味着即使我们初始的条件很糟糕,交叉熵函数也能尽可能地降低学习速度减慢的可能性。
我并没有指明这些例子中用到的学习速率。在使用均方误差的时候,我选取
你可能会反对学习速率的改变,因为这会让上面的例子变得没有意义。如果我们随意选取学习速率那么谁还会在意神经元学习地有多快呢?这种反对偏离了重点。这个例子的重点不是再说学习速度的绝对值。它是在说明学习速度是如何变化的。当我们使用均方误差代价函数时,如果选取一个错的离谱的开始,那么学习速度会明显降低;而我们使用交叉熵时,这种情况下学习速度并没有降低。这根本不取决于我们的学习速率是如何设定的。
我们已经研究过交叉熵用于单个神经元的情况。事实上,这很容易推广到多层神经网络上。我们假设
(63)
这其实和我们的等式(57)相同,只不过这里面的
什么情况下我们要用交叉熵函数取代均方误差函数呢?事实上,如果输出神经元是sigmoid神经元的话,交叉熵都是更好的选择。为了理解这个,假定我们随机初始化权重和偏移。那么可能会发生这种情况,初始的选择会的到误差很大的输出,比如我们想得到
练习
交叉熵带来的一个问题就是很难记住表达式中
在本节开始讨论单个神经元时,我曾声称如果所有的训练数据都有
(64)
问题
多层神经网络
在上一章介绍这个概念的时候,我们利用均方误差代价函数得到输出层对权重求偏导有:
(65)
其中
(66)
用这个表达式可以证明输出层对权重的偏导为
(67)
这样
当我们的输出层是线性神经元(linear neurons)的时候使用均方误差
假设我们有一个多层神经网络。假设最后一层的所有神经元都是线性神经元(linear neurons)意味着我们不用sigmoid作为激活函数,输出仅仅是
(68)
和我们之前的问题类似,利用这个表达式我们在输出层对权重和偏移求导有
(69)
这就意味着如果输出神经元是线性神经元的话就不会产生速度下降的问题。
“哈工大SCIR”公众号
编辑部:郭江,李家琦,徐俊,李忠阳,俞霖霖
本期编辑:李忠阳
长按下图并点击 “识别图中二维码”,即可关注哈尔滨工业大学社会计算与信息检索研究中心微信公共号:”哈工大SCIR” 。点击左下角“阅读原文”,即可查看原文。