逻辑回归、交叉熵、softmax

本文详细探讨了softmax函数在多元分类中的应用,逻辑回归在多标签分类中的角色,以及交叉熵作为损失函数在衡量预测与真实分布相似度中的作用。通过实例解析,阐述了在不同场景下如何选择并使用这些方法。

什么时候用softmax?


softmax是一种归一化函数,用于将向量中元素的值都归一化0~1之间,并保持其加和为1。
公示表达为:


这里写图片描述


这里写图片描述


根据公式和图片可看出,前一层的激活值越大,经过softmax函数后的值也就越大,又因为softmax的所有输出加和为1,因此,常利用softmax层将激活值与概率实现映射。

举例:


多元分类(multi-class classification)中,每个样本只属于一个类别。将最后一个全连接层输入softmax层,即可得到样本属于每个类别的概率P(yi|X),注意,这些概率加和等于1

什么时候用逻辑回归?

逻辑回归通常用于二分类问题,而Softmax函数主要用于多分类问题,是逻辑回归在多分类场景下的推广,即Softmax回归 [^1]。 ### 原理 逻辑回归是二分类模型,而Softmax回归是多分类模型,其y值不再局限于0和1,而是可以表示多个类别,一般采用one - hot编码表示,如[1,0,0],[0,1,0],[0,0,1]分别对应第1、2、3类 [^2]。Softmax函数能够同时输出多个类别的概率,它将线性回归模型的输出转换为属于各个类别的概率,使得所有类别的概率之和为1。对于输入向量 $z$,Softmax函数的计算公式为: $$ \sigma(z)_j = \frac{e^{z_j}}{\sum_{k = 1}^{K}e^{z_k}} \quad \text{for} \ j = 1, \dots, K $$ 其中,$z_j$ 是输入向量 $z$ 的第 $j$ 个元素,$K$ 是类别的数量。 ### 应用 Softmax回归常用于三个及以上的分类问题,在输出层使用Softmax作为激活函数,例如在图像分类中,将图像分类为多个不同的类别,如猫、狗、鸟等;在文本分类中,将文本分类为不同的主题,如体育、科技、娱乐等 [^1]。 ### 使用方法 在实际应用中,使用Softmax回归进行多分类任务通常包含以下步骤: 1. **数据准备**:将数据集划分为训练集和测试集,并将标签转换为one - hot编码。 2. **模型构建**:构建线性回归模型,将其输出作为Softmax函数的输入。 3. **损失函数**:通常使用交叉熵损失函数,它衡量了预测概率分布与真实标签分布之间的差异。交叉熵损失函数的公式为: $$ L(y, \hat{y}) = -\sum_{i = 1}^{N}\sum_{j = 1}^{K}y_{ij}\log(\hat{y}_{ij}) $$ 其中,$N$ 是样本数量,$K$ 是类别的数量,$y_{ij}$ 是第 $i$ 个样本的真实标签的第 $j$ 个分量,$\hat{y}_{ij}$ 是第 $i$ 个样本属于第 $j$ 类的预测概率。 4. **模型训练**:使用优化算法(如梯度下降)最小化损失函数,更新模型的参数。 5. **模型评估**:使用测试集评估模型的性能,常用的评估指标包括准确率、召回率、F1值等。 以下是一个使用Python和PyTorch实现Softmax回归的简单示例: ```python import torch import torch.nn as nn import torch.optim as optim # 定义模型 class SoftmaxRegression(nn.Module): def __init__(self, input_size, num_classes): super(SoftmaxRegression, self).__init__() self.linear = nn.Linear(input_size, num_classes) def forward(self, x): out = self.linear(x) return out # 初始化模型、损失函数和优化器 input_size = 10 num_classes = 3 model = SoftmaxRegression(input_size, num_classes) criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.01) # 模拟训练数据 x_train = torch.randn(100, input_size) y_train = torch.randint(0, num_classes, (100,)) # 训练模型 num_epochs = 100 for epoch in range(num_epochs): outputs = model(x_train) loss = criterion(outputs, y_train) optimizer.zero_grad() loss.backward() optimizer.step() if (epoch+1) % 10 == 0: print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值