交叉熵
从交叉熵的公式中可以看到交叉熵函数不是对称的(H(p, q) ≠ H(q,p)),它刻画的是通过概率分布q来表达概率分布p的困难程度。因为正确答案是希望得到的结果,所以当交叉熵作为神经网络的损失函数时,p代表的是正确答案,q代表的是预测值。交叉熵刻画的是两个概率分布的距离,也就是说交叉熵值越小,两个概率分布越接近。
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))
根据交叉熵的公式,应该将每行中的m个结果相加得到所有样例的交叉熵,然后再对这n行取平均得到一个batch的平均交叉熵。但因为分类问题的类别数量是不变的,所以可以直接对整个矩阵做平均而并不改变计算结果的意义。这样的方式可以使整个程序更加简洁。
注意交叉熵刻画的是两个概率分布之间的距离,然而神经网络的输出却不一定是一个概率分布, 所以需要softmax回归转成(0, 1)之间的分布.
信息熵
对于连续型随机变量
对于离散型随机变量
KL散度(相对熵)
KL散度 = 交叉熵 - label的信息熵, KL散度是两个概率分布间差异的非对称性度量.若其中一个概率分布为真实分布,另一个为理论(拟合)分布,则此时相对熵等于交叉熵与真实分布的信息熵之差,表示使用理论分布拟合真实分布时产生的信息损耗.
其中为真实事件概率, 为预测概率, 后半部分即为交叉熵, 又因为label的信息熵是不变的, 所以只是用交叉熵作为损失函数. 如果完全拟合, 交叉熵等于label信息熵, 否则交叉熵略大, KL散度大于0.
KL散度的缺点在于不对称, 但是当sigmoid作为激活函数时, 不使用距离相关的平方损失函数MSE是因为存在梯度消失的问题, 会导致学习率下降, 交叉熵可以使权重更新公式与sigmoid的导数无关, 避免梯度消失.
Softmax
tensorflow中softmax回归的参数被去掉了, 只是一个额外的处理层. 由于二者经常一起使用, 所以tensorflow将交叉熵和softmax封装成一个函数:
cross_entropy= tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)
在只有一个正确答案的分类问题中,TensorFlow提供了tf.nn.sparse_ softmax_cross_entropy_with_logits()
函数来进一步加速计算过程。
softmax求导
参考 https://blog.csdn.net/bitcarmanlee/article/details/82320853
前面提到,在多分类问题中,我们经常使用交叉熵作为损失函数
Loss=
其中,表示真实值,表示求出的softmax值。当预测第i个时,可以认为。此时损失函数变成了:
接下来对Loss求导。根据定义:
我们已经将数值映射到了0-1之间,并且和为1,则有:
接下来开始求导
上面的结果表示,我们只需要正向求出,将结果减1就是反向更新的梯度,导数的计算非常简单
如果分类结果互斥, 使用softmax, 否则使用k个二分类的logistic回归分类器
MSE
对于回归问题,最常用的损失函数是均方误差(MSE, mean squared error):
mse = tf.reduce_mean(tf.square(y_ - y))
或
mse_loss = tf.reduce_sum(tf.pow(y_ - y, 2)) / sample_size
这里的减号也是元素对应相减.
附: Markdown常用数学公式
网友评论