每天一个知识点——Normalization

这里结合大模型的学习,主要分析Layer Norm、RMS Norm和Deep Norm的异同,与此同时,究竟是在之前执行Normalization(Pre-Norm)还是之后执行(Post-Norm),也是一个比较喜欢拿来讨论的知识点。

一、为什么要做Normalization?

        ICS问题出现的根本原因在于神经网络每层之间,无法满足基本假设"独立同分布"。深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。为了训好模型,我们需要非常谨慎地去设定学习率、初始化权重、以及尽可能细致的参数更新策略。

ICS( Internal Covariate Shift)问题导致的后果:

  • 上层参数需要不断适应新的输入数据分布,降低学习速度;
  • 下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止;
  • 每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎;

二、Pre or Post?

Transformer的block模块里面包含了多处Normalization,具体结构如下: 

从图中可以看出,经过多头(multi-head)的self-attention之后结合残差网络,再做一次归一化。简化一下,如下图所示,

Pre-Norm的公式为:

x_{t+1}=x_t+F_t(Norm(x_t)) 

Post-Norm的公式为:

x_{t+1}=Norm(x_t+F_t(x_t))

问题一、为什么Pre Norm的效果不如Post Norm?Pre Norm的深度有“水分”!也就是说,一个L层的Pre Norm模型,其实际等效层数不如L层的Post Norm模型,而层数少了导致效果变差了?

原因:

\begin{aligned} x_{t+1}&=x_t+F_t(Norm(x_t)) \\ &=x_{t-1} + F_{t-1}(Norm(x_{t-1})) + F_t(Norm(x_t)) \\ &=... \\ &=x_0 + F_0(Norm(x_0)) + ... + F_{t-1}(Norm(x_{t-1})) + F_t(Norm(x_t)) \end{aligned}

所以在Pre Norm中多层叠加的结果更多是增加宽度而不是深度,层数越多,这个层就越“虚”。说白了,Pre Norm结构无形地增加了模型的宽度而降低了模型的深度,而我们知道深度通常比宽度更重要,所以是无形之中的降低深度导致最终效果变差了!

post-norm和pre-norm其实各有优势,post-norm在残差之后做归一化,对参数正则化的效果更强,进而模型的鲁棒性也会更好pre-norm相对于post-norm,因为有一部分参数直接加在了后面,不需要对这部分参数进行正则化,正好可以防止模型的梯度爆炸或者梯度消失,因此,这里笔者可以得出的一个结论是如果层数少post-norm的效果其实要好一些,如果要把层数加大,为了保证模型的训练,pre-norm显然更好一些。

问题二:为什么Layer Normalization要加在F的前面,而不是F的后面呢?

因为做完Layer Normalization之后的数据不能和平常的数据加在一起,如果这样做的话残差中从上一层出来的信息会占很大比重,这显然并不合理。

三、BatchNorm or LayerNorm?

这个问题争论了很久,也是面试官比较喜欢问的一个问题,貌似有点不死不休的意思。到底哪个好一定是有个定论吗?还是说不同场景下的选择?抑或是仅是理论上的讨论,在实操上并没有明显的性能差异?

首先列举一些网络中的解释:

        1. BatchNorm适用于CV,而LayerNorm适用于NLP,这是由两个任务的本质差异决定的,视觉的特征是客观存在的特征,而语义特征更多是由上下文语义决定的一种统计特征,因此他们的标准化方法也会有所不同。

        2. layernorm更容易并行训练。当每个device用不同的minbatch训练,我们需要额外地同步各个device上的batchnorm,用layernorm则不需要。

        3. layernorm所带来的hidden layer分布上的稳定性,促进了更平滑的梯度,更快的训练速度,更好的模型泛化能力等等。

        4. LayerNorm是后起之秀,挑战前辈BatchNorm必然是解决它的某些痛点或者劣势,那么BatchNorm有哪些痛点呢?

  • batch非常小,比如训练资源有限无法应用较大的batch,也比如在线学习等使用单例进行模型参数更新的场景
  • 对于rnn等动态的网络结构,同一个batch中训练实例有长有短,导致每一个时间步长必须维持各自的统计量,这使得BN并不能正确的使用。

        5. 约定俗称,比如NLP几个经典模型都是用的LayerNorm,之后很多的追随者也沿用了这一套。

另外需要注意的一个点是由于现在训练模型都是采用的mini-batch的方式,所以在batchnorm在估计训练集(推理阶段)整体的均值方差时,常采用EMA( exponential moving average),指数移动平均来估计:

\mu _{EMA}\leftarrow \lambda \mu _{EMA}+(1-\lambda )\mu _{B}

\sigma _{EMA}^{2}\leftarrow \lambda \sigma _{EMA}^{2}+(1-\lambda )\sigma _{B}^{2}

其中\mu _{B}\sigma _{B}^{2}为训练阶段的均值和方差,

\mu _{B}=X.mean(dim=0, keepdim=True)

\sigma _{B}^{2}=X.var(dim=0, keepdim=True)

然后对特征x进行归一化,

\hat{x}=\frac{x-\mu }{\sqrt{\sigma ^{2}+\epsilon }}

除了归一化,BatchNorm还包括对各个channel的特征做affine tranform(增加特征表达能力,有待考证):

y=\alpha \hat{x}+\beta

\alpha\beta都是可训练的参数。

四、RMS Norm和Deep Norm

RMS:Root Mean Square Layer Normalization

与layerNorm相比,RMS Norm的主要区别在于去掉了减去均值的部分,计算公式为:

\bar{a}_{i}=\frac{a_{i}}{RMS(a)}g_{i},  其中RMS(a)=\sqrt{\frac{1}{n}\sum_{i=1}^{n}a_{i}^{2}}

1、可以在梯度下降时令损失更加平滑?(有待考证)?

2、可以在各个模型上减少约 7%∼64% 的计算时间。

Deep Norm是对Post-LN的的改进,代码如下,

e135fbad38253919370571c9587b6152.png

作者认为 Post-LN 的不稳定性部分来自于梯度消失以及太大的模型更新,而DeepNorm可以缓解这个问题

  • DeepNorm在进行Layer Norm之前会以 \alpha参数扩大残差连接
  • 在Xavier参数初始化过程中以 \beta减小部分参数的初始化范围

说一千道一万,对于没法做到理论功底那么深厚的人来说,效果为王,谁效果好就用谁

a5c81cce8bead488474cbc1b0d2c5ac0.png

五、参考资料 

  1. DEEPNORM:千层transformer...

  2. 昇腾大模型|结构组件-1——Layer Norm、RMS Norm、Deep Norm

  3. BatchNorm与LayerNorm

  4. BatchNorm与LayerNorm的理解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/70260.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT会取代搜索引擎吗?BingChat、GoogleBard与ChatGPT区别

目前暂时不会,ChatGPT为代表的聊天机器人很可能会直接集成到搜索中,而不是取代它。微软已经通过Bing Chat和Bing做到了这一点,它将“聊天”选项卡直接放入Bing搜索的菜单中。Google、百度也分别开始尝试通过其AI生成技术将Google Bard、文心一…

Pytest三种运行方式

Pytest 运行方式共有三种: 1、主函数模式 运行所有 pytest.main() 指定模块 pytest.main([-vs],,./testcase/test_day1.py) 只运行testcase 下的test_day1.py 文件 指定目录 pytest.main([-vs]),./testcase) 只运行testcase 目录下的文件 通过nodeid指定用例…

Cmder:从此告别记事本记命令的日子

前言 平时开发中遇到这样那样的命令需要记下来,一般做法是这样。 新建记事本将需要记下的关键命令保存。每次需要使用时,粘贴复制即可。 好像没什么毛病!直到遇到了 Cmder。。。 当看到同事分析问题时在 Cmder 里命令快捷键刷刷一顿操作&…

C#实现邮箱验证码

开发环境:C#,VS2019,.NET Core 3.1,ASP.NET Core Web API,163邮箱 1、在163邮箱的设置中开通IMAP/SMTP的服务,授权成功后会弹出一个窗体(如下图所示),上面显示了授权密码…

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用

qModMaster工具介绍 QModMaster是一个基于Qt的Modbus主站(Master)模拟器,用于模拟和测试Modbus TCP和RTU通信。它提供了一个直观的图形界面,使用户能够轻松设置和发送Modbus请求,并查看和分析响应数据。 以下是QModM…

湘大 XTU OJ 1256 湘潭大学 题解(非常详细):枚举

一、链接 1256 湘潭大学 二、题目 题目描述 湘潭大学简称“XTU”,作为即将成为湘大的一份子,怎么不能为湘大添砖加瓦了?现在给你一个字符串,请你计算一下,从中选取字符,最多能组成多少个“XTU”&#x…

v-md-editor自定义锚点(生成目录)数组转树结构

接前两篇博文,最终方案终于定了,也把之前做的编辑器模式给否决了,原因是系统中有老的文档需要平替,因此就不能通过编辑器这种模式了,太麻烦了。 最终方案:线下手动pandoc word转markdown,然后将…

Qt 7. 在自定义类TcpClient类中使用信号槽功能

1. 因为只有QObject类及其子类派生的类才能使用信号和槽机制。 使用信号和槽还必须在类声明的最开始处添加Q_OBJECT宏,在这个程序中,类的声明是自动生成的,已经添加了这个宏。UI类继承自QDialog,QDialog类又继承自QWidget类&…

Oracle-创建PDB

Oracle-创建PDB 创建PDB的方式 从PDB$SEED新建PDB克隆已存在的PDB 本地PDB克隆到同一个CDB中将远程PDB克隆到CDB中将非CDB插入或克隆到CDB中通过插拔的方式创建PDB sql 命令语法 条件 CDB必须open并且read write模式连接CDB$ROOT 用户并且具有CREATEPLUGGABLEDATABASE系统权…

解决android studio妙明奇妙出现的模拟器

1&#xff0c;查看设备 adb devices 2&#xff0c; adb命令断开指定的设备 要断开ADB与特定设备的连接&#xff0c;可以使用以下命令&#xff1a; adb disconnect <设备ID> 将 <设备ID> 替换为您要断开连接的设备的实际ID。设备ID可以在运行 adb devices 命令…

Von Maur, Inc EDI 需求分析

Von Maur, Inc 是一家历史悠久的卖场&#xff0c;成立于19世纪&#xff0c;总部位于美国。作为一家知名的零售商&#xff0c;Von Maur 主要经营高端时装、家居用品和美妆产品。其使命是为顾客提供优质的产品和无与伦比的购物体验。多年来&#xff0c;Von Maur 凭借其卓越的服务…

MySQL SUBSTRING_INDEX() 函数的详细介绍

MySQL SUBSTRING_INDEX() 从给定字符串中返回指定数量的分隔符出现之前的子字符串。 当指定数字为正数时从最终分隔符的左侧返回子字符串&#xff0c;当指定数字为负数时从最终分隔符的右侧返回子字符串。 如果指定的次数大于分隔符的出现次数&#xff0c;则返回的子字符串将…

机器人技术及其影响

目录 1.概念 2.发展 3.应用领域 4.对人类的益处 1.概念 机器人是指能够自主执行任务的机械设备或电子设备。它们通常具有一定的感知、决策和执行能力&#xff0c;能够接收和处理来自外部环境的信息&#xff0c;并做出相应的行动。 机器人的形态和功能各异&#xff0c;可以是…

Netty自定义编码解码器

上次通信的时候用的是自带的编解码器&#xff0c;今天自己实现一下自定义的。 1、自定义一下协议 //协议类 Data public class Protocol<T> implements Serializable {private Long id System.currentTimeMillis();private short msgType;// 假设1为请求 2为响应privat…

JAVA基础补充(Comparable排序接口的实现)

JAVA基础补充&#xff08;Comparable排序接口的实现&#xff09; Comparable接口的实现&#xff1a;没有实现Comparable接口时&#xff0c;取出来的值无法排序如果进行排序&#xff1a;实现接口进行排序&#xff1a;Controller层的实现实体类的实现 复习时间&#xff1a;2023/0…

(学习笔记-进程管理)多线程冲突如何解决

对于共享资源&#xff0c;如果没有上锁&#xff0c;在多线程的环境里&#xff0c;很有可能发生翻车。 竞争与合作 在单核 CPU 系统里&#xff0c;为了实现多个程序同时运行的假象&#xff0c;操作系统通常以时间片调度的方式&#xff0c;让每个进程每次执行一个时间片&#xf…

13.3 目标检测和边界框

锚框的计算公式 假设原图的高为H,宽为W 详细公式推导 以同一个像素点为锚框&#xff0c;可以生成 (n个缩放 m个宽高比 -1 )个锚框

RabbitMQ 消息队列(Spring boot AMQP)

文章目录 &#x1f370;有几个原因可以解释为什么要选择 RabbitMQ&#xff1a;&#x1f969;mq之间的对比&#x1f33d;RabbitMQ vs Apache Kafka&#x1f33d;RabbitMQ vs ActiveMQ&#x1f33d;RabbitMQ vs RocketMQ&#x1f33d;RabbitMQ vs Redis &#x1f969;linux docke…

【大数据之Kafka】一、Kafka定义消息队列及基础架构

1 定义 Kafka传统定义&#xff1a;Kafka是一个分布式的基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域。 发布/订阅&#xff1a;消息的发布者不会将消息直接发送给特定的订阅者&#xff0c;而是将发布的消息分为…

「C/C++」C/C++正则表达式

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C」C/C程序设计「Win」Windows程序设计「DSA」数据结构与算法「File」数据文件格式 目录 术语介绍…