Skip to content

知识点卡片:概率分布

基本信息

属性内容
知识点概率分布(离散/连续)
掌握程度★★★★☆
学习优先级P0
预估时间10小时
面试频率★★★★☆

核心原理

深度学习中,概率分布用于:

  • 建模输出:分类任务使用概率分布
  • 损失函数:交叉熵/负对数似然
  • 正则化:Dropout作为贝叶斯近似
  • 生成模型:VAE/Diffusion/GAN

离散分布

1. 伯努利分布 (Bernoulli)

python
# 抛一次硬币,p为正面概率
P(X=1) = p, P(X=0) = 1-p

# 期望:E[X] = p
# 方差:Var[X] = p(1-p)

在DL中的应用:二分类问题的建模基础

python
# Sigmoid = 伯努利分布的概率函数
def sigmoid(x):
    p = 1 / (1 + np.exp(-x))
    # 解释:输入x的logit转换为p(正面)概率
    return p

2. 多项分布 (Multinomial) / Categorical

python
# K个类别的分布
P(X=k) = p_k, 其中 Σp_k = 1

# 期望:E[X_k] = p_k
# One-hot编码表示

在DL中的应用:多分类问题的建模基础

python
# Softmax = 多项分布的概率函数
def softmax(logits):
    exp_logits = np.exp(logits - np.max(logits))  # 数值稳定
    return exp_logits / np.sum(exp_logits)

3. 泊松分布 (Poisson)

python
# 稀有事件的计数
P(X=k) = λ^k * e^(-λ) / k!

# 期望:E[X] = λ
# 方差:Var[X] = λ

在DL中的应用:count-based模型的稀疏性问题


连续分布

1. 高斯分布 (Gaussian/Normal)

python
# 概率密度
p(x) = (1/√(2πσ²)) * exp(-(x-μ)² / 2σ²)

# 期望:E[X] = μ
# 方差:Var[X] = σ²

在DL中的应用

  • 权重初始化(Xavier/He初始化假设高斯)
  • 回归任务的噪声假设
  • Layer Norm / Batch Norm 的统计量
  • VAE的隐变量先验
python
import torch
import torch.distributions as dist

# 定义高斯分布
mu = torch.zeros(10)
sigma = torch.ones(10)
p_x = dist.Normal(mu, sigma)

# 采样
x = p_x.sample()           # shape: (10,)
log_prob = p_x.log_prob(x) # 对数概率

2. Laplace分布

python
# 概率密度
p(x) = (1/2b) * exp(-|x-μ|/b)

# 期望:E[X] = μ
# 方差:Var[X] = 2b²

在DL中的应用:L1损失的统计动机(比L2对异常值更鲁棒)


3. Beta分布

python
# 概率密度(定义在[0,1]区间)
p(x) = x^-1) * (1-x)^-1) / B(α, β)

# 期望:E[X] = α / (α + β)

在DL中的应用:变分推断中用于建模概率


分布间的转换关系

┌─────────────────────────────────────────────────────────────┐
│                    分布转换关系图                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Bernoulli ──────→ Binomial ──────→ Multinomial            │
│     ↓                ↓                 ↓                     │
│     ↓                ↓                 ↓                     │
│  Categorical ←──────────────────────────                     │
│                                                             │
│  高斯 + 线性变换 ──→ 仍是高斯(线性变换封闭性)                │
│                                                             │
│  Bernoulli + Sigmoid = Logistic函数                         │
│  Categorical + Softmax = Multinomial概率                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

深度学习中的概率解释

1. 分类问题的概率模型

python
# 逻辑回归 = 伯努利分布的最大似然估计
# 输入x,输出p(y=1|x)

# 线性模型
logits = x @ W + b

# Sigmoid转换为概率
p = sigmoid(logits)  # P(y=1|x)

# Loss = -log P(y|x) = Binary Cross Entropy
loss = -y * log(p) - (1-y) * log(1-p)

2. 多分类问题的概率模型

python
# Softmax回归 = 多项分布的MLE
# 输入x,输出p(y=k|x)

# 线性模型
logits = x @ W + b  # shape: (batch, num_classes)

# Softmax转换为概率
probs = softmax(logits)  # P(y=k|x)

# Loss = -log P(y|x) = Cross Entropy
loss = -sum(y_true * log(y_pred))

3. 从概率角度理解MSE

python
# 回归问题假设:y = f(x) + ε, ε ~ N(0, σ²)
# 则最小化MSE等价于最大化高斯对数似然

# MSE Loss
mse = (y_pred - y_true) ** 2

# 高斯负对数似然
nll = 0.5 * (y_pred - y_true) ** 2 / sigma**2 + const

# 因此:最小化MSE ↔ MLE(假设高斯噪声)

面试高频问题

Q1: 为什么分类问题用Cross Entropy而不是MSE?

  1. 概率解释:CE是分类的自然损失(负对数似然),MSE不是
  2. 梯度特性:CE的梯度是pred - label,恒定且有意义;MSE梯度是pred * (1-pred) * (pred - label),在pred接近0/1时梯度消失
  3. 收敛速度:CE收敛更快,MSE容易陷入饱和
python
# 梯度对比
# CE梯度:∂L/∂pred = pred - label(恒定)
# MSE梯度:∂L/∂pred = 2 * pred * (1-pred) * (pred - label)
# 当pred→0或pred→1时,MSE梯度→0,导致梯度消失

Q2: Sigmoid和Softmax的区别?

  • Sigmoid:用于二分类,输出伯努利分布参数,不要求输出和为1
  • Softmax:用于多分类,输出多项分布参数,要求输出和为1
  • 关系:二分类时,softmax = sigmoid(数学上等价)
python
# 二分类用Sigmoid
p1 = sigmoid(logit)  # P(y=1)
p0 = 1 - p1           # P(y=0)

# 等价于Softmax
import torch.nn.functional as F
p = F.softmax(torch.stack([logit_0, logit_1], dim=-1), dim=-1)
p0, p1 = p[..., 0], p[..., 1]

Q3: 高斯分布为什么重要?

  1. 中心极限定理:大量独立随机变量的和趋近高斯
  2. 数学性质好:线性变换封闭,对共轭先验友好
  3. 最大熵:在给定均值和方差时,高斯是熵最大的分布
  4. 计算方便:只需要均值和方差两个参数

代码练习

python
import numpy as np
import torch
from scipy import stats

# 1. 验证Sigmoid和Softmax的关系
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 二分类Softmax
def softmax_2class(x):
    exp_x = np.exp(x - np.max(x))  # 数值稳定
    return exp_x / exp_x.sum()

# sigmoid(3) ≈ softmax([0, 3])[1]
print(sigmoid(3))  # 0.9526
print(softmax_2class([0, 3]))  # [0.0474, 0.9526]

# 2. 高斯分布的KL散度
def kl_gaussian(mu1, sigma1, mu2, sigma2):
    """KL(N1 || N2)"""
    return np.log(sigma2/sigma1) + (sigma1**2 + (mu1-mu2)**2)/(2*sigma2**2) - 0.5

# KL(N(0,1) || N(0,1)) = 0
print(kl_gaussian(0, 1, 0, 1))  # 0.0

# 3. 从伯努利推导Sigmoid
# P(y=1|x) = 1 / (1 + exp(-(w·x + b)))
# 这就是逻辑回归的核心公式

分布对比速查表

分布类型支撑参数DL应用
Bernoulli离散p二分类
Categorical离散p₁...pₖ多分类
Binomial离散n,pn次二分类
Multinomial离散{0,...,n}^Kn,p₁...pₖ多分类
Poisson离散λcount数据
Gaussian连续(-∞,∞)μ,σ²回归/初始化
Laplace连续(-∞,∞)μ,bL1损失
Beta连续[0,1]α,β变分推断
Dirichlet连续Σxᵢ=1α₁...αₖ多分类先验

相关知识点