CrossEntropy Loss
熵的概念来源于信息论,表示的是系统内部的紊乱程度;与之相关的几个概念有:信息熵,相对熵,散度。
熵
信息熵可以看成事件的信息量,事件越不确定表示系统内部越紊乱,产生的结果越有多样性,每种结果发生的概率越小,不确定性越大,信息量也就越大。假设有一事件$X$,可能的结果是$x_0$,该结果发生的概率为$p(x_0)$,则该结果的不确定性定义为($log$表示以2为底的对数):
1 | I(x_0)=-\log{p(x_0)} |
考虑事件 $X$ 不止一个结果,可能有 $n$ 个结果,每个结果发生的可能性为 $p(x_i)$,根据上面的公式可以求得每一个结果的不确定性,信息熵就是这些不确定性的统计平均值(每一种结果给出的贡献为:概率*不确定性),将这个期望值叫做事件 $X$ 的熵:对于二分类问题,可能的结果只有两个(0或1),假设发生的概率为 $p(x)$,熵就表示为:
相对熵
顾名思义,所谓相对就是有两种不同的情况。同样还是考虑事件 $X$,上面所说的 $n$ 种可能构成该事件的一个概率分布,假设它有两种概率分布:$P(X),Q(X)$;其中,$P(X)$表示样本的真实分布,例如:$[1,0,0]$ 就表示样本属于第一类,$[0,1,0]$ 就表示样本属于第二类;$Q(X)$ 表示样本的模型预测分布,$[0.7,0.2,0.1]$ 就是预测该样本属于每一类的概率。
直观理解就是:如果用 $P$ 来描述样本,那么就非常完美;而用 $Q$ 来描述样本,虽然可以大致描述,但是不是那么的完美,信息量不足,需要额外的一些信息增量才能达到和P一样完美的描述。在机器学习中,可以通过建立模型、根据已有样本的真实分布反复训练 $Q$ 的方式,来让 $Q$ 不断逼近 $P$,最终取得一个可以接受的 $Q$ 分布,此时我们认为 $Q(X)$ 等价于 $P(X)$,二者之间不再需要额外的信息增量,并且还可以利用 $Q$ 分布来预测样本以外的情况。
关于 $P(X)$ 和 $Q(X)$ 之间的差异(相对熵),数学上一般用散度来描述。常见的散度例如,KL散度: $n$表示事件 $X$ 的所有可能性,$D_{_{KL}}$ 的值越小,表示 $P$ 分布和 $Q$ 分布越接近。从计算形式上和熵进行对比,可以很好地理解“相对”的概念。这里KL散度表示 $Q$ 拟合 $P$ 的程度,完全拟合时散度为0;不完全拟合时,$D_{_{KL}}(p||q)$ 就是拟合的信息损耗。可以看到,KL散度具有不对称:$D_{_{KL}}(p||q) \neq D_{_{KL}}(q||p)$,而JS散度可以有效避免这种不对称性:
交叉熵
尝试将KL散度展开:前面一部分就是 $P$ 分布的熵的相反数,后面这一部分就是所谓的交叉熵。于是我们可以得到交叉熵的计算公式:交叉熵给出了衡量两个不同分布之间差异的计算公式,我们将这种差异叫做损失;交叉熵越小,表示两个分布越接近、损失越小。在机器学习中,$P$ 就是样本的真实分布,以 $y$ 表示;而 $Q$ 分布则是模型的预测值,以 $\hat{y}$ 表示,于是就有了交叉熵损失函数:上面说过,$n$ 表示所有可能结果的数量,用机器学习中的专业术语来说就是分类数量。该公式给出了模型在单个样本的预测上距离真实情况具有多大的损失值,对于 $mini-batch$ 模式,一次需要处理 $m$ 个样本,此时的交叉熵损失为::
Softmax Loss
sofamax函数
卷积神经网络最终经过全连接层输出一个 $m$ 维向量,每一维的值作为计算样本属于对应类概率的基础,所以该向量基本决定了一个样本属于 $m$ 类中的哪一类。早先利用hardmax方法计算概率时,直接将向量中的最大值置为1,其余直接置为0,1对应的类即为样本所属类。softmax其实是针对hardmax提出来的,它不再直接将向量值置为“非1即0”,而是通过softmax计算。上式就是CNN中的softmax函数,有点类似于激活函数,$w*x+b$ 表示全连接层的输出,每一个分量经过softmax之后得到 $\sigma_i(z)$。
softmax损失
说白了softmax就是做预测的,预测结果准不准还需要和真实的标签对比。真实标签还是记为 $y$,将它和预测值做交叉熵计算:这是模型在单个样本上的损失值,实际上 $y$ 是一个 $one-hot$ 向量,我们假设该样本属于 $y_i$ 类,那么最终模型在单样本上的损失值就是 $-\log\sigma_{y_i}(z)$,因为 $y$ 在非 $y_i$ 分量上的值为0。对于有 $m$ 个样本的 $mini-batch$ 而言,损失函数就是:实际上,softmax损失就是在全连接层后面接一个softmax作为激活函数,然后运用交叉熵损失。
Triplet Loss
softmax损失将预测值和真实值进行差异比较,采用的是一对、两个数据;$TripletLoss$则采用三元组的形式,利用欧氏距离来衡量样本之间的差距。这里的三元组指的是:$(Anchor,Negative,Positive)$,其中Anchor表示样本,Positive表示与样本同一类的样本,Negative表示不同类样本。$TripletLoss$计算样本Anchor与其他两个标签样本的距离,以减小同类样本差距、增大异类样本差距为目的设计损失函数:其中$f(x_i^a)、f(x_i^p)、f(x_i^n)$分别表示Anchor、Positive、Negative所对应的样本,$\alpha$是一个超参数,代表$Positive/Negative$的边界。$TripletLoss$用图来表示就是:

关于参数 $\alpha$
- 当参数 $\alpha$ 值越小时,loss 也就较容易的趋近于 0,于是 Anchor 与 Positive 不需要拉的太近,Anchor 与 Negative 不需要拉的太远,就能使得 loss 很快趋近于 0。这样训练得到的结果,不能够很好的区分相似的图像。
- 当参数 $\alpha$ 值越大时,就需要使得网络参数要拼命地拉近 Anchor、Positive 之间的距离,拉远 Anchor、Negative 之间的距离。如果参数 $\alpha$ 值设置的太大,很可能最后 loss 保持一个较大的值,难以趋近于0。
简而言之,参数 $\alpha$ 值设置的越小,loss 很容易趋近于 0 ,但很难区分相似的图像; $\alpha$ 值设置的越大,loss 值较难趋近于 0,甚至导致网络不收敛,但可以较有把握的区分较为相似的图像。因此,设置一个合理的参数 α 值很关键,这是衡量相似度的重要指标。