合作咨询
我们的专家服务团队将竭诚为您提供专业的合作咨询服务
Softmax(软最大化函数)是机器学习 / 深度学习中核心的激活函数之一,主要用于多分类任务的输出层,能将神经网络输出的原始分数(Logits)转化为归一化的概率分布,让每个类别对应一个 0 到 1 之间的概率值,且所有类别概率之和为 1。
假设神经网络输出层有 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}}\)
假设输出层 3 个神经元的原始分数为:\(z_1=2, z_2=1, z_3=0\),计算 Softmax 概率:
可以看到:原始分数最高的\(z_1\)对应最高概率,且三者之和为 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)}}\)(数学上等价于原公式,但能避免指数溢出)。
二分类 vs 多分类:
“软” 最大化的含义:不同于 “硬最大化”(直接取分数最高的类别为 1,其余为 0),Softmax 会给所有类别分配非零概率,只是高分类别概率远高于其他,体现 “软” 的特性。
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]
我要发帖子