侧边栏壁纸
博主头像
ZHD的小窝博主等级

行动起来,活在当下

  • 累计撰写 84 篇文章
  • 累计创建 54 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

AI大模型学习之路(六)

江南的风
2025-06-09 / 0 评论 / 0 点赞 / 0 阅读 / 6551 字 / 正在检测是否收录...

阶段1:基础知识储备

第五课:概率论基础及其在模型训练中的应用


学习目标

  1. 掌握常见概率分布(高斯、伯努利)的定义与性质。
  2. 理解贝叶斯定理及其在分类任务中的应用。
  3. 学会极大似然估计(MLE)的原理与计算方法。
  4. 实战:用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()
0

评论区