二分类交叉熵损失函数是由极大似然估计推导出来的,对于有 m m m个样本的数据集而言,在全部样本上的平均损失写作:
L ( w ) = − ∑ i = 1 m ( y i ⋅ ln ( σ i ) + ( 1 − y i ) ⋅ ln ( 1 − σ i ) ) L(w) = -\sum_{i=1}^{m} \left( y_i \cdot \ln(\sigma_i) + (1 - y_i) \cdot \ln(1 - \sigma_i) \right) L(w)=−i=1∑m(yi⋅ln(σi)+(1−yi)⋅ln(1−σi))
在单个样本的损失写作:
L ( w ) i = − ( y i ⋅ ln ( σ i ) + ( 1 − y i ) ⋅ ln ( 1 − σ i ) ) L(w)_i = -\left( y_i \cdot \ln(\sigma_i) + (1 - y_i) \cdot \ln(1 - \sigma_i) \right) L(w)i=−(yi⋅ln(σi)+(1−yi)⋅ln(1−σi))
其中, l n ln ln是以自然底数 e e e为底的对数函数, w w w表示求解出来的一组权重(在等号的右侧, w w w在 σ \sigma σ里), m m m是样本的个数, y i y_i yi是样本 i i i上真实的标签, σ i \sigma_i σi是样本 i i i上基于参数 w w w计算出来的sigmoid函数的返回值, x i x_i xi是样本 i i i各个特征的取值。我们的目标就是求解出使 L ( w ) L(w) L(w)最小的 w w w取值。
注意,在神经网络中,特征张量 X X X是自变量,权重是 w w w。但在损失函数中,权重 w w w是损失函数的自变量,特征 x x x和真实标签 y y y都是已知的,相当于是常数。
39.1 极大似然估计求解二分类交叉熵损失
二分类交叉熵损失函数是怎么来的呢?为什么这个函数能够代表二分类时,真实值与预测值的差异呢?
极大似然估计(Maximum Likelihood Estimate,MLE)的感性认识
如果一个事件的发生概率很大,那这个事件应该很容易发生。相应的,如果依赖于权重 w w w的任意事件的发生就是我们的目标,那我们只要寻找令其发生概率最大化的权重 w w w就可以了。
寻找相应的权重 w w w,使得目标事件的发生概率最大,就是极大似然估计的基本方法。
其步骤如下:
构筑似然函数 P ( w ) P(w) P(w),用于评估目标事件发生的概率,该函数被设计成目标事件发生时,概率最大。
在这里,我们基于极大似然估计法来推导交叉熵损失,这个推导过程能够帮助我们充分了解交叉熵损失的含义,以及为什么 L ( w ) L(w) L(w)的最小化能够实现模型在数据集上的拟合最好。
我们来看看逻辑回归的对数似然函数是怎样构筑的。
构筑对数似然函数
二分类神经网络的标签是[0, 1],此标签服从伯努利分布(即0-1分布),因此可得:
样本 i i i在由特征向量 x i x_i xi和权重向量 w w w组成的预测函数中,样本标签被预测为1的概率为:
P 1 = P ( y ^ i = 1 ∣ x i , w ) = σ P_1 = P(\hat{y}_i = 1 | x_i, w) = \sigma P1=P(y^i=1∣xi,w)=σ 对二分类而言, σ \sigma σ就是sigmoid函数的结果。
样本 i i i在由特征向量 x i x_i xi和权重向量 w w w组成的预测函数中,样本标签被预测为0的概率为:
P 0 = P ( y ^ i = 0 ∣ x i , w ) = 1 − σ P_0 = P(\hat{y}_i = 0 | x_i, w) = 1-\sigma P0=P(y^i=0∣xi,w)=1−σ
当 P 1 P_1 P1的值为1的时候,代表样本 i i i的标签被预测为1;当 P 0 P_0 P0的值为1的时候,代表样本 i i i的标签被预测为0。 P 1 P_1 P1与 P 0 P_0 P0相加一定是等于1的。
假设样本 i i i的真实标签 y i y_i yi为1,并且 P 1 P_1 P1也为1的话,那就说明我们将 i i i的标签预测为1的概率很大,与真实值一致,那模型的预测就是准确的,拟合程度很高,信息损失很少。相反,如果 P 1 P_1 P1接近0,就说明信息损失很多。当 y i y_i yi为0时也是同样的道理。
所以,当 y i y_i yi为1的时候,我们希望 P 1 P_1 P1非常接近1,当 y i y_i yi为0的时候,我们希望 P 0 P_0 P0非常接近1,这样,模型的效果就很好,信息损失就很少。
真实标签 y i y_i yi
被预测为1的概率 P 1 P_1 P1
被预测为0的概率 P 0 P_0 P0
样本被预测为?
与真实值一致吗?
拟合状况
信息损失
1
0
1
0
否
坏
大
1
1
0
1
是
好
小
0
0
1
0
是
好
小
0
1
0
1
否
坏
大
将两种取值的概率整合,我们可以定义如下等式:
P ( y ^ i ∣ x i , w ) = P 1 y i ∗ P 0 1 − y i P(\hat{y}_i | x_i, w) = P_1^{y_i} * P_0^{1-y_i} P(y^i∣xi,w)=P1yi∗P01−yi
这个等式同时代表了 P 1 P_1 P1和 P 0 P_0 P0,在数学上,它被叫做逻辑回归的假设函数。
当样本 i i i的真实标签 y i y_i yi为1的时候, 1 − y i 1-y_i 1−yi就等于0, P 0 P_0 P0的0次方就是1,所以 P ( y ^ i ∣ x i , w ) P(\hat{y}_i | x_i, w) P(y^i∣xi,w)就等于 P 1 P_1 P1,这个时候,如果 P 1 P_1 P1为1,模型的效果就很好,损失就很小。
同理,当样本 i i i的真实标签 y i y_i yi为0的时候, P ( y ^ i ∣ x i , w ) P(\hat{y}_i | x_i, w) P(y^i∣xi,w)就等于 P 0 P_0 P0,此时如果 P 0 P_0 P0非常接近1,模型的效果就很好,损失就很小。
所以,为了达成让模型拟合好,损失小的目的,我们每时每刻都希望 P ( y ^ i ∣ x i , w ) P(\hat{y}_i | x_i, w) P(y^i∣xi,w)的值等于1 。而 P ( y ^ i ∣ x i , w ) P(\hat{y}_i | x_i, w) P(y^i∣xi,w)的本质是样本 i i i由特征向量 x i x_i xi和权重 w w w组成的预测函数中,预测出所有可能的 y ^ i \hat{y}_i y^i的概率,因此1是它的最大值。 也就是说,每时每刻,我们都在追求 P ( y ^ i ∣ x i , w ) P(\hat{y}_i | x_i, w) P(y^i∣xi,w)的最大值。 而寻找相应的参数 w w w,使得每次得到的预测概率最大,正是极大似然估计的基本方法,不过 P ( y ^ i ∣ x i , w ) P(\hat{y}_i | x_i, w) P(y^i∣xi,w)是对单个样本而言的,因此我们还需要将其拓展到多个样本上。
P ( y ^ i ∣ x i , w ) P(\hat{y}i | x_i, w) P(y^i∣xi,w)是对单个样本 i i i而言的函数,对一个训练集 m m m个样本来说,我们可以定义如下等式来表达所有样本在特征张量 X X X和权重向量 w w w组成的预测函数中,预测出所有可能的 y ^ \hat{y} y^的概率 P P P为:
P = ∏ i = 1 m P ( y ^ i ∣ x i , w ) = ∏ i = 1 m ( P 1 y i ∗ P 0 1 − y i ) = ∏ i = 1 m ( σ i y i ∗ ( 1 − σ i ) 1 − y i ) \begin{align*} P &= \prod{i=1}^m P(\hat{y}i | x_i, w) \\ &= \prod{i=1}^m (P_1^{y_i} * P_0^{1-y_i}) \\ &= \prod_{i=1}^m (\sigma_i^{y_i} * (1 - \sigma_i)^{1-y_i}) \end{align*} P=i=1∏mP(y^i∣xi,w)=i=1∏m(P1yi∗P01−yi)=i=1∏m(σiyi∗(1−σi)1−yi) 这个函数就是逻辑回归的似然函数 。对该概率 P P P取以 e e e为底的对数,再由 l o g ( A ∗ B ) = l o g A + l o g B log(A*B)=logA+logB log(A∗B)=logA+logB和 l o g A B = B l o g A logA^B=BlogA logAB=BlogA可得到逻辑回归的对数似然函数:
ln P = ln ∏ i = 1 m ( σ i y i ∗ ( 1 − σ i ) 1 − y i ) = ∑ i = 1 m ln ( σ i y i ∗ ( 1 − σ i ) 1 − y i ) = ∑ i = 1 m ( ln σ i y i + ln ( 1 − σ i ) 1 − y i ) = ∑ i = 1 m ( y i ∗ ln ( σ i ) + ( 1 − y i ) ∗ ln ( 1 − σ i ) ) \begin{align*} \ln P &= \ln \prod_{i=1}^m (\sigma_i^{y_i} * (1 - \sigma_i)^{1-y_i}) \\ &= \sum_{i=1}^m \ln (\sigma_i^{y_i} * (1 - \sigma_i)^{1-y_i}) \\ &= \sum_{i=1}^m (\ln \sigma_i^{y_i} + \ln (1 - \sigma_i)^{1-y_i}) \\ &= \sum_{i=1}^m (y_i * \ln(\sigma_i) + (1 - y_i) * \ln(1 - \sigma_i)) \end{align*} lnP=lni=1∏m(σiyi∗(1−σi)1−yi)=i=1∑mln(σiyi∗(1−σi)1−yi)=i=1∑m(lnσiyi+ln(1−σi)1−yi)=i=1∑m(yi∗ln(σi)+(1−yi)∗ln(1−σi))
这就是我们的二分类交叉熵函数。为了数学上的便利以及更好地定义"损失"的含义,我们希望将极大值问题转换成极小值问题,因此我们对 l n P lnP lnP取负,并且让权重 w w w作为函数的自变量,就得到了我们的损失函数 L ( w ) L(w) L(w):
L ( w ) = − ∑ i = 1 m ( y i ⋅ ln ( σ i ) + ( 1 − y i ) ⋅ ln ( 1 − σ i ) ) L(w) = -\sum_{i=1}^{m} (y_i \cdot \ln(\sigma_i) + (1 - y_i) \cdot \ln(1 - \sigma_i)) L(w)=−i=1∑m(yi⋅ln(σi)+(1−yi)⋅ln(1−σi))
当 L ( w ) L(w) L(w)为0时, l n P lnP lnP就等于0, P P P就得到最大概率1。
对于多分类的状况而言,标签不再服从伯努利分布(0-1分布),因此我们可以定义,样本 i i i在由特征向量 x i x_i xi和权重向量 w w w组成的预测函数中,样本标签被预测为类别 k k k的概率为:
P k = P ( y ^ i = k ∣ x i , w ) = σ P_k = P(\hat{y}_i = k | x_i, w) = \sigma Pk=P(y^i=k∣xi,w)=σ
对于多分类算法而言, σ \sigma σ就是softmax函数返回的对于类别的值。
假设一种最简单的情况:我们现在有三分类[1, 2, 3],则样本 i i i被预测为三个类别的概率分别为:
P 1 = P ( y ^ i = 1 ∣ x i , w ) = σ 1 P 2 = P ( y ^ i = 2 ∣ x i , w ) = σ 2 P 3 = P ( y ^ i = 3 ∣ x i , w ) = σ 3 \begin{align*} P_1 &= P(\hat{y}_i = 1 | x_i, w) = \sigma_1 \\ P_2 &= P(\hat{y}_i = 2 | x_i, w) = \sigma_2 \\ P_3 &= P(\hat{y}_i = 3 | x_i, w) = \sigma_3 \end{align*} P1P2P3=P(y^i=1∣xi,w)=σ1=P(y^i=2∣xi,w)=σ2=P(y^i=3∣xi,w)=σ3
假设样本的真实标签为1,我们就希望 P 1 P_1 P1最大,同理,如果样本的真实标签为其他值,我们就希望其他值所对应的概率最大。
在二分类中,我们将 y y y和 ( 1 − y ) (1-y) (1−y)作为概率 P P P的指数,以此来融合真实标签0和为1的两种状况。但在多分类中,我们的真实标签可能是任意整数,无法使用 y y y和 ( 1 − y ) (1-y) (1−y)这样的结构来构建似然函数。所以我们认为,如果多分类的标签也可以使用0和1来表示就好了,这样我们就可以继续使用真实标签作为指数的方式。
回顾二分类的似然函数:
P ( y ^ i ∣ x i , w ) = P 1 y i ∗ P 0 1 − y i P(\hat{y}_i | x_i, w) = P_1^{y_i} * P_0^{1-y_i} P(y^i∣xi,w)=P1yi∗P01−yi
当我们把标签整合为标签矩阵后,我们就可以将单个样本在总共 k k k个分类情况整合为以下的似然函数:
P ( y ^ i ∣ x i , w ) = P 1 y i ( k = 1 ) ∗ P 2 y i ( k = 2 ) ∗ P 3 y i ( k = 3 ) ∗ ... ∗ P K y i ( k = K ) P(\hat{y}_i | x_i, w) = P_1^{y_i(k=1)} * P_2^{y_i(k=2)} * P_3^{y_i(k=3)} * \ldots * P_K^{y_i(k=K)} P(y^i∣xi,w)=P1yi(k=1)∗P2yi(k=2)∗P3yi(k=3)∗...∗PKyi(k=K)
其中 P P P就是样本标签被预测为某个具体值的概率,而右上角的指数就是标签矩阵中对应的值,即这个样本的真实标签是否为当前标签的判断(是就是1,否就是0)。
也可将式子简写为:
P ( y ^ i ∣ x i , w ) = P j y i ( k = j ) , j 为样本 i 所对应的真实标签的编号 P(\hat{y}i | x_i, w) = P_j^{y{i(k=j)}}, \quad j \text{为样本} i \text{所对应的真实标签的编号} P(y^i∣xi,w)=Pjyi(k=j),j为样本i所对应的真实标签的编号
对一个训练集的 m m m个样本来说,我们可以定义如下等式来表达所有样本在特征张量 X X X和权重向量 w w w组成的预测函数中,预测出所有可能的 y ^ \hat{y} y^的概率 P P P为:
P = ∏ i = 1 m P ( y ^ i ∣ x i , w ) = ∏ i = 1 m P j y i ( k = j ) = ∏ i = 1 m σ j y i ( k = j ) \begin{align*} P &= \prod_{i=1}^m P(\hat{y}i | x_i, w) \\ &= \prod{i=1}^m P_j^{y_{i(k=j)}} \\ &= \prod_{i=1}^m \sigma_j^{y_{i(k=j)}} \end{align*} P=i=1∏mP(y^i∣xi,w)=i=1∏mPjyi(k=j)=i=1∏mσjyi(k=j)
这是多分类状况下的似然函数。与二分类一致,似然函数解出来后,我们需要对似然函数求对数:
ln P = ln ∏ i = 1 m σ j y i ( k = j ) = ∑ i = 1 m ln ( σ j y i ( k = j ) ) = ∑ i = 1 m y i ( k = j ) ln σ i \begin{align*} \ln P &= \ln \prod_{i=1}^m \sigma_j^{y_{i(k=j)}} \\ &= \sum_{i=1}^m \ln(\sigma_j^{y_{i(k=j)}}) \\ &= \sum_{i=1}^m y_{i(k=j)} \ln \sigma_i \end{align*} lnP=lni=1∏mσjyi(k=j)=i=1∑mln(σjyi(k=j))=i=1∑myi(k=j)lnσi
其中 σ \sigma σ就是softmax函数返回的对应类别的值。在对整个公式取负,就得到了多分类状况下的损失函数:
L ( w ) = − ∑ i = 1 m y i ( k = j ) ln σ i L(w) = -\sum_{i=1}^{m} y_{i(k=j)} \ln \sigma_i L(w)=−i=1∑myi(k=j)lnσi
这个函数就是我们之前提到过的交叉熵函数 。不难看出,二分类的交叉熵函数其实是多分类的一种特殊情况。
交叉熵函数十分特殊,虽然我们求解过程中,取对数的操作是在确定了似然函数后才进行的,但从计算结果看,对数操作其实只对softmax函数的结果 σ \sigma σ起效。因此在实际操作中,我们把 l n ( s o f t m a x ( z ) ) ln(softmax(z)) ln(softmax(z))这样的函数单独定义了一个功能叫做logsoftmax,pytorch可以直接通过nn.logsoftmax类直接调用这个功能。