Softmax 函数
把任意实数变成概率分布 — 深度学习的"翻译官"
- Softmax 将任意实数向量转换为概率分布(所有值为正且和为 1)
- 指数函数的两个作用:保证输出为正 + 放大数值差异
- Temperature 参数控制分布的"锐度":T 小→接近 one-hot,T 大→接近均匀
- LeakyReLU 解决了 ReLU 的"神经元死亡"问题
Softmax 是什么?
假设你有一个神经网络,它输出了三个数字:[2.0, 1.0, 0.1]。
这些数字叫 logits(原始分数),但它们不是概率。
问题:怎么把这些数字变成概率?要求是:每个数在 0~1 之间,且加起来等于 1。
答案:Softmax!它的公式非常简单:
每个数的指数 ÷ 所有数的指数之和
📊 Excel 手推:一步一步算
像在 Excel 里一样,我们把每一步都写成表格。假设输入是 z = [2.0, 1.0, 0.1]
步骤 1:写出输入
| A z₁ |
B z₂ |
C z₃ |
|
|---|---|---|---|
| 输入 z | 2.0 | 1.0 | 0.1 |
💡 这是神经网络最后一层的输出,代表对三个类别的"打分"。点击单元格可编辑输入值!
步骤 2:计算指数 ez
| A z₁ |
B z₂ |
C z₃ |
D: ez₁ | E: ez₂ | F: ez₃ | |
|---|---|---|---|---|---|---|
| 输入 z | 2.0 | 1.0 | 0.1 | 7.389 | 2.718 | 1.105 |
| 公式 | =EXP(A2) | =EXP(B2) | =EXP(C2) |
💡 e ≈ 2.718,指数函数会放大差异 — 大的数变得更大,小的数相对更小
步骤 3:求指数之和
| D: ez₁ | E: ez₂ | F: ez₃ | G: ∑ | |
|---|---|---|---|---|
| 指数值 | 7.389 | 2.718 | 1.105 | 11.213 |
| 公式 | =SUM(D2:F2) |
步骤 4:除以总和,得到概率
| D: ez₁ | E: ez₂ | F: ez₃ | G: ∑ | H: P₁ | I: P₂ | J: P₃ | |
|---|---|---|---|---|---|---|---|
| 值 | 7.389 | 2.718 | 1.105 | 11.213 | 0.659 | 0.242 | 0.099 |
| 公式 | =D2/G2 | =E2/G2 | =F2/G2 |
✅ 验证:0.659 + 0.242 + 0.099 = 1.000 ✓ 概率之和为 1!
🎮 互动实验:拖动滑块试试
改变输入值,观察 Softmax 输出如何变化
💡 观察:
- • 输入差距越大 → 输出概率越极端(接近 0 或 1)
- • 输入相近 → 输出概率越均匀
- • 所有输入等比例缩放 → 输出不变
🌍 Softmax 在哪里用?
图像分类
"这张图是猫(90%)还是狗(10%)?"
文本分类
"这条评论是正面(85%)还是负面(15%)?"
语言模型
"下一个词最可能是'猫'(5%)还是'狗'(3%)?"
强化学习
"下一步该往左(60%)还是往右(40%)?"
⚡ LeakyReLU:ReLU 的改进版
ReLU 会把所有负值"杀死"变成 0,这可能导致神经元永久失活。LeakyReLU 允许负值有一个很小的斜率,避免这个问题。
ReLU
负值全部变为 0 — 梯度为 0,神经元可能"死亡"
LeakyReLU
负值保留一个很小的斜率 α(通常 0.01),避免神经元死亡
通常 α = 0.01,即负值只保留 1% 的斜率
📊 Excel 对比:ReLU vs LeakyReLU
点击输入值可以编辑,观察 ReLU 和 LeakyReLU 的区别
| A 输入 x₁ |
B 输入 x₂ |
C 输入 x₃ |
D 输入 x₄ |
E 输入 x₅ |
|
|---|---|---|---|---|---|
| 输入 x | -2 | -1 | 0 | 1 | 2 |
| ReLU: max(0,x) | 0 | 0 | 0 | 1 | 2 |
| LeakyReLU (α=0.01) | -0.02 | -0.01 | 0 | 1 | 2 |
✅ 关键区别:负值输入时,ReLU 输出 0(梯度消失),而 LeakyReLU 输出一个很小的负值(梯度仍可传播),从而避免"死亡 ReLU"问题。
🌡️ Temperature:控制 Softmax 的"锐度"
Temperature 是一个参数,用来调节 Softmax 输出概率分布的"尖锐"或"平坦"程度。公式变为 softmax(z / T)。
T → 0
输出变成 one-hot(argmax),最确定
T = 1
标准 Softmax,不做任何调整
T → ∞
输出变成均匀分布 (1/n),最不确定
🎮 互动实验:拖动 Temperature 滑块
默认 logits: [2.0, 1.0, 0.1],观察 Temperature 如何改变概率分布
💡 观察:
- • T 越小 → 分布越尖锐(最大值接近 1)
- • T = 1 → 标准 Softmax
- • T 越大 → 分布越平坦(接近均匀 1/3)
💻 代码实现
import numpy as np
def softmax(z):
"""和 Excel 里一模一样的逻辑"""
# 步骤 1: 计算指数 (Excel 的 EXP 列)
exp_z = np.exp(z)
# 步骤 2: 求和 (Excel 的 SUM)
sum_exp = np.sum(exp_z)
# 步骤 3: 每个除以总和 (Excel 的 D/G)
return exp_z / sum_exp
# 测试:和 Excel 算出来的一样!
z = np.array([2.0, 1.0, 0.1])
print(softmax(z))
# 输出: [0.659 0.242 0.099] ✓
- Loss & 反向传播 — 了解交叉熵损失如何与 Softmax 配合
- MLP 多层感知机 — Softmax 通常作为 MLP 的输出层
- Transformer — Transformer 的注意力权重也用 Softmax 归一化
🧠 小测验
1. Softmax 的输出有什么特点?
2. 为什么要用指数函数 e^z 而不是直接用 z?
3. 输入从 [2, 1, 0.1] 变为 [4, 2, 0.2](全部×2),Softmax 输出会怎样?
4. LeakyReLU 相比 ReLU 的优势是什么?
5. Temperature 参数的作用是什么?