交叉熵+softmax
What does the cross-entropy mean? Where does it come from?
交叉熵是什么意思呢?它是从哪里来的?
上一节咱们从代数分析和实际应用对交叉熵进行了介绍,这一节从概念角度介绍下它:
问题1:第一次是怎么想到交叉熵的呢?
假设我们已经知道学习变慢是因导数很小引起,见式(55)、(56).通过观察,研究者就想是否能找到一个损失函数,让σ′(z)消失。如果能找到的话,那么对于一个单一训练例子x,满足

如果我们能找到一个损失函数满足上面的等式,那么就找到了一个简单的方式实现:当偏差大的时候,学习速度快,并且不受σ′(z)的影响。观察上面两个式子,注意到链式法则:

用σ′(z)=σ(z)(1−σ(z))=a(1−a)带入上式,得到:

与式(72)比较,就可以到:

上式再对a积分,得到:

如果有多个训练输入,需要对所有的求平均数,得到:

注意(77)中的常数是每个训练输入的平均,为表达方便,写成了一个。实用交叉熵不是什么很神秘的事情,就是通过这种简单、自然的方法发现的。
那么交叉熵到底是什么呢?
交叉熵有一个标准的解释,它来自信息论(information theory),粗略地说,交叉熵是表达惊奇(surprise)的一个度量。在实际中,我们的神经元尝试计算函数xày=y(x)。只是一般写成xàa=a(x)。
假设,a是y=1的估计概率,1-a是y=0的估计概率,那么,当学习的真实值是y时,交叉熵就是测量这个“惊奇”的平均,如果输出是我们期望,我们的惊奇就很低;如果输出不是我们所期望的,我们的惊奇度就很高。
这是没有给出“惊奇”的具体含义,在信息论中确实对此有精确的描述,如果想深入了解可以参考维基百科brief summary和Cover and Thomas的信息论第五章(我反正没看明白)。
交叉熵损失函数的定义python代码:
1 class CrossEntropyCost(object): 2 3 @staticmethod 4 def fn(a, y): 5 """Return the cost associated with an output ``a`` and desired output 6 ``y``. Note that np.nan_to_num is used to ensure numerical 7 stability. In particular, if both ``a`` and ``y`` have a 1.0 8 in the same slot, then the expression (1-y)*np.log(1-a) 9 returns nan. The np.nan_to_num ensures that that is converted 10 to the correct value (0.0). 11 12 """ 13 return np.sum(np.nan_to_num(-y*np.log(a)-(1-y)*np.log(1-a))) 14 15 @staticmethod 16 def delta(z, a, y): 17 """Return the error delta from the output layer. Note that the 18 parameter ``z`` is not used by the method. It is included in 19 the method's parameters in order to make the interface 20 consistent with the delta method for other cost classes. 21 22 """ 23 return (a-y)
介绍了交叉熵函数用于解决学习速度慢的问题,这里也简单介绍下其他的有用解决方法:,
Softmax 柔性最大值传输函数
这个方法叫做softmax layers of neurons。Softmax的思想是为神经网络定义一个新型的输出层。神经网络的前面层是与sigmoid层一致的,最后一层的加权输入为:

然而,这里我们不用sigmoid函数作为获得激活输出,而是在softmax layer(输出层)中应用softmax的函数对zjL进行计算(最后一层叫做softmax layer,即输出层),根据这个函数,第L层的第j个神经元的激活输出为:

分母是对所有输出神经元进行求和。
可以证明所有激活输出的和总是等于1,

可以看出,所有的激活输出都是一个正数,且其和总是为1,换句话说,softmax 层可看作是一个概率分布。
事实上,softmax layer输出是概率的分布是合理的。在很多问题中,激活输出ajL都可以看作是正确输出j的概率。例如,在MNIST的分类中,就可以将激活输出看作是网络估计正确数字分类j的概率。(就是ajL代表输入x是j的概率),而对于sigmiod layer,我们不能将其激活输出看作是概率分布(至少现在没有被证明)。
Softmax函数的性质:
1、单调性:
当j=k时,是正数,当j≠k时,是负数,(这个可以证明的)。
2、非局域性:任何一个特性的激活输出,都与所有的加权输入有关,而sigmoid函数只与自己的加权输入有关。
我们介绍了softmax 层,那么它是如何解决学习变慢的问题的呢?
我们定一个对数损失函数:

其中y是输入x时的期望输出。例如,当我们训练MNIST的时候,输入图像是7,那么损失函数就是-lna7L.当网络识别很好时,a7就接近1,C就接近0,而识别不好时,a7就远离1,那么C也会变得很大,这个函数的表现正式损失函数应具有的。对损失函数求导:

这与交叉熵的结果是一样的,同样避免了导数引起的变慢问题。实际上,这里的对数型损失函数,与sigmoid输出层的交叉熵是非常相似的。
给出这种相似,那么在sigmoid输出层+交叉熵和softmax输出层+对数型损失函数之间如何选择呢?实际上在大多数情况下,这两种方法都能很好的运行,虽然我们这里基本上采用的是前一种方法,在第六章改成实用后一种方法,是为了使我们的网络与特定的有影响的学术论文保持一致。当你想将输出解释为概率的时候,可以采用Softmax+log-likehood,对分类问题特别有用(比如MNIST)
Softmax+log-likehood的后向传播:
上一章推导了包含sigmoid层的后向传播算法,为了将这个算法应用与包含softmax+log-likehood输出层的网络,需要为网络最后一层定义偏差:

可以证明:

将这个表达式应用于后向传播算法,就可以实现softmax+log-likehood的后向传播。
softmax的实现代码可参考:
http://blog.csdn.net/l691899397/article/details/52291909#comments
明天继续,这个速度。。。。。。。。。。。

浙公网安备 33010602011771号