[转载] ReLU和BN层简析

来源:https://blog.csdn.net/huang_nansen/article/details/86619108

卷积神经网络中,若不采用非线性激活,会导致神经网络只能拟合线性可分的数据,因此通常会在卷积操作后,添加非线性激活单元,其中包括logistic-sigmoid、tanh-sigmoid、ReLU等。

sigmoid激活函数应用于深度神经网络中,存在一定的局限性,当数据落在左右饱和区间时,会导致导数接近0,在卷积神经网络反向传播中,每层都需要乘上激活函数的导数,由于导数太小,这样经过几次传播后,靠前的网络层中的权重很难得到很好的更新,这就是常见的梯度消失问题。这也是ReLU被使用于深度神经网络中的一个重要原因。

  1. Dead ReLU
    若数据落在负区间中,ReLU的结果为0,导数也是0,就会导致反向传播无法将误差传递到这个神经元上,这会导致该神经元永远不会被激活,导致Dead ReLU问题。

解决方法:

1)Leraning Rate
导致Dead ReLU问题的其中一个潜在因素为Learning Rate太大,假设在某次更新中,误差非常大,这时候若LR也很大,会导致权重参数更新后,神经元的数据变化剧烈,若该层中多数神经元的输出向负区间偏向很大,导致了大部分权重无法更新,会陷入Dead ReLU问题中。

当然,小learning rate也是有可能会导致Dead ReLU问题的,于是出现了Leaky ReLU和PReLU。

2)Leaky ReLU
普通的ReLU为:

Leaky ReLU为:

其中取一个很小的数,作者的默认值为0.01,这样可以保证输出小于0的神经元也会进行很小幅度的更新。

3)PReLU
PReLU是Leaky ReLU的进一步优化版,公式表达为:

其中是一个可以学习的参数,更新是反向传播使用的是momentum来更新,更新方式如下:

其中为动量,为学习率。文章中初始化为0.25,且不添加正则化,因为很有可能会很大可能被置0,变成ReLU。

  1. Batch Normalization
    在SegNet网络简析的博文中,我提到过BN层的基本操作和作用。

BN层的出现,主要是为了解决机器学习IID问题,即训练集和测试集保持独立同分布。如果输入的分布不能保持稳定,那么训练就会很难收敛,而在图像处理领域的白化处理,即将输入数据转换为以0为均值,1为方差的正态分布。这样能够让神经网络更快更好的收敛,而这就是BN层所要做的。

“深度神经网络之所以收敛慢,是由于输入的分布逐渐向非线性函数的两端靠拢”,而BN层的作用,就是将输入的分布,拉回到均值为0,方差为1的正态分布上,这样就使输入激活函数的值,在反向传播史能够产生更明显的梯度,更容易收敛,避免了梯度消失的问题。之所以能够在反向传播时产生更明显的变化,我们将输入分布变为标准正态分布后,输入的值靠近中心的概率会变大,若我们的激活函数为sigmoid函数,那么即使输入存在微小的变化,也能够在反向传播时产生很明显的变化。

每层神经网络在线性激活后,通过如下公式进行转换,这个转换就是BN层的操作。

公式中的x是经过该层线性变换后的值,即x = wu+b,u为上一层神经层的输出。

通过这个操作,将输入非线性激活函数的输入值,尽量拉伸到变化较大的区域,即激活函数中间区域。这样能够增大激活函数的导数值,使收敛更快速。而这样也会引入一个问题,强行变换分布后,会导致部分特征无法学习到,因此引入了另一种操作Scale,操作如下:

mean和variance是不会进行学习的,而gamma和beta两个参数是可以通过反向传播学习的,通过这两个参数对数据进行扩大和平移,恢复部分特征的分布。

BN层的主要功能总结为两点:

1)归一化scale

没有BN层时,若LR设置较大,在配合ReLU激活函数时,容易出现Dead ReLU问题。

2)数据初始化集中,缓解overfitting(这里还理解得不是很透彻)

Overfitting主要发生在一些较远的便捷点,BN操作可以使初始化数据在数据内部。

通常提到BN层,我们会想到,若使用sigmoid激活函数时,它可以将数据归一化到梯度较大的区域,便于梯度更新。

但很少有人提到BN层和ReLU的联系,https://blog.csdn.net/wfei101/article/details/79997708这篇转载文章中有提到

在BN中的gamma对于ReLU的影响很小,因为数值的收缩,不会影响是否大于0。但是如果没有偏移量beta,就会出现数据分布在以0为中心的位置,强行将一半的神经元输出置零。因此偏移量beta是必不可少的。

另外一篇文章中也提到了BN层的一个作用:

来源:https://blog.csdn.net/xys430381_1/article/details/85141702

首先来说归一化的问题,神经网络训练开始前,都要对数据做一个归一化处理,归一化有很多好处,原因是网络学习的过程的本质就是学习数据分布,一旦训练数据和测试数据的分布不同,那么网络的泛化能力就会大大降低,另外一方面,每一批次的数据分布如果不相同的话,那么网络就要在每次迭代的时候都去适应不同的分布,这样会大大降低网络的训练速度,这也就是为什么要对数据做一个归一化预处理的原因。另外对图片进行归一化处理还可以处理光照,对比度等影响。
网络一旦训练起来,参数就要发生更新,出了输入层的数据外,其它层的数据分布是一直发生变化的,因为在训练的时候,网络参数的变化就会导致后面输入数据的分布变化,比如第二层输入,是由输入数据和第一层参数得到的,而第一层的参数随着训练一直变化,势必会引起第二层输入分布的改变,把这种改变称之为:Internal Covariate Shift,BN就是为了解决这个问题的。

最新文章

  1. C++学习笔记(2)
  2. MySql学习(MariaDb)
  3. 优秀Python学习资源收集汇总(强烈推荐)
  4. 阿里云OSS上传图片,并使用图片服务裁切
  5. JQuery表单验证插件EasyValidator,超级简单易用!
  6. C语言知识总结(3)
  7. 阿里云之OSS 开放存储服务开发笔记
  8. GraphChi介绍
  9. 浅谈JavaScript的push()函数
  10. Member var and Static var.
  11. IT定理:摩尔定理,安迪-比尔定理,反摩尔定理
  12. ORA-600[kcratr_scan_lastbwr]逻辑坏块解决
  13. 页面json 格式化+颜色高亮
  14. 机器学习方法、距离度量、K_Means
  15. 自学华为IoT物联网_06 智慧家庭物联网常见问题及解决方案
  16. linux指定只显示(只打印)文件中的某几行(中间几行)
  17. 入门项目 A5-3 interface-user 第三方接口3
  18. 快速幂&快速乘法
  19. 用CSS来画空心三角形的方法
  20. Jenkins 总结

热门文章

  1. Qt DLL总结【一】-链接库预备知识
  2. ycache中redis主备功能设计及使用说明
  3. 2.jdk1.8+springboot中http1.1之tcp连接复用实现
  4. Android省电和提高效率
  5. bind绑定服务的生命周期
  6. ShockUtil振动工具类
  7. UML分类
  8. C# 打包安装部署 属性中找不到 查找目标或打开文件位置
  9. js手写数组Api--模拟实现常见数组Api
  10. openstack部署nova