浅聊BN层的那点事

简介: 浅聊BN层的那点事

前言


  今日在刷机器学习相关论文与书籍,看到了BN层的一些事情,由此想到了在设计网络的时候我们为什么需要添加BN层,在这这里我浅聊下BN层的那些事。



BN层


解决梯度爆炸

  在Train自己的网络中往往会遇到梯度爆炸这个问题,常见的解决思路中就有添加BN层。作用:BN层的作用主要是对数据做标准化处理,解决梯度爆炸。(梯度爆炸消失问题最好是直接拿梯度链式求解公式来分析)


  究其原因:是由于对数据标准化后让梯度变化幅度变得平缓,在一定范围之内,标准化可以加快寻找到合适的梯度,因为标准化数据分布范围比较小了,这样子比零散分布的数据点,更容易计算梯度。标准化与归一化是有区别的,标准化的假设是数据服从正态分布,有的数据是不符合的。



:关于梯度爆炸:


  反向传播中,经过每一层的梯度会乘以该层的权重。正向传播中f2=f1(wT∗x+b)f2=f1(wT∗x+b)带来的放大缩小的影响,进而解决梯度消失和爆炸的问题



关于BN层


  在网络的训练中,BN的使用使得一个mini batch中所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果,即同样一个样本的输出不再仅仅取决于样本的本身,也取决于跟这个样本同属一个batch的其他样本,而每次网络都是随机取batch,这样就会使得整个网络不会朝这一个方向使劲学习。一定程度上避免了过拟合。


  经过归一化再输入激活函数,得到的值大部分会落入非线性函数的线性区,导数远离导数饱和区,避免了梯度消失,这样来加速训练收敛过程。BatchNorm这类归一化技术,目的就是让每一层的分布稳定下来,让后面的层可以在前面层的基础上安心学习知识。


  BN处理后,上一层原始输入的数据还是能保留原来的分布,因为有两个参数可以学习到让它保留,此外,让输入的参数处理后,落在非线性函数的线性区,可以避免落在非线性区求导输出很小的值接近0


  总的来说BN处理后:1还能保留了原来数据的分布,因为有两个参数是可以学习的,这两可以学习到合适的参数,让数据保留原来的分布,2是处理后数据落在线性区,求导后梯度不会过小,线性区那个斜率就s函数来说看起来也不小


  个人觉得BN的两个参数βγ作用是让每层输入数据被BN算法做标准化处理后,在输入到激活函数之前,βγ让数据有个自适应的过程,可能达到接近真实原始数据的分布效果,此外还实现了处理后的数据落在激活函数的线性区,避免落在饱和区导致求导接近于0。


  如下图d其实是我们BN想要的那么一种状态,引入了这个可学习重构参数 γ 和β,让我们的网络可以学习恢复出原始网络所要学习的特征分布,而使被正则化的特征图保持一定的数据范围。



如果打印这两个参数,他们其实Bx1x1xC的向量,每一个输出通道都会有一个这样的参数image.png


用了BN但是激活函数还是用sigmoid,还会发生梯度消失吗?


  不能说用了BN就一定不会发生梯度消失或者爆炸,包括过拟合也是,不能百分之百解决 只能说,不容易炸 如果打印Bn前后的feature map值,会看到效果很明显。因为不加BN层,网络输出会逐渐向激活函数上下限靠近,造成爆炸消失;


BN层能否改变数据分布

image.png


原始输入为X,没有BN层的神经网络学习到的函数是f,输出Y,加入BN后,X分布被映射成了X'分布,此时加入BN的神经网络学习到的函数是f',输出还是Y,中途改变X的分布好像没有影响,取决于原始输入和输出,学习到的f还是f'拟合准确就好,但是没有BN的神经网络,其实f学习不到的,因为梯度消失,前面层的权重参数一直没变化,只是根据后面的结果倒推几层就得到了所有的权重,就不准确。


  没有BN,如果发生了梯度消失,前面层权重参数没变化,虽然喂入的数据在不断变化,其实也就是用后面几层训练这些数据,神经元就少了很多,可能会欠拟合,不知还会导致有哪些问题?





相关文章
|
7月前
|
机器学习/深度学习 计算机视觉 Python
【DRConv】动态区域感知卷积结构可提升卷积的表示能力 | 复现《Dynamic Region-Aware Convolution》
【DRConv】动态区域感知卷积结构可提升卷积的表示能力 | 复现《Dynamic Region-Aware Convolution》
210 1
【DRConv】动态区域感知卷积结构可提升卷积的表示能力 | 复现《Dynamic Region-Aware Convolution》
|
7月前
|
机器学习/深度学习 存储 TensorFlow
【Python机器学习】卷积神经网络卷积层、池化层、Flatten层、批标准化层的讲解(图文解释)
【Python机器学习】卷积神经网络卷积层、池化层、Flatten层、批标准化层的讲解(图文解释)
225 0
|
7月前
|
机器学习/深度学习 编解码 边缘计算
YOLOv5改进 | 卷积模块 | 用ShuffleNetV2卷积替换Conv【轻量化网络】
本文介绍了如何在YOLOv5中用ShuffleNetV2替换卷积以减少计算量。ShuffleNetV2是一个轻量级网络,采用深度可分离卷积、通道重组和多尺度特征融合技术。文中提供了一个逐步教程,包括ShuffleNetV2模块的代码实现和在YOLOv5配置文件中的添加方法。此外,还分享了完整的代码链接和GFLOPs的比较,显示了GFLOPs的显著减少。该教程适合初学者实践,以提升深度学习目标检测技能。
YOLOv5改进 | 卷积模块 | 用ShuffleNetV2卷积替换Conv【轻量化网络】
|
4月前
|
机器学习/深度学习 编解码 计算机视觉
CNN 中卷积层和池化层的作用
【8月更文挑战第15天】
241 0
|
6月前
|
存储 机器学习/深度学习 计算机视觉
【YOLOv8改进-卷积Conv】 OREPA(Online Convolutional Re-parameterization):在线卷积重参数化
**OREPA**是在线卷积重参数化的缩写,它提出了一种两阶段流程来减少深度模型训练的开销。该方法通过线性缩放层优化复杂训练块,并在训练完成后将其压缩为单个卷积层,降低内存使用和提高训练速度。与现有技术相比,OREPA能减少约70%的训练内存开销,提升2倍训练速度,并在ImageNet上提高最多0.6%的准确性。此外,它还在目标检测和语义分割任务中表现出色。论文和代码可在提供的链接中找到。
|
6月前
|
机器学习/深度学习 计算机视觉
YOLOv5改进 | 卷积模块 | 将Conv替换为轻量化的GSConv【原理 + 完整代码】
在这个教程中,作者介绍了如何将YOLOv5中的Conv模块替换为新型轻量级卷积GSConv,以实现模型瘦身并保持准确性。GSConv结合了分组卷积和空间卷积,减少了计算量。文章详细阐述了GSConv的原理,并提供了添加GSConv到YOLOv5的代码实现步骤。此外,还提到了Slim-neck by GSConv技术,它通过通道压缩和高效连接优化网络结构。读者可以获取完整代码进行实践,适用于资源受限的环境,如移动设备和实时应用。
|
7月前
|
数据可视化
FLatten Transformer:聚焦式线性注意力模块
FLatten Transformer:聚焦式线性注意力模块
105 2
FLatten Transformer:聚焦式线性注意力模块
|
7月前
|
机器学习/深度学习 算法 计算机视觉
YOLOv8改进 | 融合模块 | 用Resblock+CBAM卷积替换Conv【轻量化网络】
在这个教程中,介绍了如何将YOLOv8的目标检测模型改进,用Resblock+CBAM替换原有的卷积层。Resblock基于ResNet的残差学习思想,减少信息丢失,而CBAM是通道和空间注意力模块,增强网络对特征的感知。教程详细解释了ResNet和CBAM的原理,并提供了代码示例展示如何在YOLOv8中实现这一改进。此外,还给出了新增的yaml配置文件示例以及如何注册模块和执行程序。作者分享了完整的代码,并对比了改进前后的GFLOPs计算量,强调了这种改进在提升性能的同时可能增加计算需求。教程适合深度学习初学者实践和提升YOLO系列模型的性能。
|
7月前
|
机器学习/深度学习
一文弄清池化层(pooling)的作用
一文弄清池化层(pooling)的作用
|
数据采集 机器学习/深度学习 PyTorch
Pytorch学习笔记(5):torch.nn---网络层介绍(卷积层、池化层、线性层、激活函数层)
Pytorch学习笔记(5):torch.nn---网络层介绍(卷积层、池化层、线性层、激活函数层)
829 0
Pytorch学习笔记(5):torch.nn---网络层介绍(卷积层、池化层、线性层、激活函数层)