机器学习笔记之正则化——批标准化[Batch Normalization]
- 引言
- 引子:梯度消失
- 梯度消失的处理方式
- 批标准化 ( Batch Normalization ) (\text{Batch Normalization}) (Batch Normalization)
- 场景构建
- 梯度信息比例不平衡
- 批标准化对于梯度比例不平衡的处理方式
- ICS \text{ICS} ICS问题描述
- Batch Normalization \text{Batch Normalization} Batch Normalization处理 ICS \text{ICS} ICS
- Batch Normalization \text{Batch Normalization} Batch Normalization公式描述
- Batch Normalization \text{Batch Normalization} Batch Normalization的测试过程
引言
本节以梯度消失为引,介绍批标准化 ( 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)=∂W1∂J(W)=∂Y∂J(W)⋅∂ZK+1∂Y⋅∂hK∂ZK+1⋯∂Z2∂h2⋅∂h1∂Z2⋅∂Z1∂h1⋅∂W1∂Z1
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)ThK−1+bK,表示第 K \mathcal K K层网络的线性计算结果。其中:
- ∂ J ( W ) ∂ Y \begin{aligned}\frac{\partial \mathcal J(\mathcal W)}{\partial \mathcal Y}\end{aligned} ∂Y∂J(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+1⇒W的复杂函数;
-
∂
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+1∂Y,⋯,∂Z2∂h2,∂Z1∂h1均是激活函数的导数结果:
随着前馈计算的传递,在样本
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+1⇒W的复杂函数即可。对应地,这些梯度也都是关于
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+1∂Y=σ′(ZK+1),∂Zk∂hk=σ′(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} ∂hK∂ZK+1,∂hK−1∂ZK,⋯,∂h1∂Z2分别等于 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}
∂W1∂Z1=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)=∂Y∂J(W)⋅k=1∏K+1σ′(Zk)⋅k=2∏K+1Wk⋅X
随着梯度下降过程的执行, 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=1∏K+1σ′(Zk)。
如果激活函数
σ
\sigma
σ选择的是
Sigmoid
\text{Sigmoid}
Sigmoid函数,那么会出现什么情况
?
Sigmoid
?\text{ Sigmoid}
? Sigmoid函数及其一阶导函数图像表示如下:
其中蓝色线表示
Sigmoid
\text{Sigmoid}
Sigmoid函数图像;橙色线表示其一阶导函数。可以发现:
- Sigmoid \text{Sigmoid} Sigmoid函数的一阶导函数最大值为 0.25 ≪ 1 0.25 \ll 1 0.25≪1;
- 小于红色线或者大于绿色线范围内的值,其导数结果几乎趋近于
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个部分:
- 线性近似区:该部分函数的梯度效果明显并比较稳定,在反向传播过程中落在该位置的特征存在明显的梯度更新;
- 饱和区:该部分函数梯度存在但梯度变化量较小,在反向传播过程中落在该位置的特征仅存在较小的梯度更新;
- 常数近似区:该部分函数梯度几乎不存在。在反向传播过程中该位置的特征几乎不更新,可看作为神经元失活。
并不是说类似
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
对应函数图像以及一阶导函数图像表示如下:
相比于 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))T⇒x(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=∂W1∂Z=∂W2∂Z
如果特征
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}
∂W1∂Z在关于
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}
hK−1,hK−2,⋯,h1都会发生变化,并且会随着反向传播回溯深度的加深,分布的偏移会愈加剧烈。我们再向前回溯一步,观察
h
K
−
1
(
t
)
⇒
h
K
−
1
(
t
+
1
)
h_{\mathcal K-1}^{(t)} \Rightarrow h_{\mathcal K-1}^{(t+1)}
hK−1(t)⇒hK−1(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))⎩ ⎨ ⎧hK−1(t)=∂hK(t)∂ZK+1(t)⋅∂ZK(t)∂hK(t)⋅∂WK(t)∂ZK(t)=WK+1(t)⋅σ′(ZK(t))⋅∂WK(t)∂ZK(t)hK−1(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)} hK−1(t)⇒hK−1(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)的线性近似区。下图中的蓝色点表示某个隐藏层在学习过程中的输出特征分布;而橙色点表示标准化后的特征分布。
根据
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=1∑Nx(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=1∑N(x(i)−μB)2x^(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=1∑N(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(批归一化)