STAGE 1 基础入门

Softmax 函数

把任意实数变成概率分布 — 深度学习的"翻译官"

📊 Excel 手推 ⏱️ 15 分钟 🎯 分类基础
1
📋 本章要点
  • Softmax 将任意实数向量转换为概率分布(所有值为正且和为 1)
  • 指数函数的两个作用:保证输出为正 + 放大数值差异
  • Temperature 参数控制分布的"锐度":T 小→接近 one-hot,T 大→接近均匀
  • LeakyReLU 解决了 ReLU 的"神经元死亡"问题

Softmax 是什么?

假设你有一个神经网络,它输出了三个数字:[2.0, 1.0, 0.1]。 这些数字叫 logits(原始分数),但它们不是概率。

问题:怎么把这些数字变成概率?要求是:每个数在 0~1 之间,且加起来等于 1。

答案:Softmax!它的公式非常简单:

softmax(zi) = ezi / ∑ ezj

每个数的指数 ÷ 所有数的指数之和

2

📊 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!

3

🎮 互动实验:拖动滑块试试

改变输入值,观察 Softmax 输出如何变化

2.0
1.0
0.1

💡 观察:

  • • 输入差距越大 → 输出概率越极端(接近 0 或 1)
  • • 输入相近 → 输出概率越均匀
  • • 所有输入等比例缩放 → 输出不变
P(A)
0.659
P(B)
0.242
P(C)
0.099
4

🌍 Softmax 在哪里用?

🖼️

图像分类

"这张图是猫(90%)还是狗(10%)?"

📝

文本分类

"这条评论是正面(85%)还是负面(15%)?"

🤖

语言模型

"下一个词最可能是'猫'(5%)还是'狗'(3%)?"

🎮

强化学习

"下一步该往左(60%)还是往右(40%)?"

5

⚡ LeakyReLU:ReLU 的改进版

ReLU 会把所有负值"杀死"变成 0,这可能导致神经元永久失活。LeakyReLU 允许负值有一个很小的斜率,避免这个问题。

ReLU

max(0, x)

负值全部变为 0 — 梯度为 0,神经元可能"死亡"

LeakyReLU

x > 0 ? x : α·x

负值保留一个很小的斜率 α(通常 0.01),避免神经元死亡

LeakyReLU(x) = x  if x > 0,   α·x  otherwise

通常 α = 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"问题。

6

🌡️ Temperature:控制 Softmax 的"锐度"

Temperature 是一个参数,用来调节 Softmax 输出概率分布的"尖锐"或"平坦"程度。公式变为 softmax(z / T)

softmax(zi / T) = ezi/T / ∑ ezj/T
❄️

T → 0

输出变成 one-hot(argmax),最确定

⚖️

T = 1

标准 Softmax,不做任何调整

🔥

T → ∞

输出变成均匀分布 (1/n),最不确定

🎮 互动实验:拖动 Temperature 滑块

默认 logits: [2.0, 1.0, 0.1],观察 Temperature 如何改变概率分布

1.0

💡 观察:

  • • T 越小 → 分布越尖锐(最大值接近 1)
  • • T = 1 → 标准 Softmax
  • • T 越大 → 分布越平坦(接近均匀 1/3)
P(A)
0.659
P(B)
0.242
P(C)
0.099
7

💻 代码实现

softmax.py
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] ✓
🔗 相关章节推荐
8

🧠 小测验

1. Softmax 的输出有什么特点?

2. 为什么要用指数函数 e^z 而不是直接用 z?

3. 输入从 [2, 1, 0.1] 变为 [4, 2, 0.2](全部×2),Softmax 输出会怎样?

4. LeakyReLU 相比 ReLU 的优势是什么?

5. Temperature 参数的作用是什么?