神经网络与深度学习:神经网络基础(第3-4讲)

3826 个字
19 分钟
神经网络与深度学习:神经网络基础(第3-4讲)

神经网络与深度学习:改进学习方法(第 3-4 讲)#

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


一、反向传播算法回顾#

1.1 符号定义与矩阵运算#

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

符号含义
wjklw^l_{jk}ll 层第 jj 个神经元与第 l1l-1 层第 kk 个神经元之间的权重
bjlb^l_jll 层第 jj 个神经元的偏置
ajla^l_jll 层第 jj 个神经元的激活值
zjlz^l_jll 层第 jj 个神经元的加权输入:zjl=kwjklakl1+bjlz^l_j = \sum_k w^l_{jk} a^{l-1}_k + b^l_j
δjl\delta^l_jll 层第 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(代价对偏置的梯度)Cbjl=δjl\frac{\partial C}{\partial b^l_j} = \delta^l_j

  • BP4(代价对权重的梯度)Cwjkl=akl1δ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=wlal1+blz^l = w^l a^{l-1} + b^lal=σ(zl)a^l = \sigma(z^l)

  3. 输出层误差:计算 δL=aCσ(zL)\delta^L = \nabla_a C \odot \sigma'(z^L)

  4. 反向传播误差:对每一层 l=L1,L2,,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. 输出梯度:得到 Cwjkl=akl1δjl\frac{\partial C}{\partial w^l_{jk}} = a^{l-1}_k \delta^l_jCbjl=δjl\frac{\partial C}{\partial b^l_j} = \delta^l_j

1.4 反向传播的全局观#

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

Cwjkl=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=1nx[ylna+(1y)ln(1a)]C = -\frac{1}{n} \sum_x \left[ y \ln a + (1-y) \ln(1-a) \right]

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

2.3 交叉熵的关键性质#

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

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

Cwj=1nxxj(σ(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=[ylna+(1y)ln(1a)]C = -\left[ y \ln a + (1-y) \ln(1-a) \right]

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

Cwj=[yσ(z)1y1σ(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))

Cwj=[yσ(z)1y1σ(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))(1y)σ(z)]xj= -\left[ y(1-\sigma(z)) - (1-y)\sigma(z) \right] \cdot x_j

=[yyσ(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

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

Cb=1nx(σ(z)y)\frac{\partial C}{\partial b} = \frac{1}{n} \sum_x (\sigma(z) - y)

2.5 从期望性质反推交叉熵#

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

Cw=x(ay)\frac{\partial C}{\partial w} = x(a - y)

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

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

2.6 多神经元推广#

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

C=1nxj[yjlnajL+(1yj)ln(1ajL)]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=ezjLkezkLa^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=lnayLC = -\ln a^L_y

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

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

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

3.3 梯度推导#

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

CwjkL=akl1(ajLyj)\frac{\partial C}{\partial w^L_{jk}} = a^{l-1}_k (a^L_j - y_j)

CbjL=ajLyj\frac{\partial C}{\partial b^L_j} = a^L_j - y_j

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

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

Sigmoid + 交叉熵

  • 输出层使用 Sigmoid

  • 代价函数:C=1n[ylna+(1y)ln(1a)]C = -\frac{1}{n}\sum[y\ln a + (1-y)\ln(1-a)]

  • 适合二分类或多标签任务

  • 各输出独立

Softmax + 对数似然

  • 输出层使用 Softmax

  • 代价函数:C=lnayLC = -\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+λnwwC = C_0 + \frac{\lambda}{n} \sum_w |w|

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

权重更新规则#

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

sgn 是符号函数(Sign Function)

5.2 L2 正则化(权重衰减)#

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

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

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

权重更新规则#

参数更新规则
权重 wwww(1ηλn)ηC0ww \to w\left(1 - \frac{\eta\lambda}{n}\right) - \eta \frac{\partial C_0}{\partial w}
偏置 bbbbηC0bb \to b - \eta \frac{\partial C_0}{\partial b}(偏置不正则化)

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

L1 vs L2 对比#

| 特性 | L1 正则化 | L2 正则化 | | ------------ | -------------------------------------------- | ----------------------------------- | --- | ---------------------------- | | 惩罚项 | λnw\frac{\lambda}{n}\sum | w | | λ2nw2\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. 测试时,使用所有神经元但将权重乘以 (1p)(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/21.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^=xxˉ\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=2CwiwjH_{ij} = \frac{\partial^2 C}{\partial w_i \partial w_j}

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

Δw=H1C\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

ww+vw \to w + v

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

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

十、其他激活函数#

10.1 tanh 激活函数#

定义:

tanh(z)=ezezez+ez\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+ez\frac{1}{1+e^{-z}}(0,1)饱和、非零中心
tanhezezez+ez\frac{e^z-e^{-z}}{e^z+e^{-z}}(-1,1)饱和
ReLUmax(0,z)\max(0,z)[0,+∞)Dead ReLU

总结#

公式清单

  • 交叉熵C=1n[ylna+(1y)ln(1a)]C = -\frac{1}{n}\sum[y\ln a + (1-y)\ln(1-a)],梯度:Cwj=1nxj(σ(z)y)\frac{\partial C}{\partial w_j} = \frac{1}{n}\sum x_j(\sigma(z)-y)

  • SoftmaxajL=ezjL/kezkLa^L_j = e^{z^L_j}/\sum_k e^{z^L_k},对数似然:C=lnayLC=-\ln a^L_y

  • L2 正则化C=C0+λ2nw2C = C_0 + \frac{\lambda}{2n}\sum w^2,更新:ww(1ηλn)ηC0ww \to w(1-\frac{\eta\lambda}{n}) - \eta\frac{\partial C_0}{\partial w}

  • L1 正则化C=C0+λnwC = C_0 + \frac{\lambda}{n}\sum|w|,更新:wwηλnsgn(w)ηC0ww \to w - \frac{\eta\lambda}{n}\text{sgn}(w) - \eta\frac{\partial C_0}{\partial w}

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

  • 动量vμvηCv \to \mu v - \eta\nabla Cww+vw \to w + v

(注:内容由 AI 生成,请谨慎参考)

分享到社交平台

将本文分享给你的朋友们

神经网络与深度学习:神经网络基础(第3-4讲)
https://firefly.cuteleaf.cn/posts/神经网络/神经网络与深度学习改进学习方法第3-4讲/
作者
Zhongye
发布于
2026-06-07
版权声明
CC BY-NC-SA 4.0

评论

Profile Image of the Author
Zhongye
南漂中
公告
新的博客站!旧站点传送门 zhongye1.github.io/Arknight-notes
音乐
专辑封面

音乐

暂无播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章数
147
分类数
15
标签数
214
总字数
365,610
运行天数
0
最后更新
0 天前

目录