JavaScript is required

神经网络与深度学习:改进学习方法

本文聚焦于"如何改进神经网络的学习",涵盖以下核心主题:交叉熵代价函数、Softmax与对数似然、过拟合与正则化(L1/L2/Dropout)、数据增强、权重初始化、数据预处理、优化算法(Hessian/动量)、以及其他激活函数(tanh/ReLU)。掌握这些技术能显著提升网络的训练速度与泛化能力。

笔记#算法

一、反向传播算法回顾

1.1 符号定义与矩阵运算

反向传播算法利用矩阵运算快速计算输出层的梯度,并逐层向前传播误差。定义如下核心符号:

符号含义
wjklw^l_{jk}第 ll 层第 jj 个神经元与第 l−1l-1 层第 kk 个神经元之间的权重
bjlb^l_j第 ll 层第 jj 个神经元的偏置
ajla^l_j第 ll 层第 jj 个神经元的激活值
zjlz^l_j第 ll 层第 jj 个神经元的加权输入:zjl=∑kwjklakl−1+bjlz^l_j = \sum_k w^l_{jk} a^{l-1}_k + b^l_j
δjl\delta^l_j第 ll 层第 jj 个神经元的误差

1.2 反向传播四个基本方程

BP 四个核心方程(必记)

  • BP1(输出层误差):δL=∇aC⊙σ′(zL)\delta^L = \nabla_a C \odot \sigma'(z^L)
  • BP2(误差传播):δl=((wl+1)Tδl+1)⊙σ′(zl)\delta^l = ((w^{l+1})^T \delta^{l+1}) \odot \sigma'(z^l)
  • BP3(代价对偏置的梯度):∂C∂bjl=δjl\frac{\partial C}{\partial b^l_j} = \delta^l_j
  • BP4(代价对权重的梯度):∂C∂wjkl=akl−1δjl\frac{\partial C}{\partial w^l_{jk}} = a^{l-1}_k \delta^l_j

1.3 反向传播算法步骤(随机梯度下降)

  1. 输入:设置输入层激活值 a1=xa^1 = x
  2. 前馈:对每一层 l=2,3,…,Ll = 2, 3, \ldots, L,计算 zl=wlal−1+blz^l = w^l a^{l-1} + b^l 和 al=σ(zl)a^l = \sigma(z^l)
  3. 输出层误差:计算 δL=∇aC⊙σ′(zL)\delta^L = \nabla_a C \odot \sigma'(z^L)
  4. 反向传播误差:对每一层 l=L−1,L−2,…,2l = L-1, L-2, \ldots, 2,计算 δl=((wl+1)Tδl+1)⊙σ′(zl)\delta^l = ((w^{l+1})^T \delta^{l+1}) \odot \sigma'(z^l)
  5. 输出梯度:得到 ∂C∂wjkl=akl−1δjl\frac{\partial C}{\partial w^l_{jk}} = a^{l-1}_k \delta^l_j 和 ∂C∂bjl=δjl\frac{\partial C}{\partial b^l_j} = \delta^l_j

1.4 反向传播的全局观

从全局视角理解反向传播:权重的变化如何影响激活值的变化,进而影响代价函数的变化。可以用"路径求和"的方式理解梯度的计算:

∂C∂wjkl=∑paths(path contributions from wjkl to C)\frac{\partial C}{\partial w^l_{jk}} = \sum_{\text{paths}} \text{(path contributions from } w^l_{jk} \text{ to } C\text{)}

每一条从权重 wjklw^l_{jk} 到代价 CC 的路径,其贡献为路径上所有偏导数的乘积。反向传播算法本质上是高效地计算这些路径求和。


二、交叉熵代价函数

2.1 MSE 的学习缓慢问题

使用均方误差(MSE)作为代价函数时,当神经元输出严重错误且饱和时,学习速度非常缓慢。

问题示例

单个神经元,期望输出 0,使用 MSE 代价函数:

  • 当 w=0.6,b=0.9w=0.6, b=0.9 时:初始输出 σ(0.6×1+0.9)=σ(1.5)≈0.82\sigma(0.6 \times 1 + 0.9) = \sigma(1.5) \approx 0.82,学习缓慢
  • 当 w=2.0,b=2.0w=2.0, b=2.0 时:初始输出 σ(2.0×1+2.0)=σ(4.0)≈0.98\sigma(2.0 \times 1 + 2.0) = \sigma(4.0) \approx 0.98,学习更加缓慢!

原因:MSE 梯度中含有 σ′(z)\sigma'(z) 项,当神经元饱和时 σ′(z)≈0\sigma'(z) \approx 0,梯度趋近于零。

2.2 交叉熵定义

为解决学习缓慢问题,引入交叉熵代价函数:

C=−1n∑x[yln⁡a+(1−y)ln⁡(1−a)]C = -\frac{1}{n} \sum_x \left[ y \ln a + (1-y) \ln(1-a) \right]

其中 nn 为训练样本总数,aa 为神经元输出,yy 为期望输出。

2.3 交叉熵的关键性质

优势:梯度中不含 σ′(z)\sigma'(z)

计算交叉熵对权重的偏导数:

∂C∂wj=1n∑xxj(σ(z)−y)\frac{\partial C}{\partial w_j} = \frac{1}{n} \sum_x x_j (\sigma(z) - y)

梯度仅取决于输出误差 (σ(z)−y)(\sigma(z) - y),误差越大学习越快

2.4 详细推导

对单个训练样本,代价函数为:

C=−[yln⁡a+(1−y)ln⁡(1−a)]C = -\left[ y \ln a + (1-y) \ln(1-a) \right]

其中 a=σ(z)=σ(wx+b)a = \sigma(z) = \sigma(wx + b)。计算偏导数:

∂C∂wj=−[yσ(z)−1−y1−σ(z)]⋅σ′(z)⋅xj\frac{\partial C}{\partial w_j} = -\left[ \frac{y}{\sigma(z)} - \frac{1-y}{1-\sigma(z)} \right] \cdot \sigma'(z) \cdot x_j

利用 σ′(z)=σ(z)(1−σ(z))\sigma'(z) = \sigma(z)(1-\sigma(z)):

∂C∂wj=−[yσ(z)−1−y1−σ(z)]⋅σ(z)(1−σ(z))⋅xj\frac{\partial C}{\partial w_j} = -\left[ \frac{y}{\sigma(z)} - \frac{1-y}{1-\sigma(z)} \right] \cdot \sigma(z)(1-\sigma(z)) \cdot x_j

=−[y(1−σ(z))−(1−y)σ(z)]⋅xj= -\left[ y(1-\sigma(z)) - (1-y)\sigma(z) \right] \cdot x_j

=−[y−yσ(z)−σ(z)+yσ(z)]⋅xj= -\left[ y - y\sigma(z) - \sigma(z) + y\sigma(z) \right] \cdot x_j

=(σ(z)−y)⋅xj= (\sigma(z) - y) \cdot x_j

类似地,对偏置的偏导数为:

∂C∂b=1n∑x(σ(z)−y)\frac{\partial C}{\partial b} = \frac{1}{n} \sum_x (\sigma(z) - y)

2.5 从期望性质反推交叉熵

如果我们希望代价函数满足以下性质:

∂C∂w=x(a−y)\frac{\partial C}{\partial w} = x(a - y)

从这个期望出发,通过积分可以推导出交叉熵的形式。由 ∂C∂a=a−ya(1−a)\frac{\partial C}{\partial a} = \frac{a-y}{a(1-a)},对 aa 积分得:

C=−[yln⁡a+(1−y)ln⁡(1−a)]+constC = -\left[ y \ln a + (1-y) \ln(1-a) \right] + \text{const}

2.6 多神经元推广

对于输出层有多个神经元的网络,交叉熵推广为:

C=−1n∑x∑j[yjln⁡ajL+(1−yj)ln⁡(1−ajL)]C = -\frac{1}{n} \sum_x \sum_j \left[ y_j \ln a^L_j + (1-y_j) \ln(1-a^L_j) \right]

其中 jj 遍历输出层所有神经元。


三、Softmax 与对数似然

3.1 Softmax 输出层

Softmax 是一种输出层激活函数,用来替代 sigmoid。它把输出层的原始值 zjLz^L_j 转换成概率分布

ajL=ezjL∑kezkLa^L_j = \frac{e^{z^L_j}}{\sum_{k} e^{z^L_k}}

输出范围:每个 ajL∈(0,1)a^L_j \in (0, 1)

和为 1:∑jajL=1\sum_j a^L_j = 1(天然是概率分布)

放大差异:zz 最大的那个类别会得到最大的概率

假设输出层有 3 个神经元(3 分类),加权输入为:

zL=(2.0, 1.0, 0.5)z^L = (2.0, \ 1.0, \ 0.5)

计算 softmax:

∑kezkL=e2.0+e1.0+e0.5=7.389+2.718+1.649=11.756\sum_k e^{z^L_k} = e^{2.0} + e^{1.0} + e^{0.5} = 7.389 + 2.718 + 1.649 = 11.756

神经元zjLz^L_jezjLe^{z^L_j}ajLa^L_j(softmax 输出)解释
j=12.07.3897.389/11.756 = 0.629最大 → 最高概率
j=21.02.7182.718/11.756 = 0.231
j=30.51.6491.649/11.756 = 0.140

输出 (0.629,0.231,0.140)(0.629, 0.231, 0.140),和为 1

网络预测:最可能是第 1 类(概率 62.9%)


3.2 对数似然代价函数

Softmax 通常搭配对数似然代价函数(Log-likelihood cost):C=−ln⁡ayLC = -\ln a^L_y

其中 yy 是正确类别的索引。当网络对正确类别预测的概率越高,代价越低。

也就是只关注"正确类别的概率"有多大

ayLa^L_y(正确类别的概率)C=−ln⁡ayLC = -\ln a^L_y
0.90.105很自信且正确 → 损失小
0.50.693不太确定 → 损失中等
0.12.303把正确答案排很低 → 损失很大
→ 0→ ∞完全错误 → 惩罚趋于无穷

3.3 梯度推导

Softmax + 对数似然的梯度同样具有简洁的形式:

∂C∂wjkL=akl−1(ajL−yj)\frac{\partial C}{\partial w^L_{jk}} = a^{l-1}_k (a^L_j - y_j)

∂C∂bjL=ajL−yj\frac{\partial C}{\partial b^L_j} = a^L_j - y_j

与交叉熵相同的优势都是梯度同样不含 σ′(z)\sigma'(z),由误差 (ajL−yj)(a^L_j - y_j) 驱动,避免学习缓慢。

3.4 交叉熵 vs Softmax+对数似然 对比

Sigmoid + 交叉熵

  • 输出层使用 Sigmoid
  • 代价函数:C=−1n∑[yln⁡a+(1−y)ln⁡(1−a)]C = -\frac{1}{n}\sum[y\ln a + (1-y)\ln(1-a)]
  • 适合二分类或多标签任务
  • 各输出独立

Softmax + 对数似然

  • 输出层使用 Softmax
  • 代价函数:C=−ln⁡ayLC = -\ln a^L_y
  • 适合多分类(互斥)任务
  • 各输出竞争(和为 1)

四、过拟合问题

4.1 过拟合现象

当模型参数远多于训练数据时,网络会记住训练数据的噪声而非学习通用规律。

实验示例

使用 30 个隐藏神经元的网络(共 23860 个参数),仅用 1000 张图片训练:

  • 训练准确率持续上升(接近 100%)
  • 测试准确率很快达到平台期并停止提升
  • 训练代价持续下降,但测试代价开始上升

4.2 检测过拟合

  1. 跟踪测试集(或验证集)上的准确率
  2. 当测试准确率不再提升时,停止训练(早停法 Early Stopping)
  3. 观察训练代价与测试代价的差距是否持续增大

4.3 最直接的解决方案:增加训练数据

将训练数据从 1000 张增加到 50000 张后,过拟合现象大幅缓解,测试准确率显著提升。

更多的数据几乎总是比更复杂的模型更有效。但获取更多数据并非总是可行,因此需要正则化等技术。


五、正则化方法

当网络参数太多、训练数据太少时,网络会过拟合—— 在训练集上表现很好,但在新数据上很差(相当于 "死记硬背" 而不是 "学会规律")。

正则化的核心思想是给代价函数加一个 "惩罚项",让网络倾向于用更小、更简单的权重,从而避免过拟合。

5.1 L1 正则化

L1 正则化使用权重的绝对值之和作为惩罚项:

C=C0+λn∑w∣w∣C = C_0 + \frac{\lambda}{n} \sum_w |w|

其中 C0C_0 为原始代价函数,λ>0\lambda > 0 为正则化参数,求和遍历网络中所有权重。

权重更新规则

w→w−ηλnsgn(w)−η∂C0∂ww \to w - \frac{\eta\lambda}{n} \text{sgn}(w) - \eta \frac{\partial C_0}{\partial w}

sgn 是符号函数(Sign Function)

5.2 L2 正则化(权重衰减)

在原始代价函数基础上添加权重惩罚项:

C=C0+λ2n∑ww2C = C_0 + \frac{\lambda}{2n} \sum_w w^2

其中 C0C_0 为原始代价函数,λ>0\lambda > 0 为正则化参数,求和遍历网络中所有权重。

权重更新规则

参数更新规则
权重 www→w(1−ηλn)−η∂C0∂ww \to w\left(1 - \frac{\eta\lambda}{n}\right) - \eta \frac{\partial C_0}{\partial w}
偏置 bbb→b−η∂C0∂bb \to b - \eta \frac{\partial C_0}{\partial b}(偏置不正则化)

λ 越大,权重被压得越小,网络越简单。太小则正则化没效果(过拟合),太大则网络能力被压垮(欠拟合)。需要通过验证集调参找到最优的 λ。

特性L1 正则化L2 正则化
惩罚项λn∑∣w∣\frac{\lambda}{n}\sum \lvert w \rvertλ2n∑w2\frac{\lambda}{2n}\sum w^2
梯度贡献λnsgn(w)\frac{\lambda}{n}\text{sgn}(w)(常数大小)λnw\frac{\lambda}{n}w(与 w 成正比)
权重缩减方式等量缩减(固定步长)等比缩减(按比例衰减)
结果特征产生稀疏权重(许多权重为 0)权重普遍较小但不为 0
适用场景特征选择防止过拟合(通用)

5.3 Dropout

训练时,每次前向传播随机 "关掉" 一部分隐藏层神经元,让它们的输出变为 0。被关掉的神经元这一轮不参与计算,也不更新权重。强迫网络中的每个神经元都独立学到有用的特征,而不是依赖特定的搭配。效果相当于同时训练了大量不同的子网络,最终取平均,显著减轻过拟合

  1. 训练时,以概率 pp 随机将隐藏层神经元的输出置零
  2. 输入层和输出层保持不变
  3. 测试时,使用所有神经元但将权重乘以 (1−p)(1-p) 进行缩放

Dropout 的直觉理解

  • 相当于训练了指数级数量的"瘦"网络的集成(Ensemble)
  • 每个神经元不能依赖于特定其他神经元的存在,必须学习更鲁棒的特征
  • 减少神经元之间的"共适应"(co-adaptation)

六、数据增强

通过对已有训练数据进行变换来扩充数据集,是对抗过拟合的有效手段。

6.1 常用增强方法

方法描述
平移(Translation)将图像在水平或垂直方向偏移若干像素
旋转(Rotation)将图像按一定角度旋转(如 ±15°\pm15°)
镜像翻转(Flip)水平或垂直翻转图像
弹性形变(Elastic Deformation)对图像施加随机弹性变换,模拟手写变体

6.2 效果

数据增强能有效增加训练数据的多样性,提升模型的泛化能力。实验表明,使用弹性形变增强后的手写数字识别准确率显著提升。

关键原则:增强变换应模拟真实世界中可能出现的数据变体,同时保持标签不变。


七、权重初始化

创建网络后,在开始训练之前需要给权重和偏置设定初始值。初始化方式直接影响训练能否顺利开始以及收敛速度。

7.1 标准初始化的问题

使用标准正态分布 N(0,1)\mathcal{N}(0, 1) 初始化所有权重时:

  • 加权输入 z=∑jwjxj+bz = \sum_j w_j x_j + b 的标准差为 nin+1\sqrt{n_{in} + 1}(ninn_{in} 为输入连接数)
  • 当 ninn_{in} 较大时,∣ z∣ 很大时,σ(z) 接近 0 或 1(饱和)
  • 饱和导致 σ′(z)≈0\sigma'(z) \approx 0,学习极其缓慢

7.2 改进的初始化方法

改进方案:使用 N(0,1/nin)\mathcal{N}(0, 1/\sqrt{n_{in}}) 初始化权重

此时 zz 的标准差约为 3/2≈1.22\sqrt{3/2} \approx 1.22(假设偏置用 N(0,1)\mathcal{N}(0,1)),神经元不再轻易饱和。

标准初始化 N(0,1)\mathcal{N}(0,1)

  • 初始时大量神经元饱和
  • 学习起步极慢
  • 需要更多 epoch 才能收敛

改进初始化 N(0,1/nin)\mathcal{N}(0, 1/\sqrt{n_{in}})

  • 初始时神经元处于非饱和区
  • 学习从一开始就很快
  • 更快收敛到更好的结果

八、数据预处理

良好的数据预处理可以显著加速训练并提升模型性能。

8.1 均值减法(Mean Subtraction)

x^=x−xˉ\hat{x} = x - \bar{x}

将每个特征减去其在训练集上的均值,使数据以零为中心。

8.2 均一化(Normalization)

x^=x−μσ\hat{x} = \frac{x - \mu}{\sigma}

进一步除以标准差,使每个特征的方差为 1。预处理后数据满足:均值为 0,方差为 1。

8.3 ZCA 白化(Whitening)

白化将数据去相关化,使协方差矩阵变为单位矩阵:

y=Wxy = W x

ZCA 白化的变换矩阵为:

WZCA=Σ−1/2W_{ZCA} = \Sigma^{-1/2}

其中 Σ\Sigma 为数据的协方差矩阵。

预处理方法效果适用场景
均值减法中心化(均值=0)几乎所有情况
均一化中心化 + 等方差特征尺度差异大时
ZCA 白化去相关 + 等方差特征间相关性强时

九、其他优化算法

9.1 Hessian 方法(二阶优化)

利用代价函数的二阶泰勒展开来优化:

C(w+Δw)≈C(w)+∇C⋅Δw+12ΔwTHΔwC(w + \Delta w) \approx C(w) + \nabla C \cdot \Delta w + \frac{1}{2} \Delta w^T H \Delta w

其中 HH 为 Hessian 矩阵(二阶偏导矩阵),Hij=∂2C∂wi∂wjH_{ij} = \frac{\partial^2 C}{\partial w_i \partial w_j}

令梯度为零,求得最优步长:

Δw=−H−1∇C\Delta w = -H^{-1} \nabla C

Hessian 方法的优缺点

  • 优点:收敛速度快,不需要手动调节学习率
  • 缺点:Hessian 矩阵计算和存储成本极高(O(n2)O(n^2) 存储,O(n3)O(n^3) 求逆),实际中常用近似方法

9.2 动量梯度下降(Momentum)

引入"速度"变量 vv,模拟物理中的动量效应:

v→μv−η∇Cv \to \mu v - \eta \nabla C

w→w+vw \to w + v

其中 μ∈[0,1)\mu \in [0, 1) 为动量系数(通常取 0.9),η\eta 为学习率

特性标准梯度下降动量梯度下降
更新规则w→w−η∇Cw \to w - \eta\nabla Cv→μv−η∇Cv \to \mu v - \eta\nabla C,w→w+vw \to w + v
梯度噪声容易震荡平滑梯度方向
平坦区域缓慢通过积累速度快速通过
收敛速度较慢更快

十、其他激活函数

10.1 tanh 激活函数

定义:

tanh⁡(z)=ez−e−zez+e−z\tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}}

与 Sigmoid 的关系:

σ(z)=1+tanh⁡(z/2)2\sigma(z) = \frac{1 + \tanh(z/2)}{2}

特性Sigmoid σ(z)\sigma(z)tanh(z)
输出范围(0,1)(0, 1)(−1,1)(-1, 1)
零中心否(输出总为正)是(零中心输出)
饱和问题存在存在(但零中心有助于训练)
典型应用输出层(二分类概率)隐藏层

10.2 ReLU 激活函数

定义:

ReLU(z)=max⁡(0,z)\text{ReLU}(z) = \max(0, z)

ReLU 的优势

  • 无饱和问题(正区间梯度恒为 1)
  • 计算高效(仅需比较和取零操作)
  • 稀疏激活(负输入直接输出零,天然正则化效果)
  • 收敛速度通常比 Sigmoid/tanh 快 6 倍

ReLU 的潜在问题:Dead ReLU

当某个神经元的输入始终为负时,该神经元永远输出 0,梯度也为 0,永远无法恢复。解决方案:使用 Leaky ReLU max⁡(0.01z,z)\max(0.01z, z) 或适当的学习率。

10.3 激活函数总览

函数公式范围零中心主要问题
Sigmoid11+e−z\frac{1}{1+e^{-z}}(0,1)否饱和、非零中心
tanhez−e−zez+e−z\frac{e^z-e^{-z}}{e^z+e^{-z}}(-1,1)是饱和
ReLUmax⁡(0,z)\max(0,z)[0,+∞)否Dead ReLU

  • 交叉熵:C=−1n∑[yln⁡a+(1−y)ln⁡(1−a)]C = -\frac{1}{n}\sum[y\ln a + (1-y)\ln(1-a)],梯度:∂C∂wj=1n∑xj(σ(z)−y)\frac{\partial C}{\partial w_j} = \frac{1}{n}\sum x_j(\sigma(z)-y)
  • Softmax:ajL=ezjL/∑kezkLa^L_j = e^{z^L_j}/\sum_k e^{z^L_k},对数似然:C=−ln⁡ayLC=-\ln a^L_y
  • L2 正则化:C=C0+λ2n∑w2C = C_0 + \frac{\lambda}{2n}\sum w^2,更新:w→w(1−ηλn)−η∂C0∂ww \to w(1-\frac{\eta\lambda}{n}) - \eta\frac{\partial C_0}{\partial w}
  • L1 正则化:C=C0+λn∑∣w∣C = C_0 + \frac{\lambda}{n}\sum|w|,更新:w→w−ηλnsgn(w)−η∂C0∂ww \to w - \frac{\eta\lambda}{n}\text{sgn}(w) - \eta\frac{\partial C_0}{\partial w}
  • 改进初始化:w∼N(0,1/nin)w \sim \mathcal{N}(0, 1/\sqrt{n_{in}})
  • 动量:v→μv−η∇Cv \to \mu v - \eta\nabla C,w→w+vw \to w + v