继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

入门级都能看懂的softmax详解

慕村225694
关注TA
已关注
手记 278
粉丝 9
获赞 35
概述

softmax教程通过探讨softmax函数在深度学习中的应用,从“max”与“soft”概念出发,解释了其将一组实数值转换为概率分布的过程。定义包含e的幂次方与概率求和的公式,确保所有输出概率之和为1。教程进一步解析了softmax的求导关键,以及在反向传播中的应用,展示了其在计算梯度以优化参数的效率。同时,进行了软化分类与多个二元分类器的对比,以便在不同分类场景中做出选择。最后,通过Pytorch实战实例,演示了如何构建并训练使用softmax的分类器,提供了从理论到实践的完整指导。

softmax初探

在机器学习领域,特别是深度学习中,softmax函数是一个非常常用的工具,尤其在多分类问题中。它的作用是将一组实数值转换为概率分布,使得输出值的和为1,且每个值都在0到1之间。我们可以从两个概念“max”和“soft”入手理解它。

  • max:这个概念意味着我们选择数值中的最大值。例如,如果有两个变量a和b,如果a比b大,那么我们选择a;反之,选择b。
  • soft:软化处理意味着我们不只取最大值,而是考虑每个值,将每个值映射到0到1之间的概率。这样的取值方式让模型有更加平滑和连续的输出特性。

softmax的定义与图示

softmax函数的定义是:
[ S_i = \frac{e^{xi}}{\sum{j} e^{x_j}} ]

其中,(x_i)表示输入数组的每个元素,而(S_i)的值则表示该元素的概率。这个函数确保了所有输出值的和为1,并且能够平滑地将输入映射到概率空间。

softmax的求导

softmax的核心在于它能够映射输入到概率分布,并且其导数对于计算梯度非常重要。假设我们有损失函数(Loss = -\sum_{i} t_i \cdot \ln(y_i)),其中(y_i)是通过softmax计算得到的概率,而(t_i)表示真实标签。

推导过程

[
\frac{\partial Loss_i}{\partial x_i} = -\frac{\partial \ln(y_i)}{\partial x_i} = -\frac{\partial \ln(\frac{e^{xi}}{\sum{j} e^{x_j}})}{\partial xi} = -\frac{\sum{j} e^{x_j}}{e^{x_i}} \cdot \frac{\partial \frac{e^{xi}}{\sum{j} e^{x_j}}}{\partial x_i}
]

[
= -\frac{\sum_{j} e^{x_j}}{e^{xi}} \cdot \left(-\frac{\sum{j} e^{x_j} \cdot e^{x_i} - e^{xi}}{\left(\sum{j} e^{x_j}\right)^2}\right) = \frac{y_i \cdot (yi - 1)}{\sum{j} e^{x_j}}
]

通过求导,我们发现softmax的导数与softmax自身密切相关,这个特性在反向传播中非常有用,可以轻松计算梯度以便进行参数更新。

软化分类多个二元分类器的比较

在构建分类模型时,选择使用softmax回归还是多个二元分类器(如逻辑回归)取决于类别的性质:

  • 互斥类别:如果类别的选择在逻辑上是互斥的(即每个样本只能属于其中一个类别),那么使用softmax回归是合适的。它会为每个类别分配一个概率,所有类别的概率之和等于1。

  • 非互斥类别:在某些情况下,类别之间可能存在重叠或包含关系(例如,照片中可能同时存在人、动物和风景)。这里,使用多个二元分类器可能更适合,每个分类器专注于一类或一组相关的类别。

Pytorch实战:构建与训练softmax分类器

在Pytorch中,我们可以轻松地实现和训练一个使用softmax的分类器。下面是一个简单的实例:

import torch
from torch import nn
import numpy as np
from torch.utils.data import TensorDataset, DataLoader

# 加载与准备数据集
data = pd.read_csv("iris.csv")
X = data.iloc[:, 1:-1].values
Y = data.iloc[:, -1].values
X, Y = torch.from_numpy(X).float(), torch.from_numpy(Y).long()  # 转换为Tensor
dataset = TensorDataset(X, Y)
train_loader = DataLoader(dataset, batch_size=32, shuffle=True)

# 定义模型
class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(4, 3)
    def forward(self, x):
        return F.softmax(self.linear(x), dim=1)

model = Model()
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

# 训练模型
for epoch in range(100):
    for X_batch, Y_batch in train_loader:
        # 前向传播
        y_pred = model(X_batch)
        loss = loss_fn(y_pred, Y_batch)

        # 反向传播
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

通过结合以上内容,我们全面地理解了softmax函数的原理、求导、在多分类任务中的应用,以及如何将其应用于实际代码中。这不仅增强了我们对softmax函数的理解,也提供了在实践中构建和训练模型的基础知识。

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP