1. 正向传播(Forward Pass)
-
输入:样本特征 xxx
-
线性组合:计算
-
激活函数:
- 二分类:
- 多分类:
-
输出:y_haty 是概率向量,表示每个类别的预测概率
2. 损失计算(Loss Calculation)
-
标签处理:将整数标签 yyy 转成 one-hot 向量(多分类场景)
-
损失函数:如交叉熵
loss(y_hat, y_onehot) -
作用:衡量预测概率与真实标签之间的差距
-
注意:
- 二分类时使用
BCEWithLogitsLoss,不一定需要 one-hot,直接用[0,1]标签即可
- 二分类时使用
3. 反向传播(Backpropagation / Gradient Descent)
- 求梯度:对损失函数分别对权重 w 和偏置 b 求偏导
- 更新权重:沿梯度下降方向更新参数
- 重复训练:遍历训练数据,逐步减小损失
4. 收敛与目标权重
- 收敛:当训练损失不再明显下降时,模型权重达到局部最优
- 权重关系:对于合成数据,训练得到的权重会逼近或等比例逼近隐藏权重 0.5 和 -1.5
- 分类效果:分类准确率会很高
5. 小优化理解
| 概念 | 作用 |
|---|---|
| 激活函数 | 把线性输出映射到概率 |
| one-hot | 标签向量化,与概率输出对齐 |
| 损失函数 | 衡量预测与真实差距 |
| 梯度下降 | 调整权重逼近目标 |
6. PyTorch示例代码
import torch
from torch import nn, optim
from torch.nn import functional as F
n_item, n_feature = 1000, 2 # 定义数据规模:1000 个样本,每个样本有 2 个特征(例如 x1、x2)
learning_rate = 0.001 # 学习率,指每次更新参数时的步长
epochs = 50 # 训练轮数,指整个数据集会被遍历优化50次
# 数据
torch.manual_seed(123) # 设置随机种子为123,确保实验可复现
data_x = torch.randn(size=(n_item, n_feature)).float()
# 生成n_item行、n_feature列的随机数据,数据服从标准正态分布N(0,1)
data_y = torch.where(data_x[:, 0]*0.5 - data_x[:, 1]*1.5 + 0.02 > 0, 1, 0).long()
# 生成二分类标签(0或1)
# 决策边界为: 0.5*x1 - 1.5*x2 + 0.02 > 0
# torch.where(condition, x, y): True时返回x,否则返回y
# .long()将布尔结果转换为整数(0或1)
# .view(-1, 1)将一维张量转换为二维张量,形状为(n_item, 1)
# 可选 data_y=F.one_hot(data_y)
# 标签向量化:将离散的类别标签转换为向量形式,与神经网络的输出层格式完全对齐便于计算损失