机器学习笔记之正则化(五)Dropout
机器学习笔记之正则化——Dropout
- 引言
-
- 引子:题目描述(正则化相关)
-
- 正确答案:ABCD\\mathcal A\\mathcal B\\mathcal C\\mathcal DABCD
- 题目解析
- 回顾:集成学习方法:Bagging\\text{Bagging}Bagging
- Dropout\\text{Dropout}Dropout方法
引言
本节将介绍一种应用于深度神经网络的正则化方法——Dropout\\text{Dropout}Dropout方法。
引子:题目描述(正则化相关)
以下关于正则化的描述正确的是(多选)()(\\quad)()
A\\mathcal A \\quadA 正则化可以防止过拟合
BL1\\mathcal B \\quad L_1BL1正则化可以得到稀疏解
CL2\\mathcal C \\quad L_2CL2正则化约束了解空间
DDropout\\mathcal D \\quad \\text{Dropout}DDropout也是一种正则化方法
正确答案:ABCD\\mathcal A\\mathcal B\\mathcal C\\mathcal DABCD
题目解析
关于 A\\mathcal A \\quadA 选项,可以理解为正则化的基本目的。
- 在
《深度学习》(花书) P76 5.2.2 正则化
中给出一个广泛的定义:正则化是指修改学习方法,使其降低泛化误差而非训练误差。 - 在
P71 5.2 容量、过拟合和欠拟合
中关于过拟合的描述为:训练误差和测试误差之间的差距过大。
因此需要使用正则化对泛化误差进行约束,使其与训练误差之间差距不要过大。因此 A\\mathcal A \\quadA 选项正确。
关于 B\\mathcal B \\quadB 选项:
-
从权重空间的角度观察,L1L_1L1正则化所约束的范围与损失函数J(W)\\mathcal J(\\mathcal W)J(W)在权重空间的影响范围,其相切点的位置存在一定概率落在坐标轴上,这意味着另一个坐标的特征信息没有起到作用。从而实现稀疏特征的目的;
详见
正则化——权重衰减角度(直观现象)中的回顾部分。
-
从权重分量惩罚力度的角度观察,L1L_1L1正则化关于权重分量的表示均为一次项,这说明L1L_1L1正则化对于各分量的惩罚力度相同,如果存在某分量没有分配到权重/足够权重,会使得特征分量变得稀疏;
相反,如果是L2L_2L2正则化,它会倾向于分摊权重分量从而使各分量取值尽量平衡,这使得相比于L1L_1L1正则化非零分量的数量更加稠密。
综上,B\\mathcal B \\quadB 选项正确。
关于 C\\mathcal C \\quadC 选项:不仅仅是L2L_2L2正则化,而是Lp(p≥1)L_p(p \\geq 1)Lp(p≥1)正则化都会对解空间进行约束。它们都是通过LpL_pLp范数——特征空间中的点到特征空间原点的距离 进行约束。
只有当p≥1p \\geq 1p≥1时,对应的正则化范围是一个凸集合,L1,L2L_1,L_2L1,L2仅是最具有代表性的凸集合,C\\mathcal C \\quadC 选项正确。
详见:
正则化——拉格朗日乘数法角度中的’常见正则化方法‘。
关于 D\\mathcal D \\quadD 选项,这里介绍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 DD中采样得到相应的新数据集D′∈D\\mathcal D' \\in \\mathcal DD′∈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 中的神经网络示例。
上图中的神经网络明显是一个单隐层网络,其中输入层包含222个神经元(输入特征);隐藏层包含222个神经元;输出层包含111个神经元(输出特征)。
Dropout\\text{Dropout}Dropout方法对神经元的采样操作具体是指:将一些神经元的输出乘以000⇒\\Rightarrow⇒ 有效地删除对应的神经元。
也可以理解为:神经元’失活‘了
⇒\\Rightarrow⇒由于神经元输出结果是
000向量,在
梯度反向传播过程中,该神经元对应获取的梯度为
000.也就是说,本次迭代步骤,该神经元的权重没有发生更新。
需要注意的是,这里所说的神经元不包含’输出层神经元‘.
继续观察上图,如果将输出层神经元Y\\mathcal YY排除掉,一共存在161616种因神经元删除产生的可能性(上图右侧)。
很明显,存在一部分情况(上图中标X的情况)它的计算图都不是连通的,都称不上是神经网络,这些情况自然是不合理的。但如果输入层、隐藏层的神经元数量较多时,计算图不连通的情况是不太可能发生的。
相比于Bagging\\text{Bagging}Bagging方法中的若干个基学习器,Dropout\\text{Dropout}Dropout方法中,我们每一次随机删除若干个神经元,剩余神经元组成的残缺网络(和原始网络相比,这里假设不会出现计算图不连通的情况
)就可以看作是一个基学习器,并且当各层神经元较多的情况下,不太可能出现残缺网络完全相同的情况。
也就是说,每一次迭代过程,我们都会使用一个随机删除神经元所产生的基学习器进行前馈计算,并反向传播梯度。
但这种操作注定是不稳定的(每次迭代相当于一个新的神经网络结构进行前馈运算
)。因此需要使用小批量、产生较小步长(Step)(\\text{Step})(Step)的学习算法。例如:梯度下降法。
随机删除神经元的执行过程
依然以上图神经网络结构为例。对于除去输出层神经元Y\\mathcal YY之外的其他神经元,每一个神经元均分配一个二值掩码:
实际上,可以将每一个二值掩码
μ\\muμ理解为一个
∈{0,1}\\in \\{0,1\\}∈{0,1}的常数,并对该值进行采样:
如果采样结果
μ=0\\mu=0μ=0,那么该掩码对应的神经元会’失活‘(仅限于本次迭代步骤)
相反,如果采样结果
μ=1\\mu=1μ=1,那么掩码对应的神经元保留(保持正常情况)
{x1⇒μx1x2⇒μx2h1⇒μh1h2⇒μh2\\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μ的采样就是一个伯努利分布采样:
- 以ppp的概率采出结果111;
- 以1−p1-p1−p的概率采出结果000。
对比正常网络与含Dropout\\text{Dropout}Dropout网络在前馈计算过程的差异性表示如下:
这里以隐藏层神经元
h1h_1h1为例,
bxb_xbx表示输入层的偏置信息,
f(⋅)f(\\cdot)f(⋅)表示激活函数。
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)\\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)
针对网络结构中神经元的不同位置,采样概率ppp的取值也存在相应变化:
个人理解:输入层实际上并不算神经网络层,因为输入层是样本特征,不接收梯度;并且输入层的神经元’失活‘,意味着本次迭代输入特征丢失了一部分。因而不能丢失输入层特征太多。
- 当神经元位于输入层时,采样概率通常为0.80.80.8;
- 当神经元位于隐藏层时,采样概率通常为0.50.50.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的训练和预测
-
在训练过程中,我们通过采样概率ppp来控制非输出神经元的数量,从而产生基学习器。
但因权重共享的原因,随着迭代次数的增加,各神经元权重都会产生相应的变化,从而使损失函数达到最小。
由于每次迭代过程中,选择的具体神经元是未知的,我们仅知道采样概率ppp。也就是说,某神经元xxx参与本次迭代/随机删除是未知的。
因此,从期望的角度观察,某神经元xxx参与本次迭代的期望值 表示如下:
就是
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 = pE[Bernoulli(p)]=p⋅1+(1−p)⋅0=p
也就是说,需要ppp的概率使神经元xxx参与本次迭代。 -
在测试过程中,由于每一个神经元都会参与运算,也就是说p=1p=1p=1。但用Dropout\\text{Dropout}Dropout方法训练好的参数直接在测试过程中使用是不合理的。
以下是个人理解:
可以将完整的神经网络看做是一个‘稳定的学习器’;被
Dropout\\text{Dropout}Dropout方法产生的‘残缺网络’视作‘不稳定学习器’(丢失信息)。虽然它们权重共享,但是每次迭代对于权重梯度更新的差异是较大的。如果直接用于预测结果,可能导致对于测试样本的预测分布方差较大(不稳定)。
那么针对该情况,因为神经元必须都要参与运算,没有办法再去消除神经元。因此将Bernoulli\\text{Bernoulli}Bernoulli分布的期望值乘到权重上面:
本图来源于下方链接,侵删。
虽然我们可能永远不知道产生最优解(损失函数最小) 那次迭代消除的是哪些神经元,但是乘以Bernoulli\\text{Bernoulli}Bernoulli分布的期望我们可以得到最优预测结果的近似解,并且还能减小样本预测分布的方差。
关于Dropout\\text{Dropout}Dropout这种随机选择神经元,并使其失活的方式进行前馈计算,就是一种稀疏特征的描述。它与L1L_1L1正则化相似,是一种典型的正则化方法。因此 D\\mathcal D \\quadD 选项正确。
相关参考:
深度学习入门(9):Dropout原理【BAT算法工程师主讲,大佬带你一起深度学习】
深度学习(花书)