Skip to content

1. 激活函数

  • 作用:给神经网络增加非线性表达能力
  • Sigmoid
    • 输出范围:(0, 1)
    • 常用于:二分类输出层
    • 缺点:容易梯度消失
  • Tanh
    • 输出范围:(-1, 1)
    • 常用于:隐藏层
    • 缺点:也可能梯度消失
  • ReLU
    • 规则:负数变 0,正数保留
    • 常用于:隐藏层
    • 优点:训练快,收敛稳
  • Softmax
    • 作用:把输出分数转成概率分布
    • 常用于:多分类输出层

2. 参数初始化

  • 作用:决定训练起点是否合理
  • weight 不能全一样,否则会有对称性问题
  • bias 一般可以初始化为 0
  • 常见初始化:
    • Xavier:适合 Sigmoid / Tanh
    • Kaiming:适合 ReLU
  • 工程结论:
    • 隐藏层用 ReLU 时优先考虑 Kaiming
    • Sigmoid/Tanh 时优先考虑 Xavier

3. 搭建基础神经网络

  • 自定义网络要继承 nn.Module
  • init():
    • 定义网络结构
    • 定义各层
    • 做参数初始化
  • forward():
    • 定义数据前向传播路径
  • 基本流程:
    • 线性层 -> 激活函数 -> 线性层 -> 激活函数 -> 输出层
  • my_model(data) 本质会调用 forward(data)

4. 损失函数

  • 作用:衡量模型错了多少
  • 分类损失:
    • CrossEntropyLoss
      • 多分类常用
      • 输入通常是 logits
      • y_true 用类别编号,类型 long
    • BCELoss
      • 二分类常用
      • 输入是概率值,通常前面先过 sigmoid
  • 回归损失:
    • MSELoss
      • 均方误差
      • 对大误差更敏感
    • L1Loss
      • 平均绝对误差
      • 对离群点更稳
    • SmoothL1Loss
      • L1 和 L2 的折中

5. 优化算法

  • 作用:根据梯度更新参数
  • 核心公式:
    • 新参数 = 旧参数 - 学习率 × 梯度
  • 训练标准流程:
    • optimizer.zero_grad()
    • loss.backward()
    • optimizer.step()
  • 常见优化器:
    • SGD:基础
    • Momentum:加惯性,减少震荡
    • Adagrad:自适应学习率,但后期可能太小
    • RMSprop:改进 Adagrad
    • Adam:最常用,实战优先试

6. 学习率衰减

  • 作用:训练前期快,后期稳
  • 为什么需要:
    • 学习率太大容易震荡
    • 学习率太小收敛太慢
  • 常见方式:
    • StepLR
      • 固定间隔衰减
    • MultiStepLR
      • 指定轮次衰减
    • ExponentialLR
      • 每轮按比例衰减
  • 核心思想:
    • 学习率通常不是固定不变的

7. 正则化

  • 作用:防止过拟合,提高泛化能力
  • Dropout
    • 训练时随机丢弃部分神经元
    • 防止模型过度依赖局部特征
  • BatchNorm
    • 稳定每层输入分布
    • 加快训练,提高稳定性
  • BatchNorm1d
    • 处理向量/文本特征
  • BatchNorm2d
    • 处理图像数据
  • BatchNorm3d
    • 处理视频/体数据

8. 整体主线

  • 激活函数:让网络有非线性能力
  • 参数初始化:决定训练起点
  • 损失函数:衡量错误
  • 优化器:更新参数
  • 学习率衰减:控制训练节奏
  • 正则化:防过拟合