机器学习笔记之正则化(六)批标准化(BatchNormalization)

news2025/1/20 5:56:26

引言

本节以梯度消失为引,介绍批标准化 ( Batch Normalization ) (\text{Batch Normalization}) (Batch Normalization)

引子:梯度消失

假设有一个非常简单的神经网络,它的隐藏层数量较多,为了简化描述,每个隐藏层仅包含一个神经元。具体效果表示如下:
一个特殊的神经网络
那么上述神经网络的前馈计算过程可表示为如下形式:
Y = f ( W ) = σ { ( W 2 ) T σ [ ( W 1 ) T X + b 1 ] ⏟ h 1 + b 2 } ⏟ h 2 + ⋯ \mathcal Y = f(\mathcal W) = \underbrace{\sigma \left\{(\mathcal W_2)^T \underbrace{\sigma[(\mathcal W_1)^{T} \mathcal X + b_1]}_{h_1} + b_2\right\}}_{h_2} + \cdots Y=f(W)=h2 σ (W2)Th1 σ[(W1)TX+b1]+b2 +

如果使用梯度下降法的方式对权重进行更新,假设关于 Y \mathcal Y Y策略/损失函数表示为 J ( W ) \mathcal J(\mathcal W) J(W),关于权重 W 1 \mathcal W_1 W1的梯度更新过程表示如下:
这里将偏置信息 b 1 , ⋯   , b K b_1,\cdots,b_{\mathcal K} b1,,bK看作是权重的一部分,忽略。详见 M-P \text{M-P} M-P神经元一节。
W 1 ( t + 1 ) ⇐ W 1 ( t ) − η ⋅ ∇ W 1 J ( W ) \mathcal W_1^{(t+1)} \Leftarrow \mathcal W_1^{(t)} - \eta \cdot \nabla_{\mathcal W_1} \mathcal J(\mathcal W) W1(t+1)W1(t)ηW1J(W)

其中 W 1 ( t ) , W 1 ( t + 1 ) \mathcal W_1^{(t)},\mathcal W_1^{(t+1)} W1(t),W1(t+1)分别表示 t t t迭代步骤, t + 1 t+1 t+1迭代步骤下 W 1 \mathcal W_1 W1更新结果 η \eta η表示学习率( Learning Rate \text{Learning Rate} Learning Rate)。在该神经网络中,关于梯度 ∇ W 1 J ( W ) \nabla_{\mathcal W_1} \mathcal J(\mathcal W) W1J(W),我们使用反向传播算法对该梯度表示如下:

  • 就是‘链式求导法则’。
  • 其中 Y = σ ( W K + 1 T h K + b K + 1 ⏟ Z K + 1 ) \mathcal Y = \sigma(\underbrace{\mathcal W_{\mathcal K+1}^T h_{\mathcal K} + b_{\mathcal K+1}}_{\mathcal Z_{\mathcal K + 1}}) Y=σ(ZK+1 WK+1ThK+bK+1),以此类推。
    ∇ W 1 J ( W ) = ∂ J ( W ) ∂ W 1 = ∂ J ( W ) ∂ Y ⋅ ∂ Y ∂ Z K + 1 ⋅ ∂ Z K + 1 ∂ h K ⋯ ∂ h 2 ∂ Z 2 ⋅ ∂ Z 2 ∂ h 1 ⋅ ∂ h 1 ∂ Z 1 ⋅ ∂ Z 1 ∂ W 1 \begin{aligned} \nabla_{\mathcal W_1} \mathcal J(\mathcal W) & = \frac{\partial \mathcal J(\mathcal W)}{\partial \mathcal W_1} \\ & = \frac{\partial \mathcal J(\mathcal W)}{\partial \mathcal Y} \cdot \frac{\partial \mathcal Y}{\partial \mathcal Z_{\mathcal K+1}} \cdot \frac{\partial \mathcal Z_{\mathcal K+1}}{\partial h_{\mathcal K}} \cdots \frac{\partial h_2}{\partial \mathcal Z_2} \cdot \frac{\partial \mathcal Z_2}{\partial \mathcal h_1}\cdot \frac{\partial h_1}{\partial \mathcal Z_1} \cdot \frac{\partial \mathcal Z_1}{\partial \mathcal W_1} \end{aligned} W1J(W)=W1J(W)=YJ(W)ZK+1YhKZK+1Z2h2h1Z2Z1h1W1Z1

Z K = ( W K ) T h K − 1 + b K \mathcal Z_{\mathcal K} = (\mathcal W_{\mathcal K})^T h_{\mathcal K-1} + b_{\mathcal K} ZK=(WK)ThK1+bK,表示第 K \mathcal K K网络的线性计算结果。其中:

  • ∂ J ( W ) ∂ Y \begin{aligned}\frac{\partial \mathcal J(\mathcal W)}{\partial \mathcal Y}\end{aligned} YJ(W)可看作是关于 Y \mathcal Y Y函数,而 Y \mathcal Y Y自身又是关于 W 1 , W 2 , ⋯   , W K + 1 ⇒ W \mathcal W_1,\mathcal W_2,\cdots,\mathcal W_{\mathcal K + 1} \Rightarrow \mathcal W W1,W2,,WK+1W复杂函数
  • ∂ Y ∂ Z K + 1 , ⋯   , ∂ h 2 ∂ Z 2 , ∂ h 1 ∂ Z 1 \begin{aligned}\frac{\partial \mathcal Y}{\partial \mathcal Z_{\mathcal K+1}},\cdots,\frac{\partial h_2}{\partial \mathcal Z_2},\frac{\partial h_1}{\partial \mathcal Z_1}\end{aligned} ZK+1Y,,Z2h2,Z1h1均是激活函数的导数结果:
    随着前馈计算的传递,在样本 X \mathcal X X给定的条件下,将 Z k ( k = 1 , 2 , ⋯   , K + 1 ) \mathcal Z_{k}(k=1,2,\cdots,\mathcal K+1) Zk(k=1,2,,K+1)看作是关于 W 1 , W 2 , ⋯   , W K + 1 ⇒ W \mathcal W_1,\mathcal W_2,\cdots,\mathcal W_{\mathcal K+1} \Rightarrow \mathcal W W1,W2,,WK+1W的复杂函数即可。对应地,这些梯度也都是关于 W \mathcal W W的复杂函数。
    ∂ Y ∂ Z k + 1 = σ ′ ( Z K + 1 ) , ∂ h k ∂ Z k = σ ′ ( Z k ) k = 1 , 2 , ⋯   , K \begin{aligned}\frac{\partial \mathcal Y}{\partial \mathcal Z_{\mathcal k + 1}} = \sigma'(\mathcal Z_{\mathcal K + 1}),\frac{\partial h_k}{\partial \mathcal Z_k}=\sigma'(\mathcal Z_k) \quad k=1,2,\cdots,\mathcal K\end{aligned} Zk+1Y=σ(ZK+1),Zkhk=σ(Zk)k=1,2,,K
  • ∂ Z K + 1 ∂ h K , ∂ Z K ∂ h K − 1 , ⋯   , ∂ Z 2 ∂ h 1 \begin{aligned}\frac{\partial \mathcal Z_{\mathcal K+1}}{\partial h_{\mathcal K}},\frac{\partial \mathcal Z_{\mathcal K}}{\partial h_{\mathcal K -1}},\cdots,\frac{\partial \mathcal Z_2}{\partial h_1}\end{aligned} hKZK+1,hK1ZK,,h1Z2分别等于 W K + 1 , W K , ⋯   , W 2 \mathcal W_{\mathcal K + 1},\mathcal W_{\mathcal K},\cdots,\mathcal W_2 WK+1,WK,,W2

至此,除了第一项 ∂ Z 1 ∂ W 1 = X \begin{aligned}\frac{\partial \mathcal Z_1}{\partial \mathcal W_1} = \mathcal X\end{aligned} W1Z1=X,其余所有项均和模型权重 W \mathcal W W相关:
∇ W 1 J ( W ) = ∂ J ( W ) ∂ Y ⋅ ∏ k = 1 K + 1 σ ′ ( Z k ) ⋅ ∏ k = 2 K + 1 W k ⋅ X \nabla_{\mathcal W_1} \mathcal J(\mathcal W) = \frac{\partial \mathcal J(\mathcal W)}{\partial \mathcal Y} \cdot \prod_{k=1}^{\mathcal K + 1} \sigma'(\mathcal Z_k) \cdot \prod_{k=2}^{\mathcal K+1}\mathcal W_k \cdot \mathcal X W1J(W)=YJ(W)k=1K+1σ(Zk)k=2K+1WkX

随着梯度下降过程的执行, W \mathcal W W不可避免地会减小,这会使 W \mathcal W W的查找过程越加精确。但如果迭代过程中上述式子存在一些数值过于小的项,导致 ∇ W 1 J ( W ) \nabla_{\mathcal W_1}\mathcal J(\mathcal W) W1J(W)非常小。例如 ∏ k = 1 K + 1 σ ′ ( Z k ) \begin{aligned}\prod_{k=1}^{\mathcal K+1} \sigma'(\mathcal Z_k)\end{aligned} k=1K+1σ(Zk)

如果激活函数 σ \sigma σ选择的是 Sigmoid \text{Sigmoid} Sigmoid函数,那么会出现什么情况 ?  Sigmoid ?\text{ Sigmoid} ? Sigmoid函数及其一阶导函数图像表示如下:
Sigmoid函数及其一阶导函数
其中蓝色线表示 Sigmoid \text{Sigmoid} Sigmoid函数图像;橙色线表示其一阶导函数。可以发现:

  • Sigmoid \text{Sigmoid} Sigmoid函数的一阶导函数最大值 0.25 ≪ 1 0.25 \ll 1 0.251
  • 小于红色线或者大于绿色线范围内的值,其导数结果几乎趋近于 0 0 0
    这里红色线,绿色线对应的值对应 Sigmoid \text{Sigmoid} Sigmoid函数三阶导函数的非零零点。仅作为范围表示使用,不准确。

如果若干 Z k ( k ∈ { 1 , 2 , ⋯   , K + 1 } ) \mathcal Z_k (k \in \{1,2,\cdots,\mathcal K + 1\}) Zk(k{1,2,,K+1})结果落在了上述区间,那么会导致 ∇ W 1 J ( W ) ⇒ 0 \nabla_{\mathcal W_1} \mathcal J(\mathcal W) \Rightarrow 0 W1J(W)0,这就是梯度消失( Vanishing Gradient \text{Vanishing Gradient} Vanishing Gradient)现象。

梯度消失的处理方式

重新观察 Sigmoid \text{Sigmoid} Sigmoid函数图像,我们可以将其划分为 3 3 3个部分:
Sigmoid函数的三个分区

  • 线性近似区:该部分函数的梯度效果明显并比较稳定,在反向传播过程中落在该位置的特征存在明显的梯度更新;
  • 饱和区:该部分函数梯度存在但梯度变化量较小,在反向传播过程中落在该位置的特征仅存在较小的梯度更新;
  • 常数近似区:该部分函数梯度几乎不存在。在反向传播过程中该位置的特征几乎不更新,可看作为神经元失活。
    并不是说类似 Dropout \text{Dropout} Dropout中只有‘神经元输出结果为0’才是神经元失活,如果某神经元的权重 W \mathcal W W几乎不发生变化,导致每次前馈计算过程中该神经元总是输出一个‘固定的常数’。这种神经元也可视作失活(更新权重梯度没有效果)。

如何防止上述情况产生的梯度消失 ? ? ?

  • 常见方式是使用 ReLU,Maxout \text{ReLU,Maxout} ReLU,Maxout等激活函数替代 Sigmoid \text{Sigmoid} Sigmoid激活函数。这里以 ReLU \text{ReLU} ReLU激活函数为例:
    ReLU = { x if  x > 0 0 Otherwise \text{ReLU} = \begin{cases} x \quad \text{if } x > 0 \\ 0 \quad \text{Otherwise} \end{cases} ReLU={xif x>00Otherwise
    对应函数图像以及一阶导函数图像表示如下:
    ReLU函数及其一阶导函数
    相比于 Sigmoid \text{Sigmoid} Sigmoid函数, ReLU \text{ReLU} ReLU激活函数能够保证:神经元输出结果的每一个正值分量对应的权重 均存在不可衰减梯度。

    相反,对于输出结果的负值分量对应的权重梯度为 0 0 0——可以造成神经网络的稀疏性,可理解为一种基于稀疏特征的正则化方式

    • 对于神经元失活,我们需要辩证看待。对于 Dropout \text{Dropout} Dropout中的神经元失活,该操作是基于神经网络权重共享的性质,从而达到减小预测分布方差的目的。
    • 题外话(个人理解): Dropout \text{Dropout} Dropout ReLU \text{ReLU} ReLU激活函数都会造成神经网络的稀疏性,但两者之间存在区别。 Dropout \text{Dropout} Dropout针对的目标是神经元。如果一个神经元失活,对应该神经元的所有权重分量全部失活,无一幸免;如果是 ReLU \text{ReLU} ReLU激活函数,它仅失活那些输出特征为负值对应的权重分量,并不会使整个神经元失活。

批标准化 ( Batch Normalization ) (\text{Batch Normalization}) (Batch Normalization)

场景构建

数据集划分为若干个块/批次 ( Batch ) (\text{Batch}) (Batch),其中某一块数据表示为如下形式:
X B a t c h = { x ( 1 ) , x ( 2 ) , ⋯   , x ( N ) } \mathcal X_{Batch} = \{x^{(1)},x^{(2)},\cdots,x^{(N)}\} XBatch={x(1),x(2),,x(N)}
其中 x ( i ) ( i = 1 , 2 , ⋯   , N ) x^{(i)}(i=1,2,\cdots,N) x(i)(i=1,2,,N)表示一个具体样本,并且该样本中包含 p p p随机变量
x ( i ) = ( x 1 ( i ) , x 2 ( i ) , ⋯   , x p ( i ) ) T ⇒ x ( i ) ∈ R p i = 1 , 2 , ⋯   , N x^{(i)} = (x_1^{(i)},x_2^{(i)},\cdots,x_{p}^{(i)})^T \Rightarrow x^{(i)} \in \mathbb R^p \quad i=1,2,\cdots,N x(i)=(x1(i),x2(i),,xp(i))Tx(i)Rpi=1,2,,N
相应地,整个中的样本可表示为矩阵形式
X B a t c h = ( x ( 1 ) , x ( 2 ) , ⋯   , x ( N ) ) T = [ x 1 ( 1 ) , x 2 ( 1 ) , ⋯   , x p ( 1 ) x 1 ( 2 ) , x 2 ( 2 ) , ⋯   , x p ( 2 ) ⋮ x 1 ( N ) , x 2 ( N ) , ⋯   , x p ( N ) ] N × p \mathcal X_{Batch} = (x^{(1)},x^{(2)},\cdots,x^{(N)})^T = \begin{bmatrix} x_1^{(1)},x_2^{(1)},\cdots,x_p^{(1)} \\ x_1^{(2)},x_2^{(2)},\cdots,x_p^{(2)} \\ \vdots \\ x_1^{(N)},x_2^{(N)},\cdots,x_p^{(N)} \\ \end{bmatrix}_{N \times p} XBatch=(x(1),x(2),,x(N))T= x1(1),x2(1),,xp(1)x1(2),x2(2),,xp(2)x1(N),x2(N),,xp(N) N×p
X B a t c h \mathcal X_{Batch} XBatch作为某神经网络模型的输入,在第一个隐藏层中某一神经元权重 W \mathcal W W表示为:
W = ( W 1 , W 2 , ⋯   , W p ) p × 1 T \mathcal W = (\mathcal W_1,\mathcal W_2,\cdots,\mathcal W_p)_{p \times 1}^T W=(W1,W2,,Wp)p×1T
那么该神经元的前馈计算过程表示为如下形式:
这里依然将偏置 b b b忽略掉。
{ Z = X B a t c h W + b Y = σ ( Z ) \begin{cases} \mathcal Z = \mathcal X_{Batch} \mathcal W + b\\ \mathcal Y = \sigma(\mathcal Z) \end{cases} {Z=XBatchW+bY=σ(Z)

梯度信息比例不平衡

为了方便表达,这里假设 p = 2 p=2 p=2。也就是说, X B a t c h \mathcal X_{Batch} XBatch中的样本均为二维样本空间中的点。对应神经元前馈传播过程表示为如下形式:
神经元前馈传播过程
实际上, x 1 , x 2 x_1,x_2 x1,x2不仅仅表示输入层的样本特征,根据梯度消失中的梯度描述,它们还是 Z \mathcal Z Z关于 W 1 , W 2 \mathcal W_1,\mathcal W_2 W1,W2梯度结果:
{ x 1 = ∂ Z ∂ W 1 x 2 = ∂ Z ∂ W 2 \begin{cases} \begin{aligned} x_1 & = \frac{\partial \mathcal Z}{\partial \mathcal W_1} \\ x_2 & = \frac{\partial \mathcal Z}{\partial \mathcal W_2} \end{aligned} \end{cases} x1x2=W1Z=W2Z

如果特征 x 1 , x 2 x_1,x_2 x1,x2的取值范围相差较大,其中 x 1 x_1 x1的范围是 ( 0 , 10 ) (0,10) (0,10) x 2 x_2 x2的范围是 ( 0 , 2 ) (0,2) (0,2),基于最终任务的损失函数 J \mathcal J J,在该神经元上梯度的等高线描述表示如下:
明显 x 1 x_1 x1的取值范围更广,对应梯度 ∂ Z ∂ W 1 \begin{aligned}\frac{\partial \mathcal Z}{\partial \mathcal W_1}\end{aligned} W1Z在关于 J \mathcal J J梯度空间中的方差范围越大。
梯度等高线

其中红色区域表示最优解所在区域。现存在两个随机位置(红色点) r 1 , r 2 r_1,r_2 r1,r2,观察这两个梯度更新过程中的位置的变化情况:
这里以‘梯度下降法’作为示例。

  • r 1 r_1 r1位置距离最优解区域更近,并且该位置附近的等高线更加密集。这意味着 r 1 r_1 r1位置比较陡峭 ( steap ) (\text{steap}) (steap),从而较轻松地将梯度下降到最优解区域。

    但是这种位置并不适合使用较大步长 ( Step ) (\text{Step}) (Step)更新梯度。如果迭代梯度的步长过大,会导致更新位置在低谷中产生震荡现象,最终会导致权重无法取得最优解。因此,针对这种位置,我们更期望:选择较小的学习率 (Learning Rate) \text{(Learning Rate)} (Learning Rate),使其能够达到最优解。

  • 相反地, r 2 r_2 r2位置距离最优解区域较远,并且该位置附近的等高线比较稀疏。着意味着 r 2 r_2 r2位置比较平滑 ( flat ) (\text{flat}) (flat)。相比于 r 1 r_1 r1位置,如果使用较小的学习率更新梯度,它可能很难找到正确的梯度方向,从而花费更长的时间取得最优解。因此,针对这种位置,我们更期望:选择较大的学习率,使其能够快速找到最优解方向。

上述两种情况是矛盾的——我们根本不知道这个随机位置到底随即在哪。也就是说:各分量梯度信息的比例不平衡。如果从调整学习率的角度,我们通过选择一个合适的学习率,在各分量避免产生震荡的基础上,找出一个使损失函数收敛效果优秀的结果。
这种方法麻烦不说,这种‘相对平衡’可能导致上述两种问题都没有得到有效解决。

批标准化对于梯度比例不平衡的处理方式

批标准化是将所有分量强行拉伸至梯度比例平衡的状态。对应图像表示如下:
批标准化——梯度比例强行平衡
此时,任意随机位置 r 1 , r 2 r_1,r_2 r1,r2均以相同代价取得最优解。虽然我们依然需要选择学习率,但不会出现上述的矛盾情况。相比之下,我们可以小幅增加学习率,使其学习效率更高。也就是说:批标准化降低了权重随机初始化位置的敏感度。

ICS \text{ICS} ICS问题描述

ICS \text{ICS} ICS的全称是 Internal Covariate Shift \text{Internal Covariate Shift} Internal Covariate Shift,也称作内部相关变量偏移。该问题是如何产生的 ? ? ?

问题 1 1 1:各层输出特征偏移问题

我们在训练深度神经网络的过程中,随着神经网络层的叠加,我们需要将特征信息逐层向前传递。在反向传播更新梯度的过程中,后叠加的隐藏层在参数更新变化的同时,会导致当前层以及前面隐藏层的特征分布发生变化。 依然以文章开头的神经网络为例:

  • 当执行 t + 1 t+1 t+1次迭代时,最先受到影响的权重参数是 W K + 1 \mathcal W_{\mathcal K + 1} WK+1
    W K + 1 ( t + 1 ) ⇐ W K + 1 ( t ) − η ⋅ ∇ W K + 1 J ( W K + 1 ( t ) ) \mathcal W_{\mathcal K + 1}^{(t+1)} \Leftarrow \mathcal W_{\mathcal K + 1}^{(t)} - \eta \cdot \nabla_{\mathcal W_{\mathcal K + 1}} \mathcal J(\mathcal W_{\mathcal K + 1}^{(t)}) WK+1(t+1)WK+1(t)ηWK+1J(WK+1(t))
  • 随着 W K + 1 ( t ) ⇒ W K + 1 ( t + 1 ) \mathcal W_{\mathcal K+1}^{(t)} \Rightarrow \mathcal W_{\mathcal K+1}^{(t+1)} WK+1(t)WK+1(t+1),对应的 h K h_{\mathcal K} hK也发生相应变化:
    h K ( t ) = ∂ Z K + 1 ( t ) ∂ W K + 1 ( t ) ⇒ h K ( t + 1 ) = ∂ Z K + 1 ( t + 1 ) ∂ W K + 1 ( t + 1 ) \begin{aligned} h_{\mathcal K}^{(t)} = \frac{\partial \mathcal Z_{\mathcal K+1}^{(t)}}{\partial \mathcal W_{\mathcal K+1}^{(t)}} \Rightarrow h_{\mathcal K}^{(t+1)} = \frac{\partial \mathcal Z_{\mathcal K+1}^{(t+1)}}{\partial \mathcal W_{\mathcal K + 1}^{(t+1)}} \end{aligned} hK(t)=WK+1(t)ZK+1(t)hK(t+1)=WK+1(t+1)ZK+1(t+1)
    h K h_{\mathcal K} hK K \mathcal K K个隐藏层的输出特征,那么该特征随着 W K + 1 \mathcal W_{\mathcal K + 1} WK+1的变化发生偏移
  • 同理,随着反向传播的延伸, h K − 1 , h K − 2 , ⋯   , h 1 h_{\mathcal K - 1},h_{\mathcal K - 2},\cdots,h_{1} hK1,hK2,,h1都会发生变化,并且会随着反向传播回溯深度的加深,分布的偏移会愈加剧烈。我们再向前回溯一步,观察 h K − 1 ( t ) ⇒ h K − 1 ( t + 1 ) h_{\mathcal K-1}^{(t)} \Rightarrow h_{\mathcal K-1}^{(t+1)} hK1(t)hK1(t+1)更新过程
    W K ( t + 1 ) ⇐ W K ( t ) − η ⋅ ∇ W K J ( W K ( t ) ) { h K − 1 ( t ) = ∂ Z K + 1 ( t ) ∂ h K ( t ) ⋅ ∂ h K ( t ) ∂ Z K ( t ) ⋅ ∂ Z K ( t ) ∂ W K ( t ) = W K + 1 ( t ) ⋅ σ ′ ( Z K ( t ) ) ⋅ ∂ Z K ( t ) ∂ W K ( t ) h K − 1 ( t + 1 ) = W K + 1 ( t + 1 ) ⋅ σ ′ ( Z K ( t + 1 ) ) ⋅ ∂ Z K ( t + 1 ) ∂ W K ( t + 1 ) \begin{aligned} \mathcal W_{\mathcal K}^{(t+1)} \Leftarrow \mathcal W_{\mathcal K}^{(t)} - \eta \cdot \nabla_{\mathcal W_{\mathcal K}} \mathcal J(\mathcal W_{\mathcal K}^{(t)}) \\ \begin{cases} \begin{aligned} h_{\mathcal K - 1}^{(t)} & = \frac{\partial \mathcal Z_{\mathcal K+1}^{(t)}}{\partial h_{\mathcal K}^{(t)}} \cdot \frac{\partial h_{\mathcal K}^{(t)}}{\partial \mathcal Z_{\mathcal K}^{(t)}} \cdot \frac{\partial \mathcal Z_{\mathcal K}^{(t)}}{\partial \mathcal W_{\mathcal K}^{(t)}} \\ & = \mathcal W_{\mathcal K + 1}^{(t)} \cdot \sigma'(\mathcal Z_{\mathcal K}^{(t)}) \cdot \frac{\partial \mathcal Z_{\mathcal K}^{(t)}}{\partial \mathcal W_{\mathcal K}^{(t)}} \end{aligned} \\ \begin{aligned} h_{\mathcal K-1}^{(t+1)} = \mathcal W_{\mathcal K + 1}^{(t+1)} \cdot \sigma'(\mathcal Z_{\mathcal K}^{(t+1)}) \cdot \frac{\partial \mathcal Z_{\mathcal K}^{(t+1)}}{\partial \mathcal W_{\mathcal K}^{(t+1)}} \end{aligned} \end{cases} \end{aligned} WK(t+1)WK(t)ηWKJ(WK(t)) hK1(t)=hK(t)ZK+1(t)ZK(t)hK(t)WK(t)ZK(t)=WK+1(t)σ(ZK(t))WK(t)ZK(t)hK1(t+1)=WK+1(t+1)σ(ZK(t+1))WK(t+1)ZK(t+1)
    很明显, h K − 1 ( t ) ⇒ h K − 1 ( t + 1 ) h_{\mathcal K-1}^{(t)} \Rightarrow h_{\mathcal K-1}^{(t+1)} hK1(t)hK1(t+1)过程中,不仅包含了 W K ( t ) ⇒ W K ( t + 1 ) \mathcal W_{\mathcal K}^{(t)} \Rightarrow \mathcal W_{\mathcal K}^{(t+1)} WK(t)WK(t+1),而且权重 W K + 1 ( t ) ⇒ W K + 1 ( t + 1 ) \mathcal W_{\mathcal K+1}^{(t)} \Rightarrow \mathcal W_{\mathcal K + 1}^{(t+1)} WK+1(t)WK+1(t+1)的变化也被累积在当前步骤中。至此,随着反向传播的加深,每一层输出特征的变化都会权重变化的累积越来越剧烈
    个人纠误:这里的过程并没有写错,反向传播过程是将'所有权重/可传递梯度的结点'计算完之后,再重新执行前馈计算,从而实现后面迭代过程;而不是更新权重之后马上用于本次迭代。

此时,反向传播执行结束之后,紧接着就是下一次迭代的正向传播过程,此时的输出特征们发生了变化,那么就需要重新调整权重来适应这些变化。最终导致模型学习的性能下降。我们我们需要非常谨慎地设定学习率、初始化权重等等来更新策略

问题 2 2 2:梯度在激活函数的饱和区间问题

随着各层输出特征的偏移,在对这些特征执行激活函数时,更容易使这些特征映射在激活函数的饱和区(见梯度消失—— Sigmoid \text{Sigmoid} Sigmoid),落在饱和区中的点其梯度较小,从而导致梯度消失,模型学习欠拟合的情况。

Batch Normalization \text{Batch Normalization} Batch Normalization处理 ICS \text{ICS} ICS

针对上述重新调整权重导致的学习性能下降的问题,使用批标准化在前馈计算过程中,通过调整分布的均值和方差强行将各层输出分布拉回切合数据的真实分布。

与此同时,将分布拉回标准化后的分布后,样本更多聚集在激活函数(这里的 Sigmoid \text{Sigmoid} Sigmoid)的线性近似区。下图中的蓝色点表示某个隐藏层在学习过程中的输出特征分布;而橙色点表示标准化后的特征分布
BatchNormalization前后的分布变化
根据 Sigmoid \text{Sigmoid} Sigmoid线性近似区的范围,无论哪个维度的特征都聚集在了 Sigmoid \text{Sigmoid} Sigmoid函数的线性近似区中。

Batch Normalization \text{Batch Normalization} Batch Normalization公式描述

我们在降维中介绍过中心化,它本质上是对分布进行平移,从而使分布返回至特征空间原点附近位置(各维度特征均值为 0 0 0的位置):
这里以样本集内的某一样本 x ( i ) x^{(i)} x(i)为例, μ B \mu_{\mathcal B} μB表示 X B a t c h \mathcal X_{Batch} XBatch的均值信息;同理, σ B \sigma_{\mathcal B} σB表示 X B a t c h \mathcal X_{Batch} XBatch的方差信息。
x ( i ) − μ B μ B = 1 N ∑ i = 1 N x ( i ) x^{(i)} - \mu_{\mathcal B} \quad \mu_{\mathcal B} = \frac{1}{N}\sum_{i=1}^N x^{(i)} x(i)μBμB=N1i=1Nx(i)

标准化是在中心化的基础上,除以分布的方差来保证输出分布各维度方差结果是 1 1 1。这种方式使得分布中各分量比例平衡,在后续选择随机位置进行梯度优化过程中,它的优化代价均相同:
这里 x ^ ( i ) \hat x^{(i)} x^(i)表示对应样本 x ( i ) x^{(i)} x(i)标准化后的结果。
σ B ⇐ ϵ + 1 N ∑ i = 1 N ( x ( i ) − μ B ) 2 x ^ ( i ) ⇐ x ( i ) − μ B σ B \begin{aligned} & \sigma_{\mathcal B} \Leftarrow \sqrt{\epsilon + \frac{1}{N} \sum_{i=1}^N (x^{(i)} - \mu_{\mathcal B})^2} \\ & \hat x^{(i)} \Leftarrow \frac{x^{(i)} - \mu_{\mathcal B}}{\sigma_{\mathcal B}} \end{aligned} σBϵ+N1i=1N(x(i)μB)2 x^(i)σBx(i)μB
其中 ϵ \epsilon ϵ是一个超参数,是一个很小的正值。该参数以强制避免遇到 1 N ∑ i = 1 N ( x ( i ) − μ B ) 2 = 0 \begin{aligned}\frac{1}{N} \sum_{i=1}^N(x^{(i)} - \mu_{\mathcal B})^2 = 0\end{aligned} N1i=1N(x(i)μB)2=0时作为分母的 σ B \sigma_{\mathcal B} σB无意义的情况。从逻辑的角度观察,我们不希望 ϵ \epsilon ϵ很大,因为 ϵ \epsilon ϵ被设置的很大意味着人为干预 σ B \sigma_{\mathcal B} σB的部分越大,最终与真实 σ B \sigma_{\mathcal B} σB偏差越大。

并不是说将 x ( i ) ⇒ x ^ ( i ) x^{(i)} \Rightarrow \hat x^{(i)} x(i)x^(i)标准化就万事大吉了,标准化的问题在于:标准化后的结果会降低该单元的神经网络表达能力。也就是说,神经元对该分布进行表达时,其内部的权重与真实模型的权重相比受到约束。因此,我们需要重新对标准化后的分布进行学习,从而降低与真实分布的差距:
y ( i ) ⇐ γ x ^ ( i ) + β y^{(i)} \Leftarrow \gamma \hat x^{(i)} + \beta y(i)γx^(i)+β
其中参数 γ , β \gamma,\beta γ,β可训练的参数,它们在反向传播过程中进行更新。其本质上就是对标准化后的 x ^ ( i ) \hat x^{(i)} x^(i)进行线性变换,通过对 x ^ ( i ) \hat x^{(i)} x^(i)分布的缩放、平移来近似当前迭代步骤的真实分布。

Batch Normalization \text{Batch Normalization} Batch Normalization的测试过程

在测试过程,实际上依然使用上述公式:
{ x ^ ( i ) ⇐ x ( i ) − μ B σ B 2 + ϵ y ( i ) ⇐ γ x ^ ( i ) + β \begin{cases} \begin{aligned}\hat x^{(i)} \Leftarrow \frac{x^{(i)} - \mu_{\mathcal B}}{\sqrt{\sigma_{\mathcal B}^2 + \epsilon}} \end{aligned} \\ y^{(i)} \Leftarrow \gamma \hat x^{(i)} + \beta \end{cases} x^(i)σB2+ϵ x(i)μBy(i)γx^(i)+β
由于批标准化是通过对训练集 X \mathcal X X中采样出若干个 X B a t c h \mathcal X_{Batch} XBatch去计算其均值 μ B \mu_{\mathcal B} μB和方差 σ B \sigma_{\mathcal B} σB。这个采样本身就是不稳定的。
因为 X B a t c h \mathcal X_{Batch} XBatch自身作为 X \mathcal X X的子集,理论上来说,它们的分布应该是相同的。但是由于样本量少,各个 X B a t c h \mathcal X_{Batch} XBatch之间的均值、方差会存在波动。如果在测试集内再次分块,注定使得预测结果同样不稳定。

因此,在测试过程中,直接对整个测试集求解均值和方差:
{ E [ X t e s t ] ⇐ μ B Var [ X t e s t ] ⇐ σ B 2 \begin{cases} \mathbb E[\mathcal X_{test}] \Leftarrow \mu_{\mathcal B} \\ \text{Var}[\mathcal X_{test}] \Leftarrow \sigma_{\mathcal B}^2 \end{cases} {E[Xtest]μBVar[Xtest]σB2
最终,关于测试集批标准化的输出可表示为:
Y t e s t = γ Var [ X t e s t ] + ϵ ⋅ X t e s t + ( β − γ E [ X t e s t ] Var [ X t e s t ] + ϵ ) \mathcal Y_{test} = \frac{\gamma}{\sqrt{\text{Var}[\mathcal X_{test}] + \epsilon}} \cdot \mathcal X_{test} + (\beta - \frac{\gamma \mathbb E[\mathcal X_{test}]}{\sqrt{\text{Var}[\mathcal X_{test}] + \epsilon}}) Ytest=Var[Xtest]+ϵ γXtest+(βVar[Xtest]+ϵ γE[Xtest])

相关参考:
Internal Covariate Shift问题
什么是梯度爆炸/梯度消失?
深入理解—Batch Normalization
深度解析 Batch Normalization \text{Batch Normalization} Batch Normalization(批归一化)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/434700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《抄送列表》:过滤次要文件,优先处理重要文件

目录 一、题目 二、思路 1、查找字符/字符串方法:str1.indexOf( ) 2、字符串截取方法:str1.substring( ) 三、代码 详细注释版: 简化注释版: 一、题目 题目:抄送列表 题目链接:抄送列表 …

Java[集合] Map 和 Set

哈喽,大家好~ 我是保护小周ღ,本期为大家带来的是 Java Map 和 Set 集合详细介绍了两个集合的概念及其常用方法,感兴趣的朋友可以来学习一下。更多精彩敬请期待:保护小周ღ *★,*:.☆( ̄▽ ̄)/$:*.★* ‘ 一、…

JVM知识汇总

1、JVM架构图 2、Java编译器 Java编译器做的事情很简单,其实就是就是将Java的源文件转换为字节码文件。 1. 源文件存储的是高级语言的命令,JVM只认识"机器码"; 2. 因此将源文件转换为字节码文件,即是JVM看得懂的"…

Node.js—Buffer(缓冲器)

文章目录 1、概念2.、特点3、创建Buffer3.1 Buffer.alloc3.2 Buffer.allocUnsafe3.3 Buffer.from 4、操作Buffer4.1 Buffer 与字符串的转化4.2 Buffer 的读写 参考 1、概念 Buffer 是一个类似于数组的对象 ,用于表示固定长度的字节序列。Buffer 本质是一段内存空间…

视觉学习(四) --- 基于yolov5进行数据集制作和模型训练

环境信息 Jetson Xavier NX:Jetpack 4.4.1 Ubuntu:18.04 CUDA: 10.2.89 OpenCV: 4.5.1 cuDNN:8.0.0.180一.yolov5 项目代码整体架构介绍 1. yolov5官网下载地址: GitHub: https://github.com/ultralytics/yolov5/tree/v5.0 2. …

单元测试中的独立运行

单元测试中的独立运行 单元测试是针对代码单元的独立测试。要测试代码单元,首先要其使能够独立运行。项目中的代码具有依赖关系,例如,一个源文件可能直接或间接包含大量头文件,并调用众多其他源文件的代码,抽取其中的一…

论文阅读:Unsupervised Manifold Linearizing and Clustering

Author: Tianjiao Ding, Shengbang Tong, Kwan Ho Ryan Chan, Xili Dai, Yi Ma, Benjamin D. Haeffele Abstract 在本文中,我们建议同时执行聚类并通过最大编码率降低来学习子空间联合表示。 对合成和现实数据集的实验表明,所提出的方法实现了与最先进的…

limit、排序、分组单表查询(三)MySQL数据库(头歌实践教学平台)

文章目的初衷是希望学习笔记分享给更多的伙伴,并无盈利目的,尊重版权,如有侵犯,请官方工作人员联系博主谢谢。 目录 第1关:对查询结果进行排序 任务描述 相关知识 对查询结果排序 指定排序方向 编程要求 第2关&a…

浏览器架构和事件循环

浏览器架构 早期浏览器【单进程多线程】 Page Thread 页面渲染,负责执行js,plugin,drawNetWork Thread 网络请求其余线程 file, storage缺点:只要其中一个线程崩溃,页面就会崩溃。 现代浏览器架构 多进程的浏览器,浏览器的每一个…

几种常见的激活函数

文章目录 常见的激活函数介绍Sigmoid函数ReLU函数LeakyReLU函数Tanh函数Softmax函数总结 常见的激活函数介绍 激活函数是神经网络中的重要组成部分,它决定了神经元的输出。在神经网络的前向传播中,输入数据被传递给神经元,经过加权和和激活函…

Unity自动化打包(1)

一 安装Jenkins https://www.jenkins.io/download/ 官网 1) 使用 brew 安装 2) 安装完成后一般都会遇到问题 我用的是jenkins-lts 稳定版 解决办法 删除掉对应的文件夹 1 rm -rf /usr/local/Homebrew/Library/Taps/homebrew/homebrew-services 2…

kafka延时队列内部应用简介

kafka延时队列_悠然予夏的博客-CSDN博客 两个follower副本都已经拉取到了leader副本的最新位置,此时又向leader副本发送拉取请求,而leader副本并没有新的消息写入,那么此时leader副本该如何处理呢?可以直接返回空的拉取结…

[ 高并发]Java高并发编程系列第二篇--线程同步

并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求,而且也能怎么你在整个项目中的一个处理逻辑的能力体现.那么,你真的知道什么…

ThreadLocal 内存泄露的原因及处理方式

1、ThreadLocal 使用原理 ThreadLocal的主要用途是实现线程间变量的隔离,表面上他们使用的是同一个ThreadLocal, 但是实际上使用的值value却是自己独有的一份。用一图直接表示threadlocal 的使用方式。 从图中我们可以当线程使用threadlocal 时&#xf…

CRC校验原理及其使用

目录 何为CRC 为什么需要校验 为什么是CRC CRC的缺点 目录 何为CRC 为什么需要校验 为什么是CRC CRC的缺点 如何进行CRC校验 校验标准式是什么玩意? 常见的CRC校验 CRC校验计算过程 CRC校验代码参考 代码解读 生成CRC8校验表的代码 CRC检验网站 如何…

GEE:使用 VCT(Vegetation Change Tracker)算法森林进行时序变化检测分析

作者: _养乐多_ 本文将介绍一段 Google Earth Engine 的代码,该代码用于进行时序变化检测分析,即使用 VCT(Vegetation Change Tracker)算法对某一地区的多年影像进行分析,得出每一年的变化程度,并输出一个 VCT 矩阵,同时还可根据矩阵得到每一年的变化遥感图。可以分析…

时下热门话题:ChatGPT能否取代人类?

时下热门话题:ChatGPT能否取代人类? 2022年11月底,人工智能对话聊天机器人ChatGPT推出,迅速在社交媒体上走红,短短5天,注册用户数就超过100万。2023年1月末,ChatGPT的月活用户已突破1亿&#x…

迭代器设计模式(Iterator Design Pattern)[论点:概念、组成角色、相关图示、示例代码、框架中的运用、适用场景]

概念 迭代器设计模式(Iterator Design Pattern)是一种行为型设计模式,它提供了一种方法来顺序访问一个聚合对象(如集合)的元素,而不需要暴露该对象的底层表示。迭代器模式可以帮助我们在不关心底层数据结构…

红酒分类案例中使用分箱处理

红酒分类案例中使用分箱处理 描述 在建立分类模型时,通常需要对连续特征进行离散化(Discretization)处理 ,特征离散化后,模型更加稳定,降低了过拟合风险。离散化也叫分箱(binning),是指把连续的特征值划分为离散的特…

Binder Driver 初探从驱动层角度来看

1:驱动概述 1.1基本简介 Binder 驱动是 Android 专用的,但底层的驱动架构与Linux 驱动一样。binder 驱动在以 misc 设备进行注册,作为虚拟字符设备,没有直接操作硬件,只是对设备内存的处理。主要是驱动设备的初始化(b…