阶段1:基础知识储备
第五课:概率论基础及其在模型训练中的应用
学习目标
- 掌握常见概率分布(高斯、伯努利)的定义与性质。
- 理解贝叶斯定理及其在分类任务中的应用。
- 学会极大似然估计(MLE)的原理与计算方法。
- 实战:用MLE求解线性回归参数,对比梯度下降结果。
1. 概率分布
(1) 高斯分布(正态分布)
- 定义:
\mathcal{N}(x|\mu, \sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(x-\mu)^2}{2\sigma^2}}
- 性质:
- 均值 \mu 控制中心位置,方差 \sigma^2 控制数据分散程度。
- 68-95-99.7规则:数据分布在 \mu \pm \sigma、\mu \pm 2\sigma、\mu \pm 3\sigma 内的概率分别为68%、95%、99.7%。
(2) 伯努利分布
- 定义:二值随机变量(如硬币正反面)的分布。
P(x|\theta) = \theta^x (1-\theta)^{1-x}, \quad x \in \{0,1\}
- 应用:逻辑回归的输出层建模。
2. 贝叶斯定理
(1) 公式
P(A|B) = \frac{P(B|A)P(A)}{P(B)}
- 核心思想:利用先验概率 P(A) 和似然 P(B|A) 更新后验概率 P(A|B)。
(2) 实例:垃圾邮件分类
- 问题:判断邮件是否垃圾邮件(A=1 为垃圾邮件,A=0 为非垃圾邮件)。
- 已知:
- 先验概率 P(A=1) = 0.2(历史数据中垃圾邮件占比20%)。
- 似然 P(\text{"折扣"}|A=1) = 0.5,P(\text{"折扣"}|A=0) = 0.05。
- 计算:
P(A=1|\text{"折扣"}) = \frac{0.5 \times 0.2}{0.5 \times 0.2 + 0.05 \times 0.8} \approx 0.714
3. 极大似然估计(MLE)
(1) 原理
- 核心思想:选择使观测数据出现概率最大的参数值。
\hat{\theta}_{\text{MLE}} = \arg\max_{\theta} P(\mathcal{D}|\theta)
- 对数似然:将连乘转换为求和,避免数值下溢。
\log P(\mathcal{D}|\theta) = \sum_{i=1}^n \log P(x_i|\theta)
(2) 高斯分布的MLE解
- 数据:X = \{x_1, x_2, ..., x_n\}。
- 参数估计:
\hat{\mu} = \frac{1}{n}\sum_{i=1}^n x_i, \quad \hat{\sigma}^2 = \frac{1}{n}\sum_{i=1}^n (x_i - \hat{\mu})^2
4. 实战:用MLE求解线性回归
(1) 问题定义
- 模型:y = wx + b + \epsilon,其中 \epsilon \sim \mathcal{N}(0, \sigma^2)。
- 目标:用MLE估计 w 和 b。
(2) 推导
- 对数似然函数:
\log P(\mathcal{D}|w, b) = -\frac{n}{2}\log(2\pi\sigma^2) - \frac{1}{2\sigma^2}\sum_{i=1}^n (y_i - (wx_i + b))^2
- 结论:最大化对数似然等价于最小化均方误差(MSE)。
(3) Python实现
import torch
import numpy as np
import matplotlib.pyplot as plt
# 生成线性数据
np.random.seed(42)
X = np.linspace(-3, 3, 100)
y = 2 * X + 1 + np.random.randn(100) * 0.5
X_tensor = torch.tensor(X, dtype=torch.float32).view(-1, 1)
y_tensor = torch.tensor(y, dtype=torch.float32).view(-1, 1)
# 方法1:解析解(MLE闭式解)
X_matrix = torch.cat([X_tensor, torch.ones_like(X_tensor)], dim=1)
w_analytic = torch.linalg.inv(X_matrix.T @ X_matrix) @ X_matrix.T @ y_tensor
print(f"解析解:w = {w_analytic[0].item():.3f}, b = {w_analytic[1].item():.3f}")
# 方法2:梯度下降(与MLE等价)
model = torch.nn.Linear(1, 1)
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
for epoch in range(1000):
outputs = model(X_tensor)
loss = criterion(outputs, y_tensor)
optimizer.zero_grad()
loss.backward()
optimizer.step()
w_gd = model.weight.data.item()
b_gd = model.bias.data.item()
print(f"梯度下降解:w = {w_gd:.3f}, b = {b_gd:.3f}")
# 可视化
plt.scatter(X, y, label='Data')
plt.plot(X, w_analytic[0].item() * X + w_analytic[1].item(),
color='red', label='MLE Analytic')
plt.plot(X, w_gd * X + b_gd, '--', color='green', label='MLE Gradient Descent')
plt.legend()
plt.show()
评论区