Tensorflow 交叉熵(Cross Entropy)详解
TensorFlow为分类任务提供了四个交叉熵损失函数包括以下四种:
tf.nn.sigmoid_cross_entropy_with_logits
tf.nn.softmax_cross_entropy_with_logits
tf.nn.sparse_softmax_cross_entropy_with_logits
tf.nn.weighted_cross_entropy_with_logits
数学基础
1)e ,自然对数ln的底数,是个无理数,e=2.71828…
2)f(x)=e^x的函数如下:

3)Sigmoid函数由下列公式定义 函数如下:


其对x的导数可以用自身表示:

4)均方误差(MSE, Mean Squared Error)
其具体的数学表达式为
\text{MSE} = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2

tf.losses.mean_squared_error() 实际上就是直接计算 mse 值的过程
创建常量张量a,其元素值为[[4点零、4点零、4点零]、[3点零、3点零、3点零]、[1点零、1点零、1点零]]。
创建常量张量b,其元素值为[[1点零、1点零、1点零]、[1点零、1点零、1点零]、[2点零、2点零、2点零]]。
通过tf.losses.mean_squared_error函数计算张量a与b之间的均方误差损失函数 mse2。
通过tf.Session()构造会话对象sess,并在sess会话中执行运算以输出mse2的值。
运行后计算得到的均方误差损失值为4.6666665。
例如,在下面的计算中:
c等于a与b差值的平方。
均方误差被定义为c的平均值。
在启动会话之前,请注意以下步骤:
首先计算a与b之差。
然后对这个差值进行平方运算得到c。
接着使用reduce_mean函数计算c的平均值得到均方误差。
打印c的具体数值。
同样地,打印均方误差的结果。
上述运算完成后将得到以下结果矩阵:
[[9,9,9],
[4,4,4],
[1,1,1]]
其平均值为4.67左右。
以上过程完成之后即可获得所需的结果数据集。
5)标准差(Standard Deviation):
又常称均方差,是方差的算术平方根,用σ表示。标准差能反映一个数据集的离散程度。其实方差与标准差都是反映一个数据集的离散程度,只是由于方差出现了平方项造成量纲的倍数变化,无法直观反映出偏离程度,于是出现了标准差。

简单来说就是将原来的输出3, 1, -3经过softmax运算后映射到(0, 1)区间内,并且总和仍为1(满足概率性质)。我们可以将其视为概率,在最后选择具有最高概率的结点作为预测目标!需要注意的是,在这种情况下如果输入是负数,则其对应的概率会较小。
tf.nn.sigmoid_cross_entropy_with_logits的具体实现细节如下:首先会对输入的logits进行sigmoid函数作用后得到相应的概率值;接着基于这些概率值进行交叉熵的计算;值得注意的是,在交叉熵计算过程中进行了优化处理;这种改进确保了在实际应用中不会出现数值溢出问题。
适用于每个类别彼此独立且同时存在的情况:比如一幅图可以同时包含一条狗和一只大象。
output不是单一数值而是每个批次中的所有样本对应的损失因此在计算时通常会结合tf.reduce_mean(loss)进行处理
计算公式:

假设x=logists, z=labels
loss=z*(-log(sigmoid(x))+(1-z)(-log(1-sigmoid(x))
=z(-log(1/(1+exp(-x)))+(1-z)_(-log(exp(-x)/(1+exp(-x)))
=z_log(1+exp(-x))+(1-z)_log((1+exp(-x)/exp(-x)))
=z_log(1+exp(-x))+(1-z)(log(1+exp(-x))-log(exp(-x))
=log(1+exp(-x)+x(1-z)=x-x*z+log(1+exp(-x))
当自变量为负值时,在计算指数函数exp(-x)时可能会导致数值溢出现象的发生。为此可将其转换为:
-x - x_{z}+\ln\left(1+\mathrm{e}^{-x}\right)
=-, x_{z}+\ln\left(\mathrm{e}{x}\right)+\ln\left(1+\mathrm{e}{-x}\right)
=-, x \cdot z+\ln\left(1+\mathrm{e}^{x}\right)
统一形式就是如下:
max(x,0)−x∗z+log(1+exp(−abs(x)))
softmax_cross_entropy_with_logits
其中labels与logits均为相同类型的张量(tensor),且拥有相同的形状。满足归一化条件:sum(labels)=1,并且该one_hot向量仅包含一个元素为1.0,其余元素均为0.0。
运算流程为:对输入的logits先运用softmax函数进行处理,随后计算其交叉熵值.然而,在交叉熵的具体计算中进行了优化处理,以确保数值不会溢出.
适用情况是各类别之间互斥的情形.具体而言,在分类任务中一张图只能归于某一类别,并不能同时包含多个对象如一条狗和一头大象.
output:输出不是一个标量值(non-scalar),而是代表每个批次样本的损失总和(sum of losses per batch)。因此,在计算平均损失时(average loss)通常与tf.reduce_mean(loss)结合使用(are used together)。
计算公式:

那么这个loss的计算方式与前面有何不同? 因为y_{i,j}=1, 所以1 - y_{i,j}=0, 这使得后续一项值为零而得以省略。
该函数与常规交叉熵损失函数的主要区别在于其label的表现形式:在稀疏情况下(即 sparse 的情况下),label采用的是整数形式;而在非稀疏的情况下,则采用了one-hot编码的方式。具体而言,在稀疏的情况下(即 sparse 的情况下),label是一个整数形式的数值,在这种情况下它表示的是数组行中元素的最大值所对应的索引位置。
可以通过 sparse\_y = \text{tf.arg\_max}(y\_, 1) 来获得,并且 y\_ 是用于 \text{softmax\_cross\_entropy\_with\_logits} 的 labels 参数值;相比之下,在 \text{sparse\_softmax\_cross\_entropy\_with\_logits} 中,则使用的是 \text{sparse\_y} 作为 labels 参数值。
该函数要求输入为类似于one-hot编码格式的多维数据
该函数的作用及其功能体现在以下方面:
具体数据形式如下:
[[[数值列表一],
[数值列表二],
[数值列表三]]]
通过调用tf.arg_max函数计算得到的结果为
其最大值位置结果为[4,...]
当y_被赋值为特定数值矩阵时,
例如:
[[[概率分布一],
[概率分布二],
[概率分布三]]]
其稀疏标签形式则分别为
[2,...]
在深度学习框架中,“tf.nn中实现的加权sigmoid交叉熵损失函数”用于评估预测值与真实标签之间的差异。“该函数通过输入张量计算带有权重参数的目标值、预测值以及加权系数来确定加权sigmoid交叉熵损失。”其中,“该函数通过输入张量”具体指代的是“目标值、预测值以及加权系数作为输入张量”。这一过程通常由以下公式表示:
其中交叉熵损失通常由以下公式表示:
\text{loss} = \text{targets} \cdot -\log(\text{sigmoid}(\text{logits})) + (1 - \text{targets}) \cdot -\log(1 - \text{sigmoid}(\text{logits}))
当pos_weights大于1时,在一定程度上有助于减少假阴性数量的同时能够进一步增强模型的记忆能力。相反地设定pos_weights小于1则能够在一定程度上降低假阳性数量从而提升模型的整体准确率。这样的损失函数由两部分组成:一部分用于计算真实标签对应的负对数几率并对每个样本进行加权处理;另一部分则用于计算虚假标签对应的负对数几率从而全面评估模型的表现
设 x 是 logits, z 是 targets, q 是 pos_weight
qz \cdot \ln\left(\frac{e^{-x}}{1+e^{-x}}\right)^{-1} + (1-z)\cdot \ln\left(\frac{e^{-x}}{1+e^{-x}}\right)^{-1}
= qz \cdot \ln(1+e^{-x}) + (1-z)\cdot (-\ln e^{-x}+\ln(1+e^{-x}))
= qz \cdot \ln(1+e^{-x}) + (q-z)\cdot x+(q+z-2)\cdot \ln(2+e^{-2})
= [q-(2-z)]\cdot x+[q+z]\cdot \ln(e^{2}+2)
设 l = (1 + (q - 1) * z), 为了防止溢出,实现用下面的式子:
loss=(1 - z) * x + l * (log(1 + exp(-abs(x))) + max(-x, 0))
这就是TensorFlow中现成的关于Cross Entropy损失函数的具体实现方案。模型开发者需要了解多标签与多项分类的不同场景,在实际应用中,请根据业务需求判断分类目标是否为独立且互斥的关系,并决定采用sigmoid函数还是softmax函数来进行模型构建。当采用sigmoid激活函数时,默认情况下不带权重参数;而当采用softmax激活函数时,默认情况下不带权重参数;如果希望引入权重,则可以自行设计相应的加权机制。
