浅聊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的有效性。完整代码和更多细节可在相关链接中找到。
697 10
|
机器学习/深度学习 并行计算 PyTorch
安装GPU版本tensorflow、pytorch
安装GPU版本tensorflow、pytorch
安装GPU版本tensorflow、pytorch
|
缓存 安全 编译器
【C语言】volatile 关键字详解
`volatile` 关键字在 C 语言中用于防止编译器对某些变量进行优化,确保每次访问该变量时都直接从内存中读取最新的值。它主要用于处理硬件寄存器和多线程中的共享变量。然而,`volatile` 不保证操作的原子性和顺序,因此在多线程环境中,仍然需要适当的同步机制来确保线程安全。
1002 2
|
JavaScript
js监听页面或元素scroll事件,滚动到底部或顶部
js监听页面或元素scroll事件,滚动到底部或顶部
1771 0
js监听页面或元素scroll事件,滚动到底部或顶部
|
机器学习/深度学习 自然语言处理 搜索推荐
承上启下:基于全域漏斗分析的主搜深度统一粗排
两阶段排序(粗排-精排)一开始是因系统性能问题提出的排序框架,因此长期以来粗排的定位一直是精排的退化版本,业内的粗排的优化方向也是持续逼近精排。我们提出以全域成交的hitrate为目标的全新指标,重新审视了召回、粗排和精排的关系,指出了全新的优化方向
94544 3
|
移动开发 PyTorch 算法框架/工具
ROI Pooling和ROI Align
ROI Pooling和ROI Align都是为了解决目标检测RPN任务后得到的一系列proposals大小不一致的问题。
655 0
|
机器学习/深度学习 并行计算 算法
基于 PyTorch 的目标检测(YOLO实现)
基于 PyTorch 的目标检测(YOLO实现)
|
算法 测试技术 数据处理
实时目标检测神器:YOLOv5的安装与使用详解
实时目标检测神器:YOLOv5的安装与使用详解
1077 1
|
存储 移动开发 前端开发
【Uniapp 专栏】Uniapp 架构设计与原理探究
【5月更文挑战第12天】Uniapp是一款用于跨平台移动应用开发的框架,以其高效性和灵活性脱颖而出。它基于HTML、CSS和Vue.js构建视图层,JavaScript处理逻辑层,管理数据层,实现统一编码并支持原生插件扩展。通过抽象平台特性,开发者能专注于业务逻辑,提高开发效率。尽管存在兼容性和复杂性挑战,但深入理解其架构设计与原理将助力开发者创建高质量的跨平台应用。随着技术进步,Uniapp将继续在移动开发领域扮演重要角色。
854 1
【Uniapp 专栏】Uniapp 架构设计与原理探究
|
存储 缓存 监控
Memcached介绍和详解
Memcached介绍和详解
826 3

热门文章

最新文章