MSE的使用
在介绍交叉熵损失函数之前,我们先看看之前讲过的MSE的函数是如何使用的:
可以看到使用方法也是很简单,唯一需要提一下的就是reduction参数,我们用快捷键查看:
这里默认是mean,也就是输出的MSE,如果想要输出SSE,就调整为sum,使用如下:
二分类交叉熵推导
在我们弄好正向传播之后,我们需要一个函数来衡量结果的好坏程度,一般的思路是用准确率来作为结果的衡量,但是由于这不是一个可导的函数,并且只关注于结果并不关注对结果的信心程度。所以这里我们在二分类的时候,使用的损失函数是大名鼎鼎的交叉熵损失函数。想要完整地推导出来交叉熵的函数需要从极大似然估计开始,如果没有学过概率论这方面的可以补一下。
极大似然估计(MLE)
假设我们有一个分类模型,输入是样本 ,输出是样本属于某一类别的概率。极大似然估计的基本思想是,给定数据集
,我们希望选择一个模型参数 w,使得在此模型下观测到的标签
的概率最大化。具体来说,给定
和
,样本
属于某一类别的概率可以由模型输出的概率分布表示。目标是选择一个模型,使得所有样本的似然函数之积最大化。接下来我们按照极大似然估计的流程一步一步推导得到交叉熵损失函数:
由于这一部分公式太多,不便于敲出来,所以这里我们直接用gpt的解释:
当然我们可以调用库里面的函数完成这一功能:
import torch
import torch.nn as nn
# 假设模型的输出已经经过sigmoid处理,表示预测的概率
predictions = torch.tensor([[0.9], [0.3], [0.7], [0.2]], requires_grad=True) # 模型输出的概率(经过sigmoid)
labels = torch.tensor([[1.0], [0.0], [1.0], [0.0]], dtype=torch.float) # 真实标签
# 定义 BCELoss 损失函数
criterion = nn.BCELoss()
# 计算损失
loss = criterion(predictions, labels)
print("交叉熵损失(BCELoss):", loss.item())
BCELoss
是 二分类交叉熵损失,用于已经经过了 sigmoid
激活的模型输出(即模型的输出已经是概率值,范围在 [0, 1] 之间)。
import torch
import torch.nn as nn
# 假设模型的输出是原始 logits(未经过sigmoid)
logits = torch.tensor([[2.0], [0.5], [1.0], [1.5]], requires_grad=True) # 4个样本,1个类别的原始logits
labels = torch.tensor([[1.0], [0.0], [1.0], [0.0]], dtype=torch.float) # 真实标签
# 定义 BCEWithLogitsLoss 损失函数
criterion = nn.BCEWithLogitsLoss()
# 计算损失
loss = criterion(logits, labels)
print("交叉熵损失(BCEWithLogitsLoss):", loss.item())
BCEWithLogitsLoss
是 二分类交叉熵损失,它结合了 sigmoid
激活函数和 BCELoss
计算,因此在使用时,模型的输出不需要经过 sigmoid
,直接输入原始 logits
当然还有多分类交叉熵,我们等用到的时候再进行讲解。