神经网络与深度学习:改进学习方法
一、反向传播算法回顾
1.1 符号定义与矩阵运算
反向传播算法利用矩阵运算快速计算输出层的梯度,并逐层向前传播误差。定义如下核心符号:
| 符号 | 含义 |
|---|---|
| 第 层第 个神经元与第 层第 个神经元之间的权重 | |
| 第 层第 个神经元的偏置 | |
| 第 层第 个神经元的激活值 | |
| 第 层第 个神经元的加权输入: | |
| 第 层第 个神经元的误差 |
1.2 反向传播四个基本方程
BP 四个核心方程(必记)
-
BP1(输出层误差):
-
BP2(误差传播):
-
BP3(代价对偏置的梯度):
-
BP4(代价对权重的梯度):
1.3 反向传播算法步骤(随机梯度下降)
-
输入:设置输入层激活值
-
前馈:对每一层 ,计算 和
-
输出层误差:计算
-
反向传播误差:对每一层 ,计算
-
输出梯度:得到 和
1.4 反向传播的全局观
从全局视角理解反向传播:权重的变化如何影响激活值的变化,进而影响代价函数的变化。可以用"路径求和"的方式理解梯度的计算:
每一条从权重 到代价 的路径,其贡献为路径上所有偏导数的乘积。反向传播算法本质上是高效地计算这些路径求和。
二、交叉熵代价函数
2.1 MSE 的学习缓慢问题
使用均方误差(MSE)作为代价函数时,当神经元输出严重错误且饱和时,学习速度非常缓慢。
问题示例
单个神经元,期望输出 0,使用 MSE 代价函数:
-
当 时:初始输出 ,学习缓慢
-
当 时:初始输出 ,学习更加缓慢!
原因:MSE 梯度中含有 项,当神经元饱和时 ,梯度趋近于零。
2.2 交叉熵定义
为解决学习缓慢问题,引入交叉熵代价函数:
其中 为训练样本总数, 为神经元输出, 为期望输出。
2.3 交叉熵的关键性质
优势:梯度中不含
计算交叉熵对权重的偏导数:
梯度仅取决于输出误差 ,误差越大学习越快
2.4 详细推导
对单个训练样本,代价函数为:
其中 。计算偏导数:
利用 :
类似地,对偏置的偏导数为:
2.5 从期望性质反推交叉熵
如果我们希望代价函数满足以下性质:
从这个期望出发,通过积分可以推导出交叉熵的形式。由 ,对 积分得:
2.6 多神经元推广
对于输出层有多个神经元的网络,交叉熵推广为:
其中 遍历输出层所有神经元。
三、Softmax 与对数似然
3.1 Softmax 输出层
Softmax 是一种输出层激活函数,用来替代 sigmoid。它把输出层的原始值 转换成概率分布
输出范围:每个
和为 1:(天然是概率分布)
放大差异: 最大的那个类别会得到最大的概率
假设输出层有 3 个神经元(3 分类),加权输入为:
计算 softmax:
| 神经元 | (softmax 输出) | 解释 | ||
|---|---|---|---|---|
| j=1 | 2.0 | 7.389 | 7.389/11.756 = 0.629 | 最大 → 最高概率 |
| j=2 | 1.0 | 2.718 | 2.718/11.756 = 0.231 | |
| j=3 | 0.5 | 1.649 | 1.649/11.756 = 0.140 |
输出 ,和为 1
网络预测:最可能是第 1 类(概率 62.9%)
3.2 对数似然代价函数
Softmax 通常搭配对数似然代价函数(Log-likelihood cost):
其中 是正确类别的索引。当网络对正确类别预测的概率越高,代价越低。
也就是只关注"正确类别的概率"有多大
| (正确类别的概率) | ||
|---|---|---|
| 0.9 | 0.105 | 很自信且正确 → 损失小 |
| 0.5 | 0.693 | 不太确定 → 损失中等 |
| 0.1 | 2.303 | 把正确答案排很低 → 损失很大 |
| → 0 | → ∞ | 完全错误 → 惩罚趋于无穷 |
3.3 梯度推导
Softmax + 对数似然的梯度同样具有简洁的形式:
与交叉熵相同的优势都是梯度同样不含 ,由误差 驱动,避免学习缓慢。
3.4 交叉熵 vs Softmax+对数似然 对比
Sigmoid + 交叉熵
-
输出层使用 Sigmoid
-
代价函数:
-
适合二分类或多标签任务
-
各输出独立
Softmax + 对数似然
-
输出层使用 Softmax
-
代价函数:
-
适合多分类(互斥)任务
-
各输出竞争(和为 1)
四、过拟合问题
4.1 过拟合现象
当模型参数远多于训练数据时,网络会记住训练数据的噪声而非学习通用规律。
实验示例
使用 30 个隐藏神经元的网络(共 23860 个参数),仅用 1000 张图片训练:
-
训练准确率持续上升(接近 100%)
-
测试准确率很快达到平台期并停止提升
-
训练代价持续下降,但测试代价开始上升
4.2 检测过拟合
-
跟踪测试集(或验证集)上的准确率
-
当测试准确率不再提升时,停止训练(早停法 Early Stopping)
-
观察训练代价与测试代价的差距是否持续增大
4.3 最直接的解决方案:增加训练数据
将训练数据从 1000 张增加到 50000 张后,过拟合现象大幅缓解,测试准确率显著提升。
更多的数据几乎总是比更复杂的模型更有效。但获取更多数据并非总是可行,因此需要正则化等技术。
五、正则化方法
当网络参数太多、训练数据太少时,网络会过拟合—— 在训练集上表现很好,但在新数据上很差(相当于 "死记硬背" 而不是 "学会规律")。
正则化的核心思想是给代价函数加一个 "惩罚项",让网络倾向于用更小、更简单的权重,从而避免过拟合。
5.1 L1 正则化
L1 正则化使用权重的绝对值之和作为惩罚项:
其中 为原始代价函数, 为正则化参数,求和遍历网络中所有权重。
权重更新规则
sgn 是符号函数(Sign Function)
5.2 L2 正则化(权重衰减)
在原始代价函数基础上添加权重惩罚项:
其中 为原始代价函数, 为正则化参数,求和遍历网络中所有权重。
权重更新规则
| 参数 | 更新规则 |
|---|---|
| 权重 | |
| 偏置 | (偏置不正则化) |
λ 越大,权重被压得越小,网络越简单。太小则正则化没效果(过拟合),太大则网络能力被压垮(欠拟合)。需要通过验证集调参找到最优的 λ。
| 特性 | L1 正则化 | L2 正则化 |
|---|---|---|
| 惩罚项 | ||
| 梯度贡献 | (常数大小) | (与 w 成正比) |
| 权重缩减方式 | 等量缩减(固定步长) | 等比缩减(按比例衰减) |
| 结果特征 | 产生稀疏权重(许多权重为 0) | 权重普遍较小但不为 0 |
| 适用场景 | 特征选择 | 防止过拟合(通用) |
5.3 Dropout
训练时,每次前向传播随机 "关掉" 一部分隐藏层神经元,让它们的输出变为 0。被关掉的神经元这一轮不参与计算,也不更新权重。强迫网络中的每个神经元都独立学到有用的特征,而不是依赖特定的搭配。效果相当于同时训练了大量不同的子网络,最终取平均,显著减轻过拟合
-
训练时,以概率 随机将隐藏层神经元的输出置零
-
输入层和输出层保持不变
-
测试时,使用所有神经元但将权重乘以 进行缩放
Dropout 的直觉理解
-
相当于训练了指数级数量的"瘦"网络的集成(Ensemble)
-
每个神经元不能依赖于特定其他神经元的存在,必须学习更鲁棒的特征
-
减少神经元之间的"共适应"(co-adaptation)
六、数据增强
通过对已有训练数据进行变换来扩充数据集,是对抗过拟合的有效手段。
6.1 常用增强方法
| 方法 | 描述 |
|---|---|
| 平移(Translation) | 将图像在水平或垂直方向偏移若干像素 |
| 旋转(Rotation) | 将图像按一定角度旋转(如 ) |
| 镜像翻转(Flip) | 水平或垂直翻转图像 |
| 弹性形变(Elastic Deformation) | 对图像施加随机弹性变换,模拟手写变体 |
6.2 效果
数据增强能有效增加训练数据的多样性,提升模型的泛化能力。实验表明,使用弹性形变增强后的手写数字识别准确率显著提升。
关键原则:增强变换应模拟真实世界中可能出现的数据变体,同时保持标签不变。
七、权重初始化
创建网络后,在开始训练之前需要给权重和偏置设定初始值。初始化方式直接影响训练能否顺利开始以及收敛速度。
7.1 标准初始化的问题
使用标准正态分布 初始化所有权重时:
-
加权输入 的标准差为 ( 为输入连接数)
-
当 较大时,∣ z∣ 很大时,σ(z) 接近 0 或 1(饱和)
-
饱和导致 ,学习极其缓慢
7.2 改进的初始化方法
改进方案:使用 初始化权重
此时 的标准差约为 (假设偏置用 ),神经元不再轻易饱和。
标准初始化
-
初始时大量神经元饱和
-
学习起步极慢
-
需要更多 epoch 才能收敛
改进初始化
-
初始时神经元处于非饱和区
-
学习从一开始就很快
-
更快收敛到更好的结果
八、数据预处理
良好的数据预处理可以显著加速训练并提升模型性能。
8.1 均值减法(Mean Subtraction)
将每个特征减去其在训练集上的均值,使数据以零为中心。
8.2 均一化(Normalization)
进一步除以标准差,使每个特征的方差为 1。预处理后数据满足:均值为 0,方差为 1。
8.3 ZCA 白化(Whitening)
白化将数据去相关化,使协方差矩阵变为单位矩阵:
ZCA 白化的变换矩阵为:
其中 为数据的协方差矩阵。
| 预处理方法 | 效果 | 适用场景 |
|---|---|---|
| 均值减法 | 中心化(均值=0) | 几乎所有情况 |
| 均一化 | 中心化 + 等方差 | 特征尺度差异大时 |
| ZCA 白化 | 去相关 + 等方差 | 特征间相关性强时 |
九、其他优化算法
9.1 Hessian 方法(二阶优化)
利用代价函数的二阶泰勒展开来优化:
其中 为 Hessian 矩阵(二阶偏导矩阵),
令梯度为零,求得最优步长:
Hessian 方法的优缺点
-
优点:收敛速度快,不需要手动调节学习率
-
缺点:Hessian 矩阵计算和存储成本极高( 存储, 求逆),实际中常用近似方法
9.2 动量梯度下降(Momentum)
引入"速度"变量 ,模拟物理中的动量效应:
其中 为动量系数(通常取 0.9), 为学习率
| 特性 | 标准梯度下降 | 动量梯度下降 |
|---|---|---|
| 更新规则 | , | |
| 梯度噪声 | 容易震荡 | 平滑梯度方向 |
| 平坦区域 | 缓慢通过 | 积累速度快速通过 |
| 收敛速度 | 较慢 | 更快 |
十、其他激活函数
10.1 tanh 激活函数
定义:
与 Sigmoid 的关系:
| 特性 | Sigmoid | tanh(z) |
|---|---|---|
| 输出范围 | ||
| 零中心 | 否(输出总为正) | 是(零中心输出) |
| 饱和问题 | 存在 | 存在(但零中心有助于训练) |
| 典型应用 | 输出层(二分类概率) | 隐藏层 |
10.2 ReLU 激活函数
定义:
ReLU 的优势
-
无饱和问题(正区间梯度恒为 1)
-
计算高效(仅需比较和取零操作)
-
稀疏激活(负输入直接输出零,天然正则化效果)
-
收敛速度通常比 Sigmoid/tanh 快 6 倍
ReLU 的潜在问题:Dead ReLU
当某个神经元的输入始终为负时,该神经元永远输出 0,梯度也为 0,永远无法恢复。解决方案:使用 Leaky ReLU 或适当的学习率。
10.3 激活函数总览
| 函数 | 公式 | 范围 | 零中心 | 主要问题 |
|---|---|---|---|---|
| Sigmoid | (0,1) | 否 | 饱和、非零中心 | |
| tanh | (-1,1) | 是 | 饱和 | |
| ReLU | [0,+∞) | 否 | Dead ReLU |
总结
-
交叉熵:,梯度:
-
Softmax:,对数似然:
-
L2 正则化:,更新:
-
L1 正则化:,更新:
-
改进初始化:
-
动量:,
分享到社交平台
将本文分享给你的朋友们
Zhongye