机器学习笔记之正则化——Dropout
引言
本节将介绍一种应用于深度神经网络的正则化方法—— Dropout \text{Dropout} Dropout方法。
引子:题目描述(正则化相关)
以下关于正则化的描述正确的是(多选) ( ) (\quad) ()
A \mathcal A \quad A 正则化可以防止过拟合
B L 1 \mathcal B \quad L_1 BL1正则化可以得到稀疏解
C L 2 \mathcal C \quad L_2 CL2正则化约束了解空间
D Dropout \mathcal D \quad \text{Dropout} DDropout也是一种正则化方法
正确答案: A B C D \mathcal A\mathcal B\mathcal C\mathcal D ABCD
题目解析
关于 A \mathcal A \quad A 选项,可以理解为正则化的基本目的。
- 在
《深度学习》(花书) P76 5.2.2 正则化
中给出一个广泛的定义:正则化是指修改学习方法,使其降低泛化误差而非训练误差。 - 在
P71 5.2 容量、过拟合和欠拟合
中关于过拟合的描述为:训练误差和测试误差之间的差距过大。
因此需要使用正则化对泛化误差进行约束,使其与训练误差之间差距不要过大。因此 A \mathcal A \quad A 选项正确。
关于 B \mathcal B \quad B 选项:
-
从权重空间的角度观察, L 1 L_1 L1正则化所约束的范围与损失函数 J ( W ) \mathcal J(\mathcal W) J(W)在权重空间的影响范围,其相切点的位置存在一定概率落在坐标轴上,这意味着另一个坐标的特征信息没有起到作用。从而实现稀疏特征的目的;
详见
正则化——权重衰减角度(直观现象)中的回顾部分。
-
从权重分量惩罚力度的角度观察, L 1 L_1 L1正则化关于权重分量的表示均为一次项,这说明 L 1 L_1 L1正则化对于各分量的惩罚力度相同,如果存在某分量没有分配到权重/足够权重,会使得特征分量变得稀疏;
相反,如果是 L 2 L_2 L2正则化,它会倾向于分摊权重分量从而使各分量取值尽量平衡,这使得相比于 L 1 L_1 L1正则化非零分量的数量更加稠密。
综上, B \mathcal B \quad B 选项正确。
关于 C \mathcal C \quad C 选项:不仅仅是 L 2 L_2 L2正则化,而是 L p ( p ≥ 1 ) L_p(p \geq 1) Lp(p≥1)正则化都会对解空间进行约束。它们都是通过 L p L_p Lp范数——特征空间中的点到特征空间原点的距离 进行约束。
只有当
p
≥
1
p \geq 1
p≥1时,对应的正则化范围是一个凸集合,
L
1
,
L
2
L_1,L_2
L1,L2仅是最具有代表性的凸集合,
C
\mathcal C \quad
C 选项正确。
详见:
正则化——拉格朗日乘数法角度中的’常见正则化方法‘。
关于 D \mathcal D \quad D 选项,这里介绍 Dropout \text{Dropout} Dropout方法。
回顾:集成学习方法: Bagging \text{Bagging} Bagging
我们在集成学习部分介绍了 Bagging(Bootstrap Aggrgrating) \text{Bagging(Bootstrap Aggrgrating)} Bagging(Bootstrap Aggrgrating),该算法的核心思路在于:
- 通过自助采样法( Boostrapping Sampling \text{Boostrapping Sampling} Boostrapping Sampling)从原始数据集 D \mathcal D D中采样得到相应的新数据集 D ′ ∈ D \mathcal D' \in \mathcal D D′∈D;
- 针对每个新数据集 D ′ \mathcal D' D′,各使用一个基学习器进行独立训练。
- 最终根据任务输出类型,使用各个基学习器的预测结果对输出结果进行表达:
- 回归任务:求解均值结果;
- 分类任务:多数表决( Majority Voting \text{Majority Voting} Majority Voting)操作,使用少数服从多数替代原始模型对预测结果的一言堂。
这种学习方法能够有效降低模型预测结果的方差。
Dropout \text{Dropout} Dropout方法
深度神经网络中 Bagging \text{Bagging} Bagging的缺陷
如果将 Bagging \text{Bagging} Bagging应用在深度神经网络中,也就是说:若干个新数据集 D ′ \mathcal D' D′,每一个新数据集均使用一个深度神经网络作为基学习器进行学习。
这种方法似乎是不切实际的。因为若干深度神经网络的并行计算需要花费较高的运行时间和内存空间。
Dropout \text{Dropout} Dropout简单描述
Dropout
\text{Dropout}
Dropout方法提供了一种廉价的近似于
Bagging
\text{Bagging}
Bagging的集成方式,只不过采样方式并不是针对训练集的自助采样法,而是针对深层神经网络中各层神经元的采样操作:
这里引用《机器学习》(花书) P160 7.12 Dropout 图 7.6 中的神经网络示例。
上图中的神经网络明显是一个单隐层网络,其中输入层包含
2
2
2个神经元(输入特征);隐藏层包含
2
2
2个神经元;输出层包含
1
1
1个神经元(输出特征)。
Dropout \text{Dropout} Dropout方法对神经元的采样操作具体是指:将一些神经元的输出乘以 0 0 0 ⇒ \Rightarrow ⇒ 有效地删除对应的神经元。
也可以理解为:神经元’失活‘了
⇒ \Rightarrow ⇒由于神经元输出结果是
0 0 0向量,在
梯度反向传播过程中,该神经元对应获取的梯度为
0 0 0.也就是说,本次迭代步骤,该神经元的权重没有发生更新。
需要注意的是,这里所说的神经元不包含’输出层神经元‘.
继续观察上图,如果将输出层神经元 Y \mathcal Y Y排除掉,一共存在 16 16 16种因神经元删除产生的可能性(上图右侧)。
很明显,存在一部分情况(上图中标X的情况)它的计算图都不是连通的,都称不上是神经网络,这些情况自然是不合理的。但如果输入层、隐藏层的神经元数量较多时,计算图不连通的情况是不太可能发生的。
相比于
Bagging
\text{Bagging}
Bagging方法中的若干个基学习器,
Dropout
\text{Dropout}
Dropout方法中,我们每一次随机删除若干个神经元,剩余神经元组成的残缺网络(和原始网络相比,这里假设不会出现计算图不连通的情况
)就可以看作是一个基学习器,并且当各层神经元较多的情况下,不太可能出现残缺网络完全相同的情况。
也就是说,每一次迭代过程,我们都会使用一个随机删除神经元所产生的基学习器进行前馈计算,并反向传播梯度。
但这种操作注定是不稳定的(每次迭代相当于一个新的神经网络结构进行前馈运算
)。因此需要使用小批量、产生较小步长
(
Step
)
(\text{Step})
(Step)的学习算法。例如:梯度下降法。
随机删除神经元的执行过程
依然以上图神经网络结构为例。对于除去输出层神经元
Y
\mathcal Y
Y之外的其他神经元,每一个神经元均分配一个二值掩码:
实际上,可以将每一个二值掩码
μ
\mu
μ理解为一个
∈
{
0
,
1
}
\in \{0,1\}
∈{0,1}的常数,并对该值进行采样:
如果采样结果
μ = 0 \mu=0 μ=0,那么该掩码对应的神经元会’失活‘(仅限于本次迭代步骤)
相反,如果采样结果
μ = 1 \mu=1 μ=1,那么掩码对应的神经元保留(保持正常情况)
{ x 1 ⇒ μ x 1 x 2 ⇒ μ x 2 h 1 ⇒ μ h 1 h 2 ⇒ μ h 2 \begin{cases} x_1 \Rightarrow \mu_{x_1} \\ x_2 \Rightarrow \mu_{x_2} \\ h_1 \Rightarrow \mu_{h_1} \\ h_2 \Rightarrow \mu_{h_2} \\ \end{cases} \quad ⎩ ⎨ ⎧x1⇒μx1x2⇒μx2h1⇒μh1h2⇒μh2
对应加入二值掩码
μ
\mu
μ之后的网络结构可表示为如下形式:
这里引用《深度学习》(花书) P161 7.2 Dropout 图7.7
可以看出,关于二值掩码
μ
\mu
μ的采样就是一个伯努利分布采样:
- 以 p p p的概率采出结果 1 1 1;
- 以 1 − p 1-p 1−p的概率采出结果 0 0 0。
对比正常网络与含
Dropout
\text{Dropout}
Dropout网络在前馈计算过程的差异性表示如下:
这里以隐藏层神经元
h
1
h_1
h1为例,
b
x
b_x
bx表示输入层的偏置信息,
f
(
⋅
)
f(\cdot)
f(⋅)表示激活函数。
Standard Network :
⇒
{
h
1
=
W
x
1
⇒
h
1
T
x
1
+
W
x
2
⇒
h
1
T
x
2
+
b
x
h
1
(
o
u
t
)
=
f
(
h
1
)
Dropout Network :
⇒
{
μ
x
1
∼
Bernoulli
(
p
)
μ
x
2
∼
Bernoulli
(
p
)
x
^
1
=
x
1
∗
μ
x
1
x
^
2
=
x
2
∗
μ
x
2
h
1
=
W
x
^
1
⇒
h
1
T
x
^
1
+
W
x
^
2
⇒
h
1
T
x
^
2
+
b
x
h
1
(
o
u
t
)
=
f
(
h
1
)
\begin{aligned} & \text{Standard Network : } \Rightarrow \begin{cases} h_1 = \mathcal W_{x_1 \Rightarrow h_1}^T x_1 + \mathcal W_{x_2 \Rightarrow h_1}^T x_2 + b_x \\ h_1^{(out)} = f(h_1) \end{cases} \\ & \text{Dropout Network : } \Rightarrow \begin{cases} \mu_{x_1} \sim \text{Bernoulli}(p) \\ \mu_{x_2} \sim \text{Bernoulli}(p) \\ \hat x_1 = x_1 * \mu_{x_1} \\ \hat x_2 = x_2 * \mu_{x_2} \\ h_1 = \mathcal W_{\hat x_1 \Rightarrow h_1}^T \hat x_1 + \mathcal W_{\hat x_2 \Rightarrow h_1}^T \hat x_2 + b_x \\ h_1^{(out)} = f(h_1) \end{cases} \end{aligned}
Standard Network : ⇒{h1=Wx1⇒h1Tx1+Wx2⇒h1Tx2+bxh1(out)=f(h1)Dropout Network : ⇒⎩
⎨
⎧μx1∼Bernoulli(p)μx2∼Bernoulli(p)x^1=x1∗μx1x^2=x2∗μx2h1=Wx^1⇒h1Tx^1+Wx^2⇒h1Tx^2+bxh1(out)=f(h1)
针对网络结构中神经元的不同位置,采样概率
p
p
p的取值也存在相应变化:
个人理解:输入层实际上并不算神经网络层,因为输入层是样本特征,不接收梯度;并且输入层的神经元’失活‘,意味着本次迭代输入特征丢失了一部分。因而不能丢失输入层特征太多。
- 当神经元位于输入层时,采样概率通常为 0.8 0.8 0.8;
- 当神经元位于隐藏层时,采样概率通常为 0.5 0.5 0.5。
参数共享: Dropout VS Bagging \text{Dropout VS Bagging} Dropout VS Bagging
在 Bagging \text{Bagging} Bagging算法的训练过程中,各基学习器之间相互独立。也就是说,各基学习器内部权重参数之间不存在关联关系;
但 Dropout \text{Dropout} Dropout不同。以梯度下降法为例,在每一次算法迭所随机产生的“残缺网络”均是由这些神经元组合而成的,并且这些神经元还自带上一次迭代产生的权重更新结果。也就是说:每一次迭代,产生的残缺网络可能是不同的,但它们的权重信息共享,并传递到后续的迭代过程中。
和 Bagging \text{Bagging} Bagging算法相比, Bagging \text{Bagging} Bagging算法中基学习器的数量是人为设定的,例如随机森林( Random Forest \text{Random Forest} Random Forest)。但是 Dropout \text{Dropout} Dropout方法在随机产生基学习器的时候,一旦深度神经网络确定,那么基学习器的数量(残缺网络的组合方式)是确定的。
但这个数量与神经网络层、神经元的数量之间呈指数级别的关系。也就是说,当神经网络较大的情况下,基学习器虽然有限,但不可能全部采样到。因此,在算法迭代的过程中,我们可能仅执行了一部分残缺网络,但通过参数共享,那些未随机出来,未执行的残缺网络也会存在较好的参数设定。
Dropout \text{Dropout} Dropout的训练和预测
-
在训练过程中,我们通过采样概率 p p p来控制非输出神经元的数量,从而产生基学习器。
但因权重共享的原因,随着迭代次数的增加,各神经元权重都会产生相应的变化,从而使损失函数达到最小。
由于每次迭代过程中,选择的具体神经元是未知的,我们仅知道采样概率 p p p。也就是说,某神经元 x x x参与本次迭代/随机删除是未知的。
因此,从期望的角度观察,某神经元 x x x参与本次迭代的期望值 表示如下:
就是
Bernoulli \text{Bernoulli} Bernoulli分布的期望。
E [ Bernoulli ( p ) ] = p ⋅ 1 + ( 1 − p ) ⋅ 0 = p \mathbb E[\text{Bernoulli}(p)] = p \cdot 1 + (1 - p) \cdot 0 = p E[Bernoulli(p)]=p⋅1+(1−p)⋅0=p
也就是说,需要 p p p的概率使神经元 x x x参与本次迭代。 -
在测试过程中,由于每一个神经元都会参与运算,也就是说 p = 1 p=1 p=1。但用 Dropout \text{Dropout} Dropout方法训练好的参数直接在测试过程中使用是不合理的。
以下是个人理解:
可以将完整的神经网络看做是一个‘稳定的学习器’;被
Dropout \text{Dropout} Dropout方法产生的‘残缺网络’视作‘不稳定学习器’(丢失信息)。虽然它们权重共享,但是每次迭代对于权重梯度更新的差异是较大的。如果直接用于预测结果,可能导致对于测试样本的预测分布方差较大(不稳定)。
那么针对该情况,因为神经元必须都要参与运算,没有办法再去消除神经元。因此将 Bernoulli \text{Bernoulli} Bernoulli分布的期望值乘到权重上面:
本图来源于下方链接,侵删。
虽然我们可能永远不知道产生最优解(损失函数最小) 那次迭代消除的是哪些神经元,但是乘以 Bernoulli \text{Bernoulli} Bernoulli分布的期望我们可以得到最优预测结果的近似解,并且还能减小样本预测分布的方差。
关于 Dropout \text{Dropout} Dropout这种随机选择神经元,并使其失活的方式进行前馈计算,就是一种稀疏特征的描述。它与 L 1 L_1 L1正则化相似,是一种典型的正则化方法。因此 D \mathcal D \quad D 选项正确。
相关参考:
深度学习入门(9):Dropout原理【BAT算法工程师主讲,大佬带你一起深度学习】
深度学习(花书)