飞道的博客

**深度学习 BN 、LeakyReLU算法原理

503人阅读  评论(0)

BN和LeakyReLU

def DarknetConv2D_BN_Leaky(*args, **kwargs):
    # 归一化
    # DarkNet中用到的卷积块,卷积块中包含了归一化和激活函数
    """Darknet Convolution2D followed by BatchNormalization and LeakyReLU."""
    no_bias_kwargs = {'use_bias': False}
    no_bias_kwargs.update(kwargs)
    return compose(
        DarknetConv2D(*args, **no_bias_kwargs),
        BatchNormalization(),
        LeakyReLU(alpha=0.1))

以yolov3中DarkNet网络的这段代码为例,细说网络中的具体结构
该卷积块中包含三个内容:二维卷积操作(DarknetConv2D)、归一化(BatchNormalization)、非线性激活函数(LeakyReLU)。

  • 背景(为什么会提出这种方法)
  • 原理(理解的基础上说明大概步骤)
  • 举例(简单介绍主流的方法)

就以上三个方面对BN的理解

1、BN算法产生的背景

https://blog.csdn.net/qq_37100442/article/details/81776191
https://blog.csdn.net/f110300641/article/details/85099520
做深度学习时,为了加速训练会对数据做预处理,

  • 数据中心化(零均值,数据平移到原点周围)
  • 数据归一化(标准化,数据平移到远点周围,而且数据在每个维度上的尺度是一致的)

1.零均值方法(中心化)
假设对于某个回归问题,输入的数据满足某一种分布规律。分布式不确定的,可能经过很多次迭代才能得到目标结果。而零均值的方法是将原始数据进行平移,使它们的均值为0。也就是数据的分布没变,只是被移动到了原点周围,(中心化)。
原始数据分布如图:

中心化(数据减去均值)后的结果:
数据被移动到了原点周围

还有一种数据预处理的方法
2.标准化,又叫归一化
标准化的计算公式:

数值减去均值,再除以标准差
数据首先进行中心化,(移动到原点周围),然后进行标准化,(数据在不同维度上的尺度是相同的)
原始数据标准化的结果如图所示:

图片来自https://blog.csdn.net/f110300641/article/details/85099520

进行预处理后的数据比原始数据更得到理想的结果。大大提高了我们的训练速度。因此,在训练开始前,对数据进行零均值是一个必要的操作。

但是,网络的深度影响数据的分布情况,网络的每一层都需要重新适应新的分布,需要降低学习率来降低影响。
那标准化操作呢?中心化操作之后再除以标准差,在不同维度上具有相同尺度的数据分布啊。

标准化基本满足了数据的0均值、单位方差、弱相关性。但是在实际的计算中,标准化过程需要计算协方差矩阵、求逆等操作,计算量大大增加,另外,在反向传播时,标准化操作不一定可微。

总而言之,中心化能够在不该变数据分布的前提下将数据平移到远点周围,以达到快速收敛加快训练速度的效果,但是在深度学习网络中,不同网络层的数据分布是不相同的,这需要在每一层网络中都进行一次中心化操作以适应当前的数据分布。

标准化操作在中心化操作的基础上,将数据再除以标准差,得到去量纲的数据分布,数据在不同维度上的尺度是相同的(以二维的数据分布为例,x轴y轴的贡献率是相同的),但是标准化操作计算量太大

在这个背景下出现了BN算法

2.BN算法的实现

神经网络的训练过程,采用batch梯度下降的方法。
对于标准化数据,均值是指对一个batch的数据计算每个神经元输入数据的平均值;标准差是指对一个batch的数据计算每个神经元输入数据的标准差。
在深度神经网络中,标准化操作时,强制转化将破坏数据的分布,所以需要对公式的鲁棒性进行优化。
scale and shift(变换重构)的概念是在数据标准化的基础上,增加了两个参数γβ,每一个神经元都有这两个参数,在训练的过程中不断改变这两个参数βγ,得到适合当前网络的BN

引入γ和β作用是使数据可能还原到最初的输入(β和γ满足以下条件:)

BN的前向传导公式:

分别表示:
一个batch中,所有神经元输入数据的均值;
一个batch中,所有神经元输入数据的方差;
一个batch中,所有神经元输入数据标准化后的结果;
一个batch中,BN计算公式。

BN在网络中的作用
1、加快训练速度,能够增大学习率,即使小的学习率也能够有快速的学习速率;
2、采用BN算法可以省去dropout、正则化或者只需要很小的L2正则化约束。因为,BN算法后,参数进行了归一化,原本经过激活函数没有太大影响的神经元,分布变得明显,经过一个激活函数以后,神经元会自动削弱或者去除一些神经元,就不用再对其进行dropout。另外就是L2正则化,由于每次训练都进行了归一化,就很少发生由于数据分布不同导致的参数变动过大,带来的参数不断增大。
3、 打乱数据集,防止训练发生偏移。

3.主流的规范化方法

https://blog.csdn.net/weixin_34414650/article/details/94529982
为什么要在深度学习网络中加入归一化操作:这是因为训练深度神经网络会收敛很慢,很有可能发生梯度弥散或者梯度爆炸。用了Normalization可以训练得很快,学习更好。

深度学习四种主流的规范化, 分别是
Batch Normalization(BN[9]);
Layer Normalization(LN[7]);
Instance Normalization(IN[8]);
Group Normalization(GN[2])。

这四种normalization的示意图:

激活函数

  • 背景(为什么会提出这种方法)
  • 原理(理解的基础上说明大概步骤)
  • 举例(简单介绍主流的方法)

在深度学习网络中,模拟人脑处理信息的方式,利用神经网络的方法来处理复杂的例如语音,图像等信息。信息经过网络中的神经元进行传播。但是如果网络中每一层的输入和输出都是简单的线性关系,即使再深的网络,其输出都可以等效成输入在乘以一个线性变换矩阵,显然复杂的图像处理任务并不能只是进行简单的线性变换,于是就需要引入激活函数
加入了激活函数的神经网络可以拟合输入数据到输出数据的复杂函数。

最常见的激活函数类型

https://blog.csdn.net/htt789/article/details/80235908
https://blog.csdn.net/zouzhen_id/article/details/79701002
https://www.cnblogs.com/itmorn/p/11132494.html
1.Sigmoid函数或者Logistic函数
2.Tanh - Hyperbolic tangent(双曲正切函数)
3.ReLu - Rectified linear units(线性修正单元)

1.sigmoid激活函数

sigmoid激活函数的表达式:

sigmoid激活函数的曲线是s形的,它将输出值限制在0-1之间。(分类问题的输出、YOLOv3网络中在先验框中对调整参数的输出使用的是sigmoid激活函数)

sigmoid激活函数的优点:

  • x>0 时,梯度恒为1,无梯度耗散问题,收敛快;
  • 当输入值小于某一值的时候,激活函数的输出为0,增大了网络的稀疏性。稀疏性越大提取出的特征就越具有代表性,模型就具有越强的泛化能力。
    ∙ 计算很小,训练时间少;

sigmoid函数导数的图像:

但是由于网络反向传播过程的链式求导规则,权重初始值通常使用一个高斯分布所以|w|<1,所以 wjσ′(zj)<0.25 ,根据链式法则计算梯度越来越小。
sigmoid激活函数的缺点: 容易产生梯度消失现象

2.Tanh 双曲线正切激活函数

Tanh函数将输出规定在[-1, 1]范围内,以0为中心。
Tanh函数的表达式;

Tanh函数的图像如图:

Tanh函数的导数图像:

Tanh函数再Sigmoid函数的基础上建输出限制在了-1至1,更利于训练,但是Tanh函数同样存在梯度消失的问题。

3.ReLU

ReLU通常指代以斜坡函数及其变种为代表的非线性函数。

ReLU激活函数及其导数表达式:



ReLU对于所有小于0的神经元,输出都是0,导致很多神经元在后面的网络中也不能被激活(die),所以说ReLU在网络上训练过程中是很脆弱的。

3’. Leaky ReLU




LeakyReLU用来解决ReLU神经元die的问题,输入小于0的部分不再等于0,而是变成了一个斜率大于0 的斜坡函数。

ReLU激活函数在一定程度上解决了梯度消失的问题。


感谢:
https://blog.csdn.net/qq_37100442/article/details/81776191
https://blog.csdn.net/f110300641/article/details/85099520
https://blog.csdn.net/weixin_34414650/article/details/94529982
https://blog.csdn.net/htt789/article/details/80235908
https://blog.csdn.net/zouzhen_id/article/details/79701002
https://www.cnblogs.com/itmorn/p/11132494.html


转载:https://blog.csdn.net/weixin_43227526/article/details/106173601
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场