[隐藏左侧目录栏][显示左侧目录栏]

该文章有不少的漏洞!!!

该文章有不少的漏洞!!!

该文章有不少的漏洞!!!

重要的事情说三遍,尽快修改该文章。

分类任务损失函数的原理#

一、分类任务的符号说明#

这里所说的分类任务是指二分类任务和多分类任务,其他如多标签分类任务其损失函数与二分类完全相同。

数据集:D=\{(x_1, y_1), (x_2, y_2), ..., (x_N, y_N)\},其中 N 表示样本总数量。

类别集合:C=\{class1, class2, ..., class|C|\},其中 |C| 表示类别总数,即这是一个几分类任务。以一个三个类别的情感分析任务为例,类别集合为:C=\{正向, 负向, 中性\},且 |C|=3

对某条样本的类别做one hot编码后,得到一个只有一个元素为1,其他元素都为0的向量。还是以上述三个类别的情感分析任务为例,做one hot编码之后得到的向量可能为:(1, 0, 0)(0, 1, 0)(0, 0, 1)

另外还有两个常见的符号为:y_i\hat{y}_i,其中 y_i 表示第 i 条样本的标注结果;\hat{y}_i 表示第 i 条样本的模型预测结果;关于这两个符号更详细的含义在二分类任务和多分类任务中并不相同,在后面使用时再详细说明其含义。

二分类任务的损失函数为:\begin{equation}L(\theta)=-\sum_{i=1}^N \big[ y_i \log(\hat{y}_i) + (1-y_i)\log (1-\hat{y}_i) \big]\end{equation}

多分类任务的损失函数为:\begin{equation}L(\theta)=-\sum_{i=1}^N y_i \log \hat{y}_i\end{equation}

下面要做的工作就是推导出上述两个损失函数的公式。

二、从KL散度推导出损失函数#

深度学习的目标是:希望学习的 模型分布 p_{model} 与该任务的真实分布 P_{real} 一致。

问题在于该任务的真实分布 P_{real} 是无法获取到的,能够获取到的是 数据分布 P_{data},我们一般认为训练数据是从总体中独立同分布采样出来的,基于该条件下,就可以认为 数据分布 P_{data} 与真实分布 P_{real} 是一致的。这样深度学习的目标就是:希望学到的 模型分布 P_{model}数据分布 P_{data} 一致。

然后剩余的问题就是如何评估两个分布是否一致?答案是使用KL散度进行评估。因为KL散度的定义就是衡量两个概率分布 pq 的差异。

两个分布越相近,KL散度越小;两个分布的差异越大,KL散度也越大;当两个分布相同时,KL散度为0。

KL散度的公式(关于KL散度的更多说明,详见KL散度):

\begin{equation}D_{KL}(p|q)=\sum_{i=1}^N p(x_i) \log \frac{p(x_i)}{q(x_i)} = \sum_{i=1}^N \big[ p(x_i) \log p(x_i) -p(x_i) \log q(x_i) \big]\end{equation}

上述公式中的 p(x_i) 表示 数据分布q(x_i) 表示 模型分布

在上述KL散度的公式中 p(x_i) \log p(x_i) 这一项是训练集的熵,在深度学习中训练集是已知且固定的,所以其熵是一个常数,所以可以将该项省略掉。将该项省略掉之后就得到交叉熵(也称相对熵)的公式了。交叉熵也就是在分类任务中使用的损失函数,如下:

\begin{equation}L(\theta) = -\sum_{i=1}^N p(x_i) \log q(x_i)\end{equation}

2.1 推导二分类的损失函数#

二分类任务只有两个类别:{正, 负},在二分类任务中 y_i\hat{y}_i 的含义为:

  • \hat{y}_i 表示模型对第 i 条样本预测类别为"正"的概率;
  • y_i 表示第 i 条样本所属类别是否为正例。如果将第 i 条样本的标签做one hot编码得到一个包含两个元素的向量,那么 y_i 就表示该向量中第一个元素的值,举例详细说明:
    • 若第 i 条样本所属类别为"正",则其标签做one hot编码后的向量为 (1, 0),此时 y_i=1(取向量中第一个元素的值);
    • 若第 i 条样本所属类别为"负",则其标签做one hot编码后的向量为 (0, 1),此时 y_i=0(取向量中第一个元素的值);

交叉熵公式(2)中的 p(x_i) 表示数据分布,即 y_i(1-y_i)q(x_i) 表示模型分布,即\hat{y}_i(1-\hat{y}_i)。这样就很容易将交叉熵公式使用 y_i\hat{y}_i 进行表示,即下述两个公式:

\begin{equation}L(\theta)=\sum_{i=1}^Nl_i(\theta)\end{equation}
\begin{equation} l_i(\theta)=\begin{cases} -y_i \log \hat{y}_i, &\text{当}y_i=1\text{时}\\ -(1-y_i) \log (1-\hat{y}_i), &\text{当}y_i=0\text{时} \end{cases} \end{equation}

上述公式是分段形式的,还可以将其合并为一个函数,就得到了二分类任务的损失函数:

\begin{equation}L(\theta)=-\sum_{i=1}^N \big[ y_i \log(\hat{y}_i) + (1-y_i)\log (1-\hat{y}_i) \big]\end{equation}

2.2 推导多分类的损失函数#

对于多分类任务要先说明一下 y_i\hat{y}_i 的含义,在多分类中这两个符号的含义与二分类中是不同的,这也是理解二分类和多分类的损失函数时的一个小坑:

  • \hat{y}_i 表示模型对第 i 条样本所属类别预测的概率;
  • y_i 表示第 i 条样本的标签做one hot编码后得到的向量中,该样本所属类别的在向量中的值,也就是恒为1;

还是以三分类任务 {正向, 负向, 中性} 进行举例说明:

  • 若第 i 条样本所属类别为"正向",则其标签做one hot编码后的向量为 (1, 0, 0),此时 y_i 表示的是该向量中的第一个元素,即y_i=1y_i取值永远为1);此时 \hat{y}_i 表示的是模型对第 i 条样本预测为"正向"的概率,假设此时模型对三个类别预测的概率为 (0.2, 0.3, 0.5),则 \hat{y}_i=0.2

  • 若第 i 条样本所属类别为"负向",则其标签做one hot编码后的向量为 (0, 1, 0),此时 y_i 表示的是该向量中的第二个元素,即y_i=1y_i取值永远为1);此时 \hat{y}_i 表示的是模型对第 i 条样本预测为"负向"的概率,假设此时模型对三个类别预测的概率为 (0.2, 0.3, 0.5),则 \hat{y}_i=0.3

  • 若第 i 条样本所属类别为"中性",则其标签做one hot编码后的向量为 (0, 0, 1),此时 y_i 表示的是该向量中的第三个元素,即y_i=1y_i取值永远为1);此时 \hat{y}_i 表示的是模型对第 i 条样本预测为"中性"的概率,假设此时模型对三个类别预测的概率为 (0.2, 0.3, 0.5),则 \hat{y}_i=0.5

交叉熵公式(2)中的 p(x_i) 表示数据分布,即 y_iq(x_i) 表示模型分布,即\hat{y}_i。这样就很容易将交叉熵公式使用 y_i\hat{y}_i 进行表示:

\begin{equation}L(\theta)=-\sum_{i=1}^N y_i \log \hat{y}_i\end{equation}

由于 y_i 恒为1,所以可以将其省略,就得到了多分类任务的损失函数:

\begin{equation}L(\theta)=-\sum_{i=1}^N \log \hat{y}_i\end{equation}

综上可以看出: 二分类和多分类的交叉熵损失的公式,之所以在形式上看起来不一致,主要是因为符号 y_i\hat{y}_i 所表示的含义不同。虽然二分类和多分类交叉熵损失的公式在形式上看起来不同,但是从推导过上可知它们的本质是相同的,只不过是符号定义上有差别。

三、从似然函数推导出损失函数#

该小节中的符号 y_i\hat{y}_i 的含义与上一小节是完全相同的。

从极大化似然函数的角度出发,我们希望极大化如下似然函数。

\begin{equation}\text{Likelihood} = \log \prod_{i=1}^N p(x_i) = \sum_{i=1}^N \log p(x_i)\end{equation}

将极大化任务改为极小化任务只需加一个负号即可,得到损失函数如下:

\begin{equation}L(\theta) = -\sum_{i=1}^N \log p(x_i)\end{equation}

公式中的符号 N 表示样本总数。p(x_i) 表示模型对第 i 条样本,将其预测为其所属类别的概率。

3.1 推导二分类的损失函数#

在二分类任务中:

  • 当第 i 条样本类别为"正"时,y_i=1,模型对该样本属于"正"类别的概率为 \hat{y}_i
  • 当第 i 条样本类别为"负"时,y_i=0,模型对该样本属于"负"类别的概率为 1-\hat{y}_i

将公式(9)改为使用 y_i\hat{y}_i 进行表示:

\begin{equation}L(\theta)=\sum_{i=1}^Nl_i(\theta)\end{equation}
\begin{equation} l_i(\theta)=\begin{cases} -\log \hat{y}_i, &\text{当}y_i=1\text{时}\\ -\log (1-\hat{y}_i), &\text{当}y_i=0\text{时} \end{cases} \end{equation}

上述公式是分段形式的,还可以将其合并为一个函数,就得到了二分类任务的损失函数:

\begin{equation}L(\theta)=-\sum_{i=1}^N \big[ y_i \log(\hat{y}_i) + (1-y_i)\log (1-\hat{y}_i) \big]\end{equation}

3.2 推导多分类的损失函数#

在多分类任务中,类别集合为 C=\{class1, class2, ..., class|C|\},类别总数为 |C|

对于第 i 条样本,模型将其预测为所属类别的概率为 \hat{y}_i

从公式(9)中来看,与 y_i 没什么关系,将其改为使用 \hat{y}_i 表示的形式,就得到了多分类任务的损失函数:

\begin{equation}L(\theta)=-\sum_{i=1}^N \log \hat{y}_i\end{equation}

综上可以看出: 从似然函数出发推导出的二分类和多分类的损失函数与从KL散度出发推导出的损失函数是完全相同的。

四、总结#

本文分别从KL散度和似然函数的角度出发,推导出了二分类任务和多分类任务的损失函数。从上述两个角度出发推导出的结果都是相同的。至于为什么最终推导出的结果相同,KL散度与似然函数之间是否有关系,受限于数学基础不足,还不清楚。本人一般在对二分类和多分类任务的损失函数进行思考时,多是从KL散度的角度出发的,即衡量模型分布P_{model}与数据分布P_{data}是否足够相似。

Reference#