1. 神经网络的基本目标

神经网络的目标,是通过训练数据学习输入 x 和输出 y 之间的映射关系。

对于一个最简单的线性模型:

y_hat = w * x + b

其中:

  • x:输入数据
  • y:真实结果
  • y_hat:模型预测结果
  • w:权重
  • b:偏置

训练神经网络,本质上就是不断调整参数 w 和 b,使预测结果 y_hat 尽可能接近真实结果 y。

因此,模型训练的目标不是直接找到唯一正确的 w 和 b,而是找到一组能够较好拟合数据、并能对新数据进行预测的参数。

对于复杂神经网络,参数可能有成千上万甚至数十亿个,但基本目标仍然相同:

寻找一组合适的参数,使模型预测误差尽可能小

2. 为什么需要激活函数

如果神经网络中的每一层都只进行线性变换,即使堆叠很多层,整个网络最终仍然等价于一个线性模型。

例如:

y = W2 * (W1 * x + b1) + b2

整理以后,仍然可以写成:

y = W * x + b

因此,仅使用线性变换,无法拟合复杂的非线性关系,例如图像中的物体形状、语音变化和自然语言语义。

激活函数的主要作用是:

为神经网络引入非线性,使网络能够学习更加复杂的数据规律。

加入激活函数后:

y = W2 * activation(W1 * x + b1) + b2

常见激活函数包括:

  • ReLU
  • Sigmoid
  • Tanh
  • Leaky ReLU
  • GELU

ReLU

ReLU(x) = max(0, x)

特点:

  • 计算简单
  • 能缓解部分梯度消失问题
  • 在卷积神经网络中应用广泛

Sigmoid

Sigmoid(x) = 1 / (1 + e^(-x))

输出范围为:

0 到 1

常用于二分类任务的输出层,表示某一类别的概率。


3. 神经网络的完整训练过程

神经网络的一次参数更新通常包括:

前向传播
→ 计算损失
→ 反向传播
→ 优化器更新参数

前向传播

前向传播是指将输入数据 x 按照网络结构,从输入层逐层传递到输出层,最终得到预测结果:

y_hat = model(x)

然后将预测结果 y_hat 与真实结果 y 进行比较,通过损失函数计算误差:

L = Loss(y_hat, y)

因此,前向传播主要完成两件事:

  1. 计算预测结果
  2. 计算预测结果与真实结果之间的损失

常见损失函数包括:

  • 均方误差 MSE:常用于回归任务
  • 交叉熵损失:常用于分类任务
  • 边界框回归损失:常用于目标检测任务

反向传播

反向传播是指从损失函数开始,按照神经网络的反方向,利用链式法则逐层计算损失函数对各个参数的梯度。

例如,对参数 w 计算:

dL / dw

它表示:

参数 w 发生微小变化时,损失函数 L 会如何变化。

需要注意:

反向传播只负责计算梯度,本身不负责修改参数。

参数更新

计算出梯度以后,优化器根据梯度更新参数。

最基本的参数更新公式为:

w_new = w_old - learning_rate * gradient

也可以写成:

w_new = w_old - learning_rate * dL/dw

其中:

  • learning_rate:学习率
  • gradient:梯度
  • 负号:表示沿梯度的反方向更新

一次“前向传播、反向传播和参数更新”称为一次训练迭代或一个训练步,并不代表整个训练已经完成。

当训练集中的所有样本都被模型完整使用一遍时,称为一个 Epoch。

完整训练通常需要重复多个 Epoch。


4. 梯度下降与优化器

梯度表示损失函数在当前位置上升最快的方向,因此负梯度方向表示损失函数在当前位置下降最快的方向。

可以把梯度下降理解成下山:

  • 参数表示人在山上的位置
  • 损失值表示当前位置的高度
  • 梯度指向最陡的上坡方向
  • 负梯度指向最陡的下坡方向
  • 学习率决定每一步走多远

需要注意,“下降最快”是指:

在当前位置附近、移动距离足够小时,负梯度方向是局部下降最快的方向。

学习率

学习率决定每次参数更新的步长。

学习率过大:

  • 参数更新幅度过大
  • 可能错过较优位置
  • 损失可能震荡甚至发散

学习率过小:

  • 参数更新速度慢
  • 训练时间较长
  • 可能停留在平坦区域

因此,训练中通常会使用学习率衰减,使训练前期更新较快,后期更新更加精细。

常见优化器

梯度下降

使用全部训练数据计算一次梯度,再更新参数。

优点是梯度稳定,缺点是计算量较大。

SGD

SGD 是随机梯度下降。

实际训练中通常不是每次只使用一个样本,而是使用一小批数据计算梯度并更新参数,这叫小批量随机梯度下降。

Adam

Adam 会根据梯度变化情况,自动调整不同参数的更新幅度。

特点是:

  • 收敛速度通常较快
  • 对学习率相对不敏感
  • 在深度学习中使用广泛
AdamW

AdamW 在 Adam 的基础上,将权重衰减单独处理。

它在 Transformer、视觉模型和大语言模型训练中使用较多。


5. 局部极小值与全局最小值

神经网络的损失函数通常是一个复杂的高维非凸函数,其中可能存在:

  • 局部极小值
  • 鞍点
  • 平坦区域
  • 多个效果相近的低损失区域

因此,梯度下降通常不能保证找到数学意义上的全局最小值。

但实际训练中,并不一定必须找到全局最小值。

更重要的是:

找到一个训练损失较低,并且在新数据上泛化能力较好的参数区域。

常见改进方法包括:

  • 使用合适的参数初始化
  • 调整学习率
  • 使用学习率衰减
  • 使用带动量的 SGD、Adam 或 AdamW
  • 使用小批量训练,引入一定随机性
  • 使用不同随机种子进行多次训练
  • 使用批归一化、层归一化和残差连接
  • 使用验证集选择泛化能力更好的模型
  • 使用早停法避免训练时间过长

需要注意:

训练损失最低的模型,不一定是实际效果最好的模型。

如果训练损失持续下降,但验证损失开始上升,通常说明模型开始过拟合。


6. 过拟合与泛化能力

过拟合是指:

模型在训练数据上表现很好,但在没有见过的新数据上表现较差。

例如,一个模型把训练数据中的噪声、偶然特征和特殊样本也记住了,因此训练准确率很高,但测试准确率很低。

神经网络并不是越大越好。

网络层数越多、参数越多,模型的表达能力通常越强,但如果数据量不足或训练方式不合理,也更容易过拟合。

泛化能力

泛化能力是指:

模型对没有见过的新数据进行正确预测的能力。

训练模型的最终目标不是单纯记住训练数据,而是学习能够适用于新数据的规律。

常见防止过拟合的方法

增加数据量

更多高质量、具有代表性的数据,可以让模型学习更加稳定的规律。

数据增强

在不改变样本类别的前提下,对原始数据进行变换,生成新的训练样本。

图像任务中常见的数据增强包括:

  • 翻转
  • 裁剪
  • 缩放
  • 旋转
  • 调整亮度和对比度
  • 添加噪声
  • Mosaic
  • MixUp

数据增强可以提高训练数据的多样性,使模型不容易记住某些固定特征。

降低模型复杂度

可以通过以下方式降低模型容量:

  • 减少网络层数
  • 减少隐藏层神经元数量
  • 减少通道数
  • 使用更小的模型结构
  • 冻结部分参数
早停法

训练过程中持续观察验证集损失。

如果验证集损失在若干轮内不再下降,甚至开始上升,就提前停止训练。

正则化

正则化是在原损失函数中加入参数惩罚项:

L_total = L_original + lambda * penalty

其中:

  • L_original:原始预测损失
  • penalty:参数惩罚项
  • lambda:正则化强度

正则化可以理解为:

不仅要求模型预测准确,还要求模型不要使用过于复杂、过于极端的参数。

参数过大并不一定代表一定过拟合,但通常会使模型对输入变化更加敏感。

例如:

y_hat = w1*x1 + w2*x2 + w3*x3

如果参数为:

w1 = 20
w2 = 1000
w3 = -35

那么某些输入只发生很小变化,输出就可能发生很大变化。

模型容易把训练数据中的噪声当成真实规律,从而增加过拟合风险。

正则化主要限制的是参数数值体现出的实际复杂度,而不是直接改变网络有多少层、多少参数。


7. L1、L2 正则化与 Dropout

L1 正则化

L1 正则化在损失函数中加入参数绝对值之和:

L_total = L_original + lambda * sum(abs(w_i))

也可以直观理解为:

L_total = L_original + lambda * (|w1| + |w2| + |w3| + ...)

L1 会持续推动参数向 0 靠近,因此更容易使一部分参数最终变成 0。

主要特点:

  • 可以得到稀疏模型
  • 可以弱化不重要的特征
  • 在一定程度上具有特征选择作用

可以理解为:

不重要的参数直接不用。

L2 正则化

L2 正则化在损失函数中加入参数平方和:

L_total = L_original + lambda * sum(w_i^2)

也可以写成:

L_total = L_original + lambda * (w1^2 + w2^2 + w3^2 + ...)

L2 对较大的参数惩罚更明显,通常会让所有参数整体变小,但不容易直接变成 0。

主要特点:

  • 限制参数过大
  • 使模型更加平滑
  • 降低模型对输入扰动的敏感度

可以理解为:

所有参数都可以参与,但不要让某个参数过于极端。

正则化系数 lambda 并不是越大越好。

如果 lambda 太小:

  • 限制作用不足
  • 模型仍然可能过拟合

如果 lambda 太大:

  • 参数被过度压缩
  • 模型无法充分学习
  • 可能导致欠拟合

Dropout

Dropout 是一种常见的防止过拟合的方法。

训练过程中,Dropout 会按照一定概率随机关闭一部分神经元,使这些神经元在当前训练步骤中暂时不参与计算。

例如:

原本参与计算:

A  B  C  D  E

某一次训练:

A  ×  C  ×  E

下一次训练时,被关闭的神经元会重新随机选择。

这样可以防止模型过度依赖某几个神经元,迫使不同神经元学习更加稳定、通用的特征。

可以将 Dropout 理解为:

训练时不允许某几个神经元长期包办所有任务,让不同神经元都具备一定独立完成任务的能力。

需要注意:

  • Dropout 通常只在训练阶段开启
  • 推理和测试阶段会关闭 Dropout
  • 推理阶段使用完整网络
  • Dropout 在全连接层中使用较多
  • 卷积网络中不一定每一层都适合使用 Dropout

8. 欠拟合与数据集划分

欠拟合

欠拟合是指:

模型学习能力不足,或者训练不充分,导致在训练集和测试集上的表现都较差。

常见原因包括:

  • 模型过于简单
  • 训练轮数不足
  • 学习率设置不合理
  • 正则化过强
  • 特征表达能力不足

过拟合和欠拟合可以简单区分为:

情况 训练集表现 测试集表现
欠拟合
正常拟合
过拟合 很好

训练集

训练集用于:

  • 前向传播
  • 计算损失
  • 反向传播
  • 更新参数

验证集

验证集用于:

  • 调整超参数
  • 选择最佳模型
  • 判断是否过拟合
  • 决定是否提前停止训练

验证集不直接参与参数更新。

测试集

测试集用于在模型训练和调参完成后,评估模型最终性能。

测试集不应该在训练和调参过程中频繁使用,否则可能会对测试集产生间接过拟合。


9. 参数与超参数

神经网络中的参数和超参数需要区分。

参数

参数是在训练过程中由模型自动学习得到的,例如:

  • 权重 w
  • 偏置 b

超参数

超参数需要在训练前人工设置,或者通过实验选择,例如:

  • 学习率
  • Batch Size
  • Epoch
  • 隐藏层数量
  • 神经元数量
  • Dropout 比例
  • 正则化系数 lambda
  • 优化器类型

简单来说:

参数是模型训练出来的,超参数是训练模型之前设置的。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐