目录
- 摘要
- Abstract
- [1. 噪声鲁棒性](#1. 噪声鲁棒性)
- [2. 半监督学习](#2. 半监督学习)
- [3. Dropout](#3. Dropout)
-
- [3.1 子网络集成](#3.1 子网络集成)
- [3.2 训练过程](#3.2 训练过程)
- [3.3 预测过程](#3.3 预测过程)
- [3.4 实践中Dropout的使用](#3.4 实践中Dropout的使用)
- [4. Batch Normalization](#4. Batch Normalization)
-
- [4.1 协变量偏移和内部协变量偏移](#4.1 协变量偏移和内部协变量偏移)
- [4.2 训练过程](#4.2 训练过程)
- [4.3 测试过程](#4.3 测试过程)
- [4.4 实践中Batch Normalization的使用](#4.4 实践中Batch Normalization的使用)
- [5. Layer Normalization](#5. Layer Normalization)
- 参考
- 总结
摘要
本周,我学习了Dropout,BatchNormalization,LayerNormalization。
Abstract
This week, I learned Dropout, BatchNormalization, LayerNormalization.
1. 噪声鲁棒性
噪声鲁棒性是指模型在面对数据噪声时,能够稳定地做出合理预测的能力。噪声通常指的是输入数据中的随机错误或无关信息,它可能来自于多个来源,如传感器误差、标签错误、环境干扰等。在机器学习中,噪声对模型的影响非常大,尤其是在模型过拟合噪声数据时,可能会导致模型泛化能力差。
一个具有良好噪声鲁棒性的模型不仅能对训练数据作出合理预测,还能在面对未知的、带有噪声的测试数据时,依然能够做出稳定的预测。例如,在训练过程中对输入数据或神经网络的隐藏层添加噪声,或在模型的损失函数中加入正则化项来降低对噪声的依赖。这样,模型训练过程中不容易受噪声的干扰,最终能够在测试时表现出更强的泛化能力。
2. 半监督学习
半监督学习通过使用大量未标注数据,能够帮助模型捕捉到更多的数据分布信息,减少对标注数据的过拟合。未标注数据通常包含数据的总体结构信息,虽然没有标签,但它们在一定程度上揭示了数据的潜在分布模式。通过引入这些未标注数据,模型可以学习到更多关于数据结构的知识,从而在标注数据上避免过拟合。
半监督学习中的许多方法依赖于自监督学习,这些方法能够利用未标注数据的内在结构进行训练。例如,在生成对抗网络(GAN)或自编码器的训练过程中,未标注数据可以用来学习数据的潜在表示。通过自监督学习,模型不仅能够利用标注数据进行监督学习,还能通过学习数据的内在结构和特征来提升其对未见数据的适应性。这种方式帮助模型在训练过程中引入了更多的约束,进而促进了模型的正则化。
3. Dropout
3.1 子网络集成
Dropout提供了一种廉价的Bagging集成近似,能够训练和评估指数级数量的神经网络。Dropout训练的集成包括所有从基础网络中除去非输出单元后的子网络,下面举个例子来理解。
假设一个神经网络有2个神经元的输入层,下面接着一个2个神经元的隐藏层,最后接着一个1个神经元的输出层,如下图中的基础网络所示,右边是它在Dropout作用下可能产生的一系列子网络集成。
3.2 训练过程
Dropout通过对某个神经元的结果乘0来达到消除一个神经元的效果。Dropout会根据丢弃概率 p p p随机生成一个符合伯努利的掩码向量 μ ⃗ \vec{\mu} μ (这个向量是一个二值向量),形状等于该层输出的形状,一般输入的丢弃概率设置为0.2,隐藏层的丢弃概率设置为0.5。
这里仍以上面的基础网络为例。下面给出该神经网络中参数的值。
符号 | 含义 | 值 |
---|---|---|
μ 1 \mu_1 μ1 | 输入层的掩码向量 | [ μ x 1 , μ x 2 ] [\mu_{x_1},\mu_{x_2}] [μx1,μx2] |
μ 2 \mu_2 μ2 | 隐藏层的掩码向量 | [ μ h 1 , μ h 2 ] [\mu_{h_1},\mu_{h_2}] [μh1,μh2] |
W 1 W_1 W1 | 隐藏层的权重 | [ h 11 h 12 h 21 h 22 ] \begin{bmatrix}h_{11}&h_{12}\\h_{21}&h_{22}\end{bmatrix} [h11h21h12h22] |
b 1 b_1 b1 | 隐藏层的偏置 | - |
W 2 W_2 W2 | 输出层的权重 | [ c 11 c 21 ] \begin{bmatrix}c_{11}\\c_{21}\end{bmatrix} [c11c21] |
b 2 b_2 b2 | 输出层的偏置 | - |
x x x | 输入 | [ x 1 , x 2 ] [x_1,x_2] [x1,x2] |
f f f | 激活函数 | - |
最终输出 y = f [ ( f [ ( x ⊙ μ 1 ) W ⊕ b 1 ] ⊙ μ 2 ) W 2 ⊕ b 2 ] y=f[(f[(x\odot \mu_1)W\oplus b_1]\odot\mu_2)W_2\oplus b_2] y=f[(f[(x⊙μ1)W⊕b1]⊙μ2)W2⊕b2],其中 ⊙ \odot ⊙为逐元素相乘, ⊕ \oplus ⊕为逐元素相加。
Dropout训练与Bagging训练不一样,不同之处为:
1.Bagging训练中所有模型都是独立的,而Dropout训练中所有模型共享参数,其中每个模型集成父神经网络参数的不同子集。
2.Bagging训练中所有模型都在其训练集上训练到收敛,而Dropout 训练不是在独立的子网络上训练的,而是对同一个神经网络应用不同的随机掩码。每次前向传播时,丢弃的神经元不同,会根据随机丢弃的神经元选择不同的子网络进行训练(由于参数共享,没被选择的子网络也能得到很好的参数)。
两者的相同之处为它们为不同模型选择的训练集都是有放回采样的原始训练集的子集。
3.3 预测过程
在 Dropout 中,训练和预测阶段的行为有所不同,特别是在权重的处理上。为了保持一致性,Dropout 在预测阶段会调整每个神经元的输出,这涉及到权重比例推断规则。
在训练阶段,由于 Dropout 随机丢弃部分神经元,这使得网络每次前向传播时都有不同的子网络。为了确保训练阶段和预测阶段的输出一致,在预测阶段,网络的每个神经元的输出需要进行缩放。
训练阶段,神经元的丢弃概率为 p p p,那么神经元保留的概率为 1 − p 1-p 1−p,输出 x x x经过Dropout得到的输出为 ( 1 − p ) x (1-p)x (1−p)x,预测阶段,由于Dropout弃用,所有的神经元得到保留,不进行缩放的原输出为 ( 1 − p ) x (1-p)x (1−p)x,因此需要乘以 1 1 − p \displaystyle \frac{1}{1-p} 1−p1来恢复输出。
3.4 实践中Dropout的使用
1.Dropout一般应用在中间的隐藏层。如果对输入层应用 Dropout,会导致一些输入特征被丢弃,这可能会对网络的训练和信息的传递产生不利影响,因此Dropout一般不用于输入层。输出层需要稳定、准确的输出,因此Dropout一般不用于输出层。
2.Dropout一般在激活函数后面使用,因为Dropout应用在激活函数后,是为了丢弃激活后的特征表示,保留网络学习到的非线性变换的特征;激活后的输出比线性组合的输出更能反映出网络学习到的复杂模式,应用 Dropout 可以有效防止过拟合;可以保证丢弃的是经过激活函数的非线性特征,而不是简单的线性组合,有助于网络更好地泛化。
4. Batch Normalization
Batch Normalization缓解了内部协变量偏移,但不能完全解决协变量偏移。此外,Batch Normalization通过归一化减少了模型对参数初始化的依赖性,使模型能快速收敛。
4.1 协变量偏移和内部协变量偏移
协变量偏移指的是训练集和测试集的分布不同,但是特征与标签的关系没变。
内部协变量偏移指的是在训练过程中,由于前一层神经元的参数更新导致其输出分布发生变化,从而影响后续层的输入分布。后续层需要不断适应这种变化,可能导致训练过程变得缓慢和不稳定。
4.2 训练过程
在训练阶段,Batch Normalization使用当前批次的均值和方差来进行归一化操作。每个批次的数据具有不同的均值和方差,因此每次前向传播时都会重新计算这些统计量。
训练过程(下面的运算都是逐元素的):
1.对于每个小批量 B = [ x 1 , x 2 , ⋯ , x m ] T B=[x_1, x_2, \cdots, x_m]^T B=[x1,x2,⋯,xm]T(其中 x i x_i xi是一个训练样本的激活值),对于每个小批量计算均值 μ B = 1 m ∑ i = 1 m x i \displaystyle\mu_B=\frac{1}{m}\sum_{i=1}^mx_i μB=m1i=1∑mxi和方差 σ B 2 = 1 m ∑ i = 1 m ( x i − μ B ) 2 \displaystyle\sigma_B^2=\frac{1}{m}\sum_{i=1}^m(x_i-\mu_B)^2 σB2=m1i=1∑m(xi−μB)2。
补充:在卷积神经网络中,计算均值 μ C = 1 m H W ∑ i = 1 m ∑ h = 1 H ∑ w W x i , c , h , w \displaystyle\mu_C=\frac{1}{mHW}\sum_{i=1}^m \sum_{h=1}^H \sum_{w}^Wx_{i,c,h,w} μC=mHW1i=1∑mh=1∑Hw∑Wxi,c,h,w,方差 σ C 2 = 1 m H W ∑ i = 1 m ∑ h = 1 H ∑ w = 1 W ( x i , c , h , w − μ C ) 2 \displaystyle\sigma_C^2=\frac{1}{mHW}\sum_{i=1}^m \sum_{h=1}^H \sum_{w=1}^W(x_{i,c,h,w}-\mu_C)^2 σC2=mHW1i=1∑mh=1∑Hw=1∑W(xi,c,h,w−μC)2。
2.使用该批次的均值和方差对数据 x i x_i xi进行归一化, x ^ i = x i − μ B σ B 2 + ϵ \displaystyle\hat{x}_i=\frac{x_i-\mu_B}{\sqrt{\sigma_B^2+\epsilon}} x^i=σB2+ϵ xi−μB(其中 ϵ \epsilon ϵ是一个很小的常数,防止除零以保证数值的稳定性),以确保处理后的数据的分布服从零均值和单位方差。
3.归一化后的数据 x ^ i \hat{x}_i x^i通过缩放因子 γ \gamma γ和偏移因子 β \beta β(这两个因子可学习,因子的形状等于特征数量)进行变换,得到变换后的值 y i = γ x ^ i + β y_i=\gamma \hat{x}_i+\beta yi=γx^i+β。这样便可以通过调整激活值的分布来提升模型的表达能力。
4.根据该批次的均值和方差计算全局均值的滑动平均 μ g l o b a l = α μ g l o b a l + ( 1 − α ) μ B \mu_{global}=\alpha\mu_{global}+(1-\alpha)\mu_B μglobal=αμglobal+(1−α)μB和全局方差的滑动平均 σ g l o b a l 2 = α σ g l o b a l 2 + ( 1 − α ) σ B 2 \sigma_{global}^2=\alpha\sigma_{global}^2+(1-\alpha)\sigma_B^2 σglobal2=ασglobal2+(1−α)σB2( μ g l o b a l \mu_{global} μglobal的初值为0, σ g l o b a l 2 \sigma_{global}^2 σglobal2的初值为1),为预测阶段提供稳定的全局均值和方差。
4.3 测试过程
在预测阶段,Batch Normalization不再使用当前批次的均值和方差,因为预测阶段往往批次大小很小(甚至是单个样本),这会导致批次统计量非常不稳定。因此,在预测阶段Batch Normalization使用在训练阶段积累的滑动平均的均值和方差,而不是当前批次的统计量。
预测阶段,一个样本的激活值 x i x_i xi经过Batch Normalization得到的结果为 x ^ i = x i − μ g l o b a l σ g l o b a l 2 + ϵ \hat{x}i=\displaystyle\frac{x_i-\mu{global}}{\sqrt{\sigma_{global}^2+\epsilon}} x^i=σglobal2+ϵ xi−μglobal。
4.4 实践中Batch Normalization的使用
Batch Normalization一般用于全连接神经网络和卷积神经网络,而循环神经网络更推荐使用下面的Layer Normalization。
Batch Normalization一般用在激活函数的后面。
5. Layer Normalization
Layer Normalization是对每个样本的特征进行归一化,而不是在批次维度上进行归一化。Layer Normalization在训练阶段和预测阶段的行为是一致的。
计算过程:
1.对于每个小批量 B = [ x 1 , x 2 , ⋯ , x d ] = [ X 1 , X 2 , ⋯ , X m ] T B=[x_1,x_2,\cdots,x_d]=[X_1,X_2,\cdots,X_m]^T B=[x1,x2,⋯,xd]=[X1,X2,⋯,Xm]T( d d d是特征数量, x i x_i xi是第 i i i个特征对应的一系列值, m m m是批次大小, X i X_i Xi是第i个训练样本的激活值),计算均值 μ B = 1 d ∑ i = 1 d x i \displaystyle\mu_B=\frac{1}{d}\sum_{i=1}^dx_i μB=d1i=1∑dxi和方差 σ B 2 = 1 d ∑ i = 1 d ( x i − μ B ) 2 \displaystyle\sigma_B^2=\frac{1}{d}\sum_{i=1}^d(x_i-\mu_B)^2 σB2=d1i=1∑d(xi−μB)2。
2.使用均值和方差对数据 x i x_i xi进行归一化, x ^ i = x i − μ B σ B 2 + ϵ \displaystyle\hat{x}_i=\frac{x_i-\mu_B}{\sqrt{\sigma_B^2+\epsilon}} x^i=σB2+ϵ xi−μB(其中 ϵ \epsilon ϵ是一个很小的常数,防止除零以保证数值的稳定性)。
3.归一化后的数据 X ^ i \hat{X}_i X^i通过缩放因子 γ \gamma γ和偏移因子 β \beta β(这两个因子可学习,因子的形状等于特征数量)进行变换,得到变换后的值 y i = γ X ^ i + β y_i=\gamma \hat{X}_i+\beta yi=γX^i+β。这样便可以通过调整激活值的分布来提升模型的表达能力。
Layer Normalization对每个时间步独立归一化,可以适应变长的输入序列;能避免批次间的依赖,尤其对于动态变化的序列,能够处理每个样本的特征分布;能稳定训练,缓解长序列任务中的梯度消失和梯度爆炸问题,因此Layer Normalization非常适合处理序列任务。
参考
[美]伊恩·古德费洛(lan Goodfellow)[加]约书亚·本吉奥(Yoshua Bengio)[加]亚伦·库维尔(Aaron Courville) 深度学习(中文翻译版)
Sergey Ioffe, Christian Szegedy. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift.
Jimmy Lei Ba, Jamie Ryan Kiros, Geoffrey E. Hinton. Layer Normalization.
总结
本周,我学习了Dropout,BatchNormalization,LayerNormalization。
下周,我将学习神经网络的优化方法。