文档管理中心
|

AI

Softmax(软最大化函数)

Softmax(软最大化函数)是机器学习 / 深度学习中核心的激活函数之一,主要用于多分类任务的输出层,能将神经网络输出的原始分数(Logits)转化为归一化的概率分布,让每个类别对应一个 0 到 1 之间的概率值,且所有类别概率之和为 1。

一、 Softmax 的定义与公式

假设神经网络输出层有 K 个神经元,输出的原始分数为 \(z_1, z_2, ..., z_K\)(也叫 Logits),Softmax 会将第 i 个类别的分数转化为概率 \(p_i\):

\(p_i = \frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}}\)

关键特性:

  1. 非负性:指数函数 \(e^{z_i}\) 保证所有概率 \(p_i ≥ 0\);
  2. 归一性:分母是所有类别指数的和,保证 \(\sum_{i=1}^K p_i = 1\);
  3. 相对大小保留:原始分数越高的类别,转化后的概率越大(不会改变类别间的相对顺序)。

二、 直观例子(三分类任务)

假设输出层 3 个神经元的原始分数为:\(z_1=2, z_2=1, z_3=0\),计算 Softmax 概率:

  • 分子:\(e^2≈7.389, e^1≈2.718, e^0=1\);
  • 分母:\(7.389+2.718+1=11.107\);
  • 概率:\(p_1=7.389/11.107≈0.665\)(66.5%),\(p_2=2.718/11.107≈0.245\)(24.5%),\(p_3=1/11.107≈0.090\)(9.0%)。

可以看到:原始分数最高的\(z_1\)对应最高概率,且三者之和为 1,符合概率分布的要求。

三、 Softmax 的核心用途

  1. 多分类任务输出层:是图像分类(如识别 10 类手写数字)、文本分类(如情感分类、主题分类)等多分类任务的标配,将原始分数转化为可解释的概率,方便判断模型预测的类别(取概率最大的类别)。
  2. 与交叉熵损失配合:Softmax 常和类别交叉熵损失(Categorical Cross-Entropy) 组合使用,构成多分类任务的损失函数:\(Loss = -\sum_{i=1}^K y_i \log(p_i)\)其中 \(y_i\) 是真实标签的独热编码(如真实类别是第 2 类,则 \(y_2=1\),其余为 0),该组合能高效优化多分类模型的参数。

四、 关键注意事项(新手避坑)

  1. 数值稳定性问题:原始分数 \(z_i\) 过大时(如 1000),\(e^{z_i}\) 会溢出(变成无穷大)。解决方法:对所有 \(z_i\) 减去其中的最大值 \(max(z)\):\(p_i = \frac{e^{z_i - max(z)}}{\sum_{j=1}^K e^{z_j - max(z)}}\)(数学上等价于原公式,但能避免指数溢出)。

  2. 二分类 vs 多分类

    • 二分类任务通常用 Sigmoid(输出单个概率,另一类概率 = 1 - 该值);
    • 多分类任务必须用 Softmax(输出所有类别的概率分布)。
  3. “软” 最大化的含义:不同于 “硬最大化”(直接取分数最高的类别为 1,其余为 0),Softmax 会给所有类别分配非零概率,只是高分类别概率远高于其他,体现 “软” 的特性。

五、 简单 Python 实现(含数值稳定版)

收起
自动换行
深色代码主题
复制
import numpy as np

def softmax(z):
    """
    数值稳定的Softmax实现
    :param z: 原始分数数组,形状为(K,) 或 (N,K)(N个样本,K个类别)
    :return: Softmax概率数组
    """
    # 减去最大值,避免指数溢出
    z_max = np.max(z, axis=-1, keepdims=True)
    exp_z = np.exp(z - z_max)
    # 计算归一化概率
    softmax_probs = exp_z / np.sum(exp_z, axis=-1, keepdims=True)
    return softmax_probs

# 测试:单个样本(三分类)
z = np.array([2, 1, 0])
probs = softmax(z)
print("原始分数:", z)
print("Softmax概率:", probs)
print("概率和:", np.sum(probs))  # 输出1.0

# 测试:多个样本(2个样本,4个类别)
z_batch = np.array([[3, 1, 4, 2], [0.5, 2, 1, 0]])
probs_batch = softmax(z_batch)
print("\n多个样本Softmax概率:")
print(probs_batch)
print("每个样本概率和:", np.sum(probs_batch, axis=1))  # 输出[1.0, 1.0]

总结

  1. 核心作用:Softmax 是多分类任务的 “概率转换器”,将无界的原始分数转化为和为 1 的概率分布,方便模型预测和结果解释。
  2. 关键技巧:实现时必须减去分数的最大值,避免指数函数数值溢出。
  3. 常用搭配:与类别交叉熵损失组合,是多分类神经网络的标准输出层配置。
点赞
收藏
回复
分享
举报
浏览567 发布于2025-12-23 02:11上海
全部评论
最多点赞
最新发布
最早发布
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。