逻辑回归训练流程详解与PyTorch实现

79 阅读2分钟

1. 正向传播(Forward Pass)

  • 输入:样本特征 xxx

  • 线性组合:计算 z=wx+bz=w⋅x+b

  • 激活函数

    • 二分类:yhat=sigmoid(z)y hat=sigmoid(z)
    • 多分类:yhat=softmax(z)y hat=softmax(z)
  • 输出: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)
# 标签向量化:将离散的类别标签转换为向量形式,与神经网络的输出层格式完全对齐便于计算损失