深度学习1——神经网络基础
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)
因此,前向传播主要完成两件事:
- 计算预测结果
- 计算预测结果与真实结果之间的损失
常见损失函数包括:
- 均方误差 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
- 优化器类型
简单来说:
参数是模型训练出来的,超参数是训练模型之前设置的。
更多推荐




所有评论(0)