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





相关文章
|
机器学习/深度学习 算法 测试技术
使用ORPO微调Llama 3
ORPO是一种结合监督微调和偏好对齐的新型微调技术,旨在减少训练大型语言模型所需资源和时间。通过在一个综合训练过程中结合这两种方法,ORPO优化了语言模型的目标,强化了对首选响应的奖励,弱化对不期望回答的惩罚。实验证明ORPO在不同模型和基准上优于其他对齐方法。本文使用Llama 3 8b模型测试ORPO,结果显示即使只微调1000条数据一个epoch,性能也有所提升,证实了ORPO的有效性。完整代码和更多细节可在相关链接中找到。
560 10
|
4月前
|
安全 Linux 测试技术
【实战指南】记一次定位fd泄漏问题
本文记录了一次文件描述符(fd)泄漏问题的排查过程。在项目压测中,进程因打开过多文件导致fd资源耗尽,最终无法创建新文件。通过分析错误码、查看/proc/pid/fd路径下的文件句柄信息,定位到临时文件未正确关闭的问题根源,并修复代码中遗漏的close调用。同时总结了Linux下进程资源限制的相关知识点,强调开发中应关注资源使用情况,避免类似问题发生。
209 50
|
存储 Prometheus 监控
程序开发中的监控和日志分析
监控和日志分析在软件开发中至关重要,它们帮助实时了解应用状态、及时发现并解决问题。监控确保系统稳定运行,优化性能和资源;日志分析则助于追踪问题根源、监测用户行为并提供安全审计。利用如Prometheus、ELK Stack等工具可实现高效监控与日志管理,从而优化应用性能和用户体验。
447 2
|
12月前
|
存储 机器学习/深度学习 数据可视化
数据集中存在大量的重复值,会对后续的数据分析和处理产生什么影响?
数据集中存在大量重复值可能会对后续的数据分析和处理产生多方面的负面影响
679 56
|
机器学习/深度学习
神经网络各种层的输入输出尺寸计算
神经网络各种层的输入输出尺寸计算
800 1
|
JavaScript
js监听页面或元素scroll事件,滚动到底部或顶部
js监听页面或元素scroll事件,滚动到底部或顶部
1541 0
js监听页面或元素scroll事件,滚动到底部或顶部
|
机器学习/深度学习 自然语言处理 搜索推荐
承上启下:基于全域漏斗分析的主搜深度统一粗排
两阶段排序(粗排-精排)一开始是因系统性能问题提出的排序框架,因此长期以来粗排的定位一直是精排的退化版本,业内的粗排的优化方向也是持续逼近精排。我们提出以全域成交的hitrate为目标的全新指标,重新审视了召回、粗排和精排的关系,指出了全新的优化方向
94172 3
|
算法 测试技术 数据处理
实时目标检测神器:YOLOv5的安装与使用详解
实时目标检测神器:YOLOv5的安装与使用详解
773 1
|
移动开发 PyTorch 算法框架/工具
ROI Pooling和ROI Align
ROI Pooling和ROI Align都是为了解决目标检测RPN任务后得到的一系列proposals大小不一致的问题。
433 0
|
机器学习/深度学习 存储 人工智能
解码Transformer:自注意力机制与编解码器机制详述与代码实现
解码Transformer:自注意力机制与编解码器机制详述与代码实现
433 0