方差和偏差
通过前面的学习,我们已经知道如何设计实验(训练集、验证集的划分)来对学习器的泛化误差进行评估,并且也了解了诸如精度、查准率、查全率及 F1
等性能度量指标。但这不够,我们还希望了解”为什么“具有这样的性能。”偏差-方差分解“(bias-variance decomposition
)是解释学习算法泛化性能的一种重要工具。
假设对于测试样本 x x x,令 y D y_D yD 为 x x x 在训练集中的标记(即标签,可能会存在噪声), y y y 才是 x x x 的真实标记, f ( x ; D ) f(x;D) f(x;D) 为训练集 D D D 上学得模型 f f f 在 x x x 上的预测输出。以回归任务为例,算法的泛化误差计算如下:
E ( f ; D ) = E D [ ( f ( x ; D ) − y D ) 2 ] E(f;D) = \mathbb{E}_{D} [(f(x;D) - y_{D})^2] E(f;D)=ED[(f(x;D)−yD)2]
直接计算上式是不行的,我们得进行分解,分解之前需要先知道方差、偏差、噪声的定义。学习算法的期望预测为
f ˉ ( x ) = E D [ ( f ( x ; D ) ] \bar{f}(x) = \mathbb{E}_{D} [(f(x;D)] fˉ(x)=ED[(f(x;D)]
模型训练集上的期望预测与预测之差的平方的期望值,使用样本数相同的不同训练集产生的方差
为
v a r ( x ) = E D [ ( f ( x ; D ) − E D [ ( f ( x ; D ) ] ) 2 ] = E D [ ( f ˉ ( x ) − f ( x ; D ) ) 2 ] var(x) = \mathbb{E}_{D}[(f(x;D) - \mathbb{E}_{D}[(f(x;D)])^2] = \mathbb{E}_{D}[(\bar{f}(x) - f(x;D))^2] var(x)=ED[(f(x;D)−ED[(f(x;D)])2]=ED[(fˉ(x)−f(x;D))2]
方差在统计描述和概率分布中各有不同的定义,并有不同的公式。
噪声
为
ε 2 = E D [ ( y D − y ) 2 ] \varepsilon^2 = \mathbb{E}_{D}[(y_{D} - y)^2] ε2=ED[(yD−y)2]
模型训练集上的期望预测与真实值的差称为偏差(bias)
,即
b
i
a
s
2
(
x
)
=
(
f
ˉ
(
x
)
−
y
)
2
bias^2(x) = (\bar{f}(x)-y)^2
bias2(x)=(fˉ(x)−y)2
假定噪声为 0
,即
E
D
[
y
D
−
y
]
=
0
\mathbb{E}_{D}[y_{D}-y]=0
ED[yD−y]=0,有了以上定义,通过多项式展开合并,并利用恒等变形、期望的运算性质可将期望泛化误差公式进行分解得到:
公式推理证明,可参考这里。
E ( f ; D ) = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] + ( f ˉ ( x ) − y ) 2 + E D [ ( y D − y ) 2 ] E(f;D) = \mathbb{E}_{D}[(f(x;D)-\bar{f}(x))^2] + (\bar{f}(x)-y)^2 + \mathbb{E}_{D}[(y_{D}-y)^2] E(f;D)=ED[(f(x;D)−fˉ(x))2]+(fˉ(x)−y)2+ED[(yD−y)2]
于是,
E ( f ; D ) = v a r ( x ) + b i a s 2 ( x ) + ε 2 E(f;D) = var(x) + bias^2(x) + \varepsilon^2 E(f;D)=var(x)+bias2(x)+ε2
通过上式,可知泛化误差可分解为方差、偏差与噪声之和。回顾偏差、方差、噪声的定义:
- 偏差:度量了学习到的模型的期望预测与真实结果的偏离程度,刻画了学习
算法本身的拟合能力
。 - 方差:度量了同样大小的训练集的变动导致的学习性能的变化,刻画了数据扰动所造成的影响,或者说刻画了
模型的稳定性和泛化能力
。 - 噪声:表达了当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。
通过对泛化误差进行分解说明,模型泛化性能是由学习算法的能力、数据的充分性以及任务本身的难度所共同决定的。模型欠拟合表现为偏差较大, 此时偏差主导了泛化错误率;模型过拟合表现为偏差小但是方差很大,方差主导了泛化错误率。
一般来说,偏差与方差是有冲突的,这称为偏差-方差窘境(bias-variane dilemma)。
信息论
信息论是应用数学的一个分支,早期备用在无线通信领域。在深度学习中,主要是使用信息论的一些关键思想来描述概率分布或者量化概率分布之间的相似性。
信息论的基本想法是一个不太可能的事件居然发生了,要比一个非常可能的事件发生,能提供更多的信息。
如果我们对于同一个随机变量
x
\textrm{x}
x 有两个单独的概率分布
P
(
x
)
P(x)
P(x) 和
Q
(
x
)
Q(x)
Q(x),则可以用 KL 散度( Kullback-Leibler (KL) divergence
)来衡量这两个概率分布的差异:
KL散度也叫相对熵。
D K L ( P ∥ Q ) = E x ∼ p [ l o g P ( x ) Q ( x ) ] = E x ∼ p [ l o g P ( x ) − l o g Q ( x ) ] D_{KL}(P\parallel Q) = \mathbb{E}_{\textrm{x}\sim p}\begin{bmatrix} log \frac{P(x)}{Q(x)} \end{bmatrix} = \mathbb{E}_{\textrm{x}\sim p}[log P(x) - log Q(x)] DKL(P∥Q)=Ex∼p[logQ(x)P(x)]=Ex∼p[logP(x)−logQ(x)]
上式的写法是在前面所学内容数学期望的基础上给出的,还有一个写法是《机器学习-周志华》书中给出的,更为容易理解:
K L ( P ∥ Q ) = ∫ − ∞ + ∞ p ( x ) l o g p ( x ) q ( x ) d x KL(P\parallel Q) = \int_{-\infty }^{+\infty} p(x)log \frac{p(x)}{q(x)} dx KL(P∥Q)=∫−∞+∞p(x)logq(x)p(x)dx
其中 p ( x ) p(x) p(x) 和 q ( x ) q(x) q(x) 分别为 P P P 和 Q Q Q 的概率密度函数。
这里假设两个分布均为连续型概率分布,对于离散型概率分布,只需要将积分替换为对所有离散值遍历求和。
KL
散度满足非负性和不满足对称性。将上式展开可得:
K
L
(
P
∥
Q
)
=
∫
−
∞
+
∞
p
(
x
)
l
o
g
p
(
x
)
d
x
−
∫
−
∞
+
∞
p
(
x
)
l
o
g
q
(
x
)
d
x
=
−
H
(
P
)
+
H
(
P
,
Q
)
\begin{aligned} KL(P\parallel Q) &= \int_{-\infty }^{+\infty}p(x)logp(x)dx - \int_{-\infty }^{+\infty}p(x) logq(x)dx \\ &= -H(P) + H(P,Q) \end{aligned}
KL(P∥Q)=∫−∞+∞p(x)logp(x)dx−∫−∞+∞p(x)logq(x)dx=−H(P)+H(P,Q)
交叉熵
H
(
P
,
Q
)
=
E
x
∼
p
l
o
g
Q
(
x
)
=
−
∫
−
∞
+
∞
p
(
x
)
l
o
g
q
(
x
)
d
x
\text{交叉熵}\ H(P,Q) = \mathbb{E}_{\textrm{x}\sim p} log Q(x)= - \int_{-\infty }^{+\infty}p(x) logq(x)dx
交叉熵 H(P,Q)=Ex∼plogQ(x)=−∫−∞+∞p(x)logq(x)dx
其中,
H
(
P
)
H(P)
H(P) 为熵(entropy
),
H
(
P
,
Q
)
H(P,Q)
H(P,Q) 为交叉熵(cross entropy
)。最小化 KL
散度其实就是在最小化分布之间的交叉熵。
在信息论中,熵
H
(
P
)
H(P)
H(P) 表示对来自
P
P
P 的随机遍历进行编码所需的最小字节数,而交叉熵
H
(
P
,
Q
)
H(P,Q)
H(P,Q) 表示使用
Q
Q
Q 的编码对来自
P
P
P 的变量进行编码所需的字节数。因此 KL 散度可认为是使用基于
Q
Q
Q 的编码对来自
P
P
P 的变量进行编码所需的“额外字节数”;显然,额外字节数非负,当且仅当
P
=
Q
P=Q
P=Q 时额外字节数为 0
。
批归一化(Batch Normalization)
以前在神经网络训练中,只是对输入层数据进行归一化处理,却没有在中间层进行归一化处理。要知道,虽然我们对输入数据进行了归一化处理,但是输入数据经过 σ ( W X + b ) \sigma(WX+b) σ(WX+b) 这样的矩阵乘法以及非线性运算之后,其数据分布很可能被改变,而随着深度网络的多层运算之后,数据分布的变化将越来越大。如果我们能在网络的中间也进行归一化处理,是否对网络的训练起到改进作用呢?答案是肯定的。
这种在神经网络中间层也进行归一化处理,使训练效果更好的方法,就是批归一化Batch Normalization(BN)。
批归一化(BN)算法的优点
下面我们来说一下BN算法的优点:
- 减少了人为选择参数。在某些情况下可以取消 dropout 和 L2 正则项参数,或者采取更小的 L2 正则项约束参数;
- 减少了对学习率的要求。现在我们可以使用初始很大的学习率或者选择了较小的学习率,算法也能够快速训练收敛;
- 可以不再使用局部响应归一化。BN 本身就是归一化网络(局部响应归一化在 AlexNet 网络中存在)
- 破坏原来的数据分布,一定程度上缓解过拟合(防止每批训练中某一个样本经常被挑选到,文献说这个可以提高 1% 的精度)。
- 减少梯度消失,加快收敛速度,提高训练精度。
批归一化(BN)算法流程
下面给出 BN 算法在训练时的过程
输入:上一层输出结果 X = x 1 , x 2 , . . . , x m X = {x_1, x_2, ..., x_m} X=x1,x2,...,xm,学习参数 γ , β \gamma, \beta γ,β
算法流程:
- 计算上一层输出数据的均值
μ β = 1 m ∑ i = 1 m ( x i ) \mu_{\beta} = \frac{1}{m} \sum_{i=1}^m(x_i) μβ=m1i=1∑m(xi)
其中, m m m 是此次训练样本 batch 的大小。
- 计算上一层输出数据的标准差
σ β 2 = 1 m ∑ i = 1 m ( x i − μ β ) 2 \sigma_{\beta}^2 = \frac{1}{m} \sum_{i=1}^m (x_i - \mu_{\beta})^2 σβ2=m1i=1∑m(xi−μβ)2
- 归一化处理,得到
x ^ i = x i + μ β σ β 2 + ϵ \hat x_i = \frac{x_i + \mu_{\beta}}{\sqrt{\sigma_{\beta}^2} + \epsilon} x^i=σβ2+ϵxi+μβ
其中 ϵ \epsilon ϵ 是为了避免分母为 0 而加进去的接近于 0 的很小值,1e-6左右。
- 重构,对经过上面归一化处理得到的数据进行重构,得到
y i = γ x ^ i + β y_i = \gamma \hat x_i + \beta yi=γx^i+β
其中,
γ
,
β
\gamma, \beta
γ,β 为可学习参数。
γ
,
β
\gamma, \beta
γ,β的维度为数据的通道数,即特征维度的个数,和 batchsize无关。(n,c,w,h)->0,2,3维求平均->(1,c,1,1)
注:上述是 BN 训练时的过程,但是当在预测的过程时,往往只是输入一个样本,没有所谓的均值 μ β \mu_{\beta} μβ 和标准差 σ β 2 \sigma_{\beta}^2 σβ2。此时,均值 μ β \mu_{\beta} μβ 是计算所有 batch μ β \mu_{\beta} μβ 值的平均值得到,标准差 σ β 2 \sigma_{\beta}^2 σβ2 采用每个batch σ β 2 \sigma_{\beta}^2 σβ2 的无偏估计得到。
批归一化和群组归一化比较
名称 | 特点 |
---|---|
批量归一化(Batch Normalization,以下简称 BN) | 可让各种网络并行训练。但是,批量维度进行归一化会带来一些问题——批量统计估算不准确导致批量变小时,BN 的误差会迅速增加。在训练大型网络和将特征转移到计算机视觉任务中(包括检测、分割和视频),内存消耗限制了只能使用小批量的 BN。 |
群组归一化 Group Normalization (简称 GN) | GN 将通道分成组,并在每组内计算归一化的均值和方差。GN 的计算与批量大小无关,并且其准确度在各种批量大小下都很稳定。 |
比较 | 在 ImageNet 上训练的 ResNet-50上,GN 使用批量大小为 2 时的错误率比 BN 的错误率低 10.6% ;当使用典型的批量时,GN 与 BN 相当,并且优于其他标归一化变体。而且,GN 可以自然地从预训练迁移到微调。在进行 COCO 中的目标检测和分割以及 Kinetics 中的视频分类比赛中,GN 可以胜过其竞争对手,表明 GN 可以在各种任务中有效地取代强大的 BN。 |
Weight Normalization和Batch Normalization比较
Weight Normalization 和 Batch Normalization 都属于参数重写(Reparameterization)的方法,只是采用的方式不同。
Weight Normalization 是对网络权值 W W W 进行 normalization,因此也称为 Weight Normalization;Batch Normalization 是对网络某一层输入数据进行 normalization。
Weight Normalization相比Batch Normalization有以下三点优势:
-
Weight Normalization 通过重写深度学习网络的权重W的方式来加速深度学习网络参数收敛,没有引入 minbatch 的依赖,适用于 RNN(LSTM)网络(Batch Normalization 不能直接用于RNN,进行 normalization 操作,原因在于:1) RNN 处理的 Sequence 是变长的;2) RNN 是基于 time step 计算,如果直接使用 Batch Normalization 处理,需要保存每个 time step 下,mini btach 的均值和方差,效率低且占内存)。
-
Batch Normalization 基于一个 mini batch 的数据计算均值和方差,而不是基于整个 Training set 来做,相当于进行梯度计算式引入噪声,有一定的正则化效果。因此,Batch Normalization 不适用于对噪声敏感的强化学习、生成模型(Generative model:GAN,VAE)使用。相反,Weight Normalization 对通过标量 g g g 和向量 v v v 对权重 W W W 进行重写,重写向量 v v v 是固定的,因此,基于 Weight Normalization 的 Normalization 可以看做比 Batch Normalization 引入更少的噪声。
-
不需要额外的存储空间来保存 mini batch 的均值和方差,同时实现 Weight Normalization 时,对深度学习网络进行正向信号传播和反向梯度计算带来的额外计算开销也很小。因此,要比采用 Batch Normalization 进行 normalization 操作时,速度快。 但是 Weight Normalization 不具备 Batch Normalization 把网络每一层的输出 Y 固定在一个变化范围的作用。因此,采用 Weight Normalization 进行 Normalization 时需要特别注意参数初始值的选择。
Batch Normalization在什么时候用比较合适?
在CNN中,BN应作用在非线性映射前。在神经网络训练时遇到收敛速度很慢,或梯度爆炸等无法训练的状况时可以尝试BN来解决。另外,在一般使用情况下也可以加入BN来加快训练速度,提高模型精度。
BN比较适用的场景是:每个mini-batch比较大,数据分布比较接近。在进行训练之前,要做好充分的shuffle,否则效果会差很多。另外,由于BN需要在运行过程中统计每个mini-batch的一阶统计量和二阶统计量,因此不适用于动态的网络结构和RNN网络。