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
- CrossEntropyLoss
- 回归损失:
- MSELoss
- 均方误差
- 对大误差更敏感
- L1Loss
- 平均绝对误差
- 对离群点更稳
- SmoothL1Loss
- L1 和 L2 的折中
- MSELoss
5. 优化算法
- 作用:根据梯度更新参数
- 核心公式:
- 新参数 = 旧参数 - 学习率 × 梯度
- 训练标准流程:
- optimizer.zero_grad()
- loss.backward()
- optimizer.step()
- 常见优化器:
- SGD:基础
- Momentum:加惯性,减少震荡
- Adagrad:自适应学习率,但后期可能太小
- RMSprop:改进 Adagrad
- Adam:最常用,实战优先试
6. 学习率衰减
- 作用:训练前期快,后期稳
- 为什么需要:
- 学习率太大容易震荡
- 学习率太小收敛太慢
- 常见方式:
- StepLR
- 固定间隔衰减
- MultiStepLR
- 指定轮次衰减
- ExponentialLR
- 每轮按比例衰减
- StepLR
- 核心思想:
- 学习率通常不是固定不变的
7. 正则化
- 作用:防止过拟合,提高泛化能力
- Dropout
- 训练时随机丢弃部分神经元
- 防止模型过度依赖局部特征
- BatchNorm
- 稳定每层输入分布
- 加快训练,提高稳定性
- BatchNorm1d
- 处理向量/文本特征
- BatchNorm2d
- 处理图像数据
- BatchNorm3d
- 处理视频/体数据
8. 整体主线
- 激活函数:让网络有非线性能力
- 参数初始化:决定训练起点
- 损失函数:衡量错误
- 优化器:更新参数
- 学习率衰减:控制训练节奏
- 正则化:防过拟合