深度学习入门基础CNN系列——批归一化(Batch Normalization)和丢弃法(dropout)
Posted 心无旁骛~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习入门基础CNN系列——批归一化(Batch Normalization)和丢弃法(dropout)相关的知识,希望对你有一定的参考价值。
想要入门深度学习的小伙伴们,可以了解下本博主的其它基础内容:
🏠我的个人主页
🚀深度学习入门基础CNN系列——卷积计算
🌟深度学习入门基础CNN系列——填充(padding)与步幅(stride)
😊深度学习入门基础CNN系列——感受野和多输入通道、多输出通道以及批量操作基本概念
🚀 深度学习入门基础CNN系列——池化(Pooling)和Sigmoid、ReLU激活函数
一、批归一化(Batch Normalization)
批归一化方法(Batch Normalization,BatchNorm)是由Ioffe和Szegedy于2015年提出的,已被广泛应用在深度学习中,其目的是对神经网络中间层的输出进行标准化处理,使得中间层的输出更加稳定。
通常我们会对神经网络的数据进行标准化处理,处理后的样本数据集满足均值为0,方差为1的统计分布,这是因为当输入数据的分布比较固定时,有利于算法的稳定和收敛。对于深度神经网络来说,由于参数是不断更新的,即使输入数据已经做过标准化处理,但是对于比较靠后的那些层,其接收到的输入仍然是剧烈变化的,通常会导致数值不稳定,模型很难收敛。BatchNorm能够使神经网络中间层的输出变得更加稳定,并有如下三个优点:
- 使学习快速进行(能够使用较大的学习率)
- 降低模型对初始值的敏感性
- 从一定程度上抑制过拟合
1. 数据分布和模型的数值稳定性
模型收敛: 需要稳定的数据分布
- 前面M层网络的参数一直在调整学习中,即是输入数据是标准化了,但是中间层M的数值分布却一直在剧烈地变化着。
- 将M到输出层之间的部分看作是一个浅层神经网络,那么对于这个浅层神经网络而言,它观察到的输入数据的分布是不稳定的,那么模型稳定性就会受到影响。
因此为了解决数据分布不稳定的问题,我们可以使用批归一化(Batch Normalization,简称BatchNorm)对中间层的输出做标准化,这样就可以保证在网络学习的过程中,网络层的输出具有稳定的分布。
2. 批归一化BatchNorm——计算过程
-
计算mini-batch内样本的均值
μ B ← 1 m ∑ i = 1 m x ( i ) \\mu_B\\leftarrow \\frac1m\\sum^m_i=1x^(i) μB←m1i=1∑mx(i)
其中 x ( i ) x_(i) x(i)表示mini-batch中的第 i i i个样本。
例如输入mini-batch包含3个样本,每个样本有2个特征,分别是(此处都用向量表示):
x ( 1 ) = ( 1 , 2 ) , x ( 2 ) = ( 3 , 6 ) , x ( 3 ) = ( 5 , 10 ) x^(1)=(1,2),\\ x^(2)=(3,6),\\ x^(3)=(5,10) x(1)=(1,2), x(2)=(3,6), x(3)=(5,10)
对每个特征分别计算mini-batch内样本的均值:
μ B 0 = 1 + 3 + 5 3 = 3 , μ B 1 = 2 + 6 + 10 3 = 6 \\mu_B0=\\frac1+3+53=3,\\ \\mu_B1=\\frac2+6+103=6 μB0=31+3+5=3, μB1=32+6+10=6
则样本均值是:
μ B = ( μ B 0 , μ B 1 ) = ( 3 , 6 ) \\mu_B=(\\mu_B0,\\mu_B1)=(3,6) μB=(μB0,μB1)=(3,6) -
计算mini-batch内样本的方差(方差为样本特征减去均值)
σ B 2 ← 1 m ∑ i = 1 m ( x ( i ) − μ B ) 2 \\sigma^2_B\\leftarrow \\frac1m\\sum^m_i=1(x^(i)-\\mu_B)^2 σB2←m1i=1∑m(x(i)−μB)2
上面的计算公式先计算一个批次内样本的均值 μ B \\mu_B μB和方差 σ B 2 \\sigma^2_B σB2,然后再对输入数据做归一化,将其调整成均值为0,方差为1的分布。对于上述给定的输入数据 x ( 1 ) , x ( 2 ) , x ( 3 ) x^(1),\\ x^(2), \\ x^(3) x(1), x(2), x(3),可以计算出每个特征对应的方差,详细如下:
σ B 0 2 = 1 3 ( ( 1 − 3 ) 2 + ( 3 − 3 ) 2 + ( 5 − 3 ) 2 ) = 8 3 σ B 1 2 = 1 3 ( ( 2 − 6 ) 2 + ( 6 − 6 ) 2 + ( 10 − 6 ) 2 ) = 32 3 \\beginalign \\sigma^2_B0=\\frac13((1-3)^2+(3-3)^2+(5-3)^2)=\\frac83 \\\\ \\sigma^2_B1=\\frac13((2-6)^2+(6-6)^2+(10-6)^2)=\\frac323 \\endalign σB02=31((1−3)2+(3−3)2+(5−3)2)=38σB12=31((2−6)2+(6−6)2+(10−6)2)=332
则样本方差是:
σ B 2 = ( σ B 0 2 , σ B 1 2 ) = ( 8 3 , 32 3 ) \\sigma^2_B=(\\sigma^2_B0,\\sigma^2_B1)=(\\frac83,\\frac323) σB2=(σB02,σB12)=(38,332) -
计算标准化之后的输出
x ^ ( i ) ← x ( i ) − μ B ( σ B 2 + ε ) \\hatx^(i)\\leftarrow \\fracx^(i)-\\mu_B\\sqrt(\\sigma^2_B+\\varepsilon) x^(i)←(σB2+ε)以上是关于深度学习入门基础CNN系列——批归一化(Batch Normalization)和丢弃法(dropout)的主要内容,如果未能解决你的问题,请参考以下文章深度学习:批归一化和层归一化Batch NormalizationLayer Normalization