Transformer为什么使用LayerNorm而不是BatchNorm?
01
引言
层归一化(Layer normalization ) 是Transformer模型中的一项重要技术,它通过对每一层的输入进行归一化,帮助稳定和加速训练。无论输入的规模或分布如何,它都能确保模型处理信息的一致性。在自注意力机制、多头注意力机制和位置编码等概念的基础上,层归一化在提高Transformer的效率和性能方面发挥着关键作用,使它们更加强大,能够处理复杂的任务。在本博客中,我们将深入探讨层归一化这一Transformer模型中的重要组成部分。
闲话少说,我们直接开始吧!
02
Normalization
让我们快速讨论一下什么是归一化,以及为什么它在深度学习中非常有用。如果你已经研究机器学习有一段时间了,你可能对规范化和标准化等概念并不陌生。但回顾一下,深度学习中的归一化是指将数据转化为符合特定统计属性的过程。
归一化有多种形式。其中一种常见的形式是标准化,即通过减去每列数据的平均值,然后除以标准差来调整每个数据点。这种转换的结果是,新列的平均值为 0,标准差为 1。另一种是最小-最大归一化,即对数据进行缩放,使其符合给定的范围。应用这些技术是为了确保数据具有一致的规模,这在机器学习中至关重要。
在深度学习中,归一化可应用于两个关键领域:
-
输入数据:输入神经网络的数据(如 f1、f2、f3 等特征)可在进入网络前进行归一化处理。这一步与传统机器学习中的操作类似。
-
隐藏层激活输出: 大家还可以将神经网络中隐藏层的激活输出归一化。这通常是为了稳定和加速训练,尤其是在深度网络中。
让我们深入了解一下为什么归一化在深度学习中如此重要。想象一下,你正在训练一个神经网络,当你更新权重时,其中一些权重开始变得非常大。当这种情况发生时,与这些权值相关联的激活也会变得很大,从而使你的模型更难有效学习。这会减慢训练速度,并在训练中造成问题。
归一化可以将激活保持在一个稳定的范围内,从而解决这个问题。这不仅能使训练过程更加稳定,还能加快训练速度,让模型更高效地学习。
归一化的另一大好处是可以防止出现内部协变量偏移的问题。当输入数据在网络各层中移动时,其分布会发生变化,这可能会混淆模型。通过对激活值进行归一化处理,可以保持数据的一致性,这样模型就能继续学习,而不会出现偏差。
此外,某些类型的归一化(如批量归一化)甚至有助于正则化,这意味着您的模型可以更好地泛化到新数据。
03
Batch Normalizaition
批量归一化 (Batch Normalization) 旨在解决内部协变量偏移这一特定问题。要理解这个问题,可以想象一个有多个隐藏层的神经网络。在训练过程中,这些层的激活分布会因为权重的更新而发生变化。这种变化的分布使得网络难以有效学习,从而导致训练不稳定。
内部协变量偏移是指在训练过程中,由于网络权重的不断更新,激活分布发生了变化。这种偏移会导致每个后续层接收到的输入分布各不相同,从而阻碍稳定学习。

在上图中,前两行图像用于训练,其余两行图像用于测试。很明显,这些图像的分布不同,这就是协方差偏移的一个例子
批量归一化可以缓解这一问题,它通过对每一层内的激活输出进行归一化处理,确保激活量遵循均值为 0、标准差为 1 的一致分布。这有助于保持训练的稳定性,并让网络更有效地学习。通过对激活值进行归一化处理,批量归一化可减少内部协变量偏移的影响,并提高收敛速度,使训练过程更平滑、更可预测。
04
Batch Norm工作原理
让我们举例说明BN层的工作原理。我们有一个简单的数据集,其中包含两个特征和几行数据。我们将用这个数据集来训练一个神经网络。

我们有一个包含特征 f1 和 f2 的数据集和一个有一个隐藏层的神经网络。我们的目标是对隐藏层节点的输出进行批量归一化处理。为简单起见,我们假设批量大小为 5,这意味着我们将同时向神经网络输入五行数据。
BN层的处理步骤如下 :
-
对于批次中的每一行,计算隐藏层中节点的激活值。
-
为简单起见,我们将重点放在三个隐藏层节点及其激活值 z1、z2 和 z3 上。假设我们为批次中的每一行计算这些值。

-
计算批次中每个激活值的平均值(μ)和标准偏差(σ), 即分别计算z1 z2 和z3的平均值和方差

-
用以下公式对每个激活值进行归一化处理,将此应用于 z1、z2 和 z3 等所有值。

-
归一化后,应用缩放和移动。每个节点都有两个可学习的参数:伽马参数(γ)和贝塔参数(β)。

这里,γ 和 β 最初分别设置为 1 和 0,但在训练过程中会进行调整。
- 归一化后,将数值通过激活函数,得到每个节点的最终输出。
05
为什么不在Transformer中使用BatchNorm?********
在Transformer结构中,归一化技术的选择对模型的性能起着至关重要的作用。在Transformer中,层归一化比批量归一化更受青睐,其主要原因是批量归一化不能有效地与自注意机制配合使用。简单地说,批量归一化难以处理顺序数据,而顺序数据是Transforemr模型的基本输入。
让我们通过一张众所周知的Transformer结构图来深入探讨这个问题。你会发现,归一化步骤是在注意力机制之后进行的。

但为什么不在这里使用批量归一化呢?为了说明这一点,我将演示将批量归一化直接应用于自我关注机制时会发生什么。
06
回顾Self-Attention
在自注意力机制中,通常从一个句子开始,如 “river bank”,然后将其分解为单个词或标记。为简单起见,让我们考虑两个标记:"river "和 “bank”。然后,每个词都由一个嵌入向量来表示。虽然嵌入向量通常是高维的,但在本例中,我们假设使用的是四维向量。重要的是,每个词的嵌入向量具有相同的维度。如下图所示:

接下来,这些嵌入向量被送入计算自注意力机制。自注意力机制的作用就是从这些向量中生成上下文嵌入向量。这里看到的是 "river "一词的上下文嵌入向量,它考虑了 "bank"一词的语义信息。请注意,输出向量的维度与输入向量保持一致。
07
Self-Attention中的批量处理
现在,让我们引入一点复杂性。到目前为止,我们一直在考虑一次向自注意力模块输入一个句子。但如果我们想同时处理多个句子呢?这就是批处理发挥作用的地方。我将向你展示如何以批处理的形式通过自注意力模块处理多个句子。
假设我们正在执行一项情感分析任务,数据集包含的句子如下:

为了在这些数据上训练自注意力模块,我们决定一次处理两个句子,这意味着我们的BatchSize大小设置为两个。因此,前两个句子将作为一个批次一起处理,然后再处理后两个句子。
和以前一样,这些句子中的每个单词都由一个嵌入向量表示,为了简单起见,我们将每个嵌入向量的维数保持在三维。下图显示了每个单词的嵌入情况:

在自注意力机制方面,尤其是在处理不同长度的序列时,填充起着至关重要的作用。让我们通过一个实际例子来深入了解填充的工作原理以及它的必要性。
上述两个句子的长度各不相同,一个句子有两个单词,另一个句子有四个单词。然而,在自注意力计算过程中,我们需要确保在处理这些句子时,每个句子中的单词(标记)数量是相等的。这就是填充的作用。

填充后这两个句子的长度相等,可以将它们输入自注意力模块。该模块将根据整个序列计算每个单词的上下文嵌入。

上述嵌入可以用矩阵来表示,就像这样:

将这些矩阵通过自注意力模块后,就能得到以下上下文嵌入。

现在,我们将这两种上下文嵌入堆叠在一起,如下图所示:

现在,如果使用BatchNorm, 则我们需要计算每一列的平均值和标准差,对这一设置进行归一化操作。不过,重要的是要问问自己,计算出的平均值和标准差是否真正代表了数据的分布。答案是否定的,主要是因为存在很多填充的零。如果数据中有多个零,就会严重影响批量归一化的效果。这就是主要问题所在–当数据中存在多个零时,批量归一化就会失效。

最根本的原因在于,填充标记虽然是对齐所必需的,但并不是原始数据的一部分。它们会在数据集中引入大量零,从而误导归一化过程。这也是为什么在Transformer中的自注意力层后不采用批量归一化的原因。
08
LayerNorm的引入
为了解释层归一化,我将使用之前用于批量归一化的相同设置。我们有完全相同的神经网络和相同的数据。我们仍然计算所有数据点的 z1、z2 和 z3,它们分别代表第一、第二和第三节点的激活值。

一个主要的相似之处是,每个节点都有自己的伽马参数(γ)和贝塔参数(β)。这种设置与我们看到的批量归一化相同。然而,主要区别在于如何应用归一化。
在BatchNorm中,归一化是在整个批次中进行的。例如,如果我们将行视为我们的批次,那么归一化就会在跨批次也就是每一列这个方向上进行。但在层归一化中,归一化是跨特征进行的。这意味着层归一化是在每一行而不是整批数据中进行的。
要计算层归一化的平均值和标准偏差,需要对所有特征的每一行进行计算。例如,计算第一行的平均值 (μ1) 和标准偏差 (σ1),然后计算第二行的 μ2 和 σ2,以此类推,直到计算出最后一行的 μf 和 σf。

有了这些值之后,就可以通过减去各行的平均值,再除以标准差,对每个元素进行归一化处理。例如,要对第一行中的第一个元素进行归一化处理,可以这样写:
normalized_value=7-μ1/σ1
下一步是使用 z1 特有的伽马参数和贝塔参数对该值进行缩放和移动:
output=γ1 × p + β1
行中的每个元素都要重复这一过程。采用这种方法,可以对整个数据集的特征进行归一化处理,而不是对批次进行归一化处理。
09
对比总结
批归一化和层归一化的主要区别在于归一化的方向。BatchNorm是对批次进行归一化,而LayerNorm是对特征进行归一化。这一区别至关重要,尤其是在Transformer中,层归一化在处理数据的顺序性方面起着至关重要的作用。
总之,LayerNorm为Transformer结构提供了一种更合理、更有效的方法,即使在存在填充的情况下,也能确保数据的准确归一化,从而提高模型的性能和稳定性。
如何学习AI大模型?
大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。
不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!
想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。
但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高
那么针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓
👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈

学习路线

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

相关文章:
Transformer为什么使用LayerNorm而不是BatchNorm?
01 引言 层归一化(Layer normalization ) 是Transformer模型中的一项重要技术,它通过对每一层的输入进行归一化,帮助稳定和加速训练。无论输入的规模或分布如何,它都能确保模型处理信息的一致性。在自注意力机制、多头注意力机制和位置编码…...
理解和重构目录结构:Java 中的父子关系管理
理解和重构目录结构:Java 中的父子关系管理 一、前言1. 问题背景2. 目录项结构3. 实现重构逻辑4. 示例代码5. 结果与输出 二、总结 好的,我们将目录结构调整为使用中文数字表示的标题。以下是重新组织后的内容: 一、前言 在软件开发中&…...
ES6面试题:(第一天)
目录 1.var,let,const的区别 2.说说你对数组的解构和对象的解构的理解? 3.ES6的新语法 4.Map对象和Set对象的区别 5.Set实现数组去重 1.var,let,const的区别 使用 var 声明的变量,其作用域为全局作用域或者为所在的函数内局部作用域,且存在变量提升…...
【ChatGPT】什么是ChatGPT:基础介绍与使用场景
什么是ChatGPT:基础介绍与使用场景 在当今科技快速发展的时代,人工智能工具正逐步融入我们生活的方方面面。你是否曾在编写报告时陷入思路停滞?或者在客户服务中焦急等待响应?这些问题,随着 ChatGPT 的出现࿰…...
工业自动化为什么依赖光耦隔离器 --- 腾恩科技
光耦合器隔离器在工业自动化中必不可少,可确保信号传输,同时保护敏感电子设备和人员免受高压影响。选择合适的光耦合器隔离器取决于对操作环境和隔离要求的了解。本文将重点介绍在为工业应用选择光耦合器隔离器时需要考虑的关键因素。 光耦合器隔离器在工…...
Linux环境下Jmeter执行压测脚本
Linux环境下Jmeter执行压测脚本 前提官网下载Jmeter执行脚本 前提 注意:Jmeter的运行依赖Java环境 官网下载Jmeter 1、下载链接:https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.zip 2、解压 unzip apache-jmeter-5.6.3.zip 执行脚本…...
PROFINET开发或EtherNet/IP开发嵌入式板有用于工业称重秤
这是一个真实案例,不过客户选择不透露其品牌名称。稳联技术的嵌入式解决方案助力工业称重设备制造商连接至任意工业网络。多网络连接使得称重设备能够轻松接入不同的控制系统,进而加快产品的上市时间。 我们找到了稳联技术的解决方案。他们成熟的技术与专…...
OracleT5-2 Solaris11安装
1、Solaris11安装 在光驱中插入Solaris11的光盘后,在ok提示中boot cdrom {0} ok boot cdrom NOTICE: Entering OpenBoot. NOTICE: Fetching Guest MD from HV. NOTICE: Starting additional cpus. NOTICE: Initializing LDC services. NOTICE: Probing PCI devices. N…...
详解 JuiceFS 在多云架构下的数据同步与一致性
随着大模型流行,GPU 算力资源正变得日益稀缺,传统的“算力跟着存储跑”的策略需要转变为“存储跟着算力跑”。为了确保数据一致性和管理的便捷性,企业通常在特定地区的公有云上选择对象存储作为所有模型数据的集中存储点。当进行计算任务调度…...
赛氪贡献突出获评优秀合作伙伴,第十九届环境友好科技竞赛落幕
2024年10月19日,第十九届全国环境友好科技竞赛终审答辩会在同济大学顺利举行,标志着这一环境领域顶级学科竞赛的又一盛事圆满落幕。本次竞赛由清华大学、同济大学、西安建筑科技大学及中国环境科学学会共同主办,吸引了全国各高校相关专业学生…...
GrowingIO埋点(前端)
GrowingIO埋点(前端) 一、CDN集成SDK 1、初始化 当用户加载页面的时候,会异步加载 WebJS SDK,不会影响到用户的加载速度,所以一般建议把这段代码加入到 <head></head> 中的最下面,这样能…...
MySQL-15.DQL-排序查询
一.DQL-排序查询 -- 排序查询 -- 1.根据入职时间,对员工进行升序排序 select * from tb_emp order by entrydate asc ;-- 2.根据入职时间,对员工进行降序排序 select * from tb_emp order by entrydate desc ;-- 3.根据 入职时间 对公司员工进行 升序排序…...
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
文章目录 前言一、控制器层代码二、服务层代码三、代码亮点分析 前言 SpringBoot的同步excel导出方式中,服务会阻塞直到Excel文件生成完毕,如果导出数据很多时,效率低体验差。有效的方案是将导出数据拆分后利用CompletableFuture,…...
黑马软件测试第一篇_数据库
说明: 数据库是专门用来存储数据的软件 注意: 对于测试工作而言, 如果项目页面没有实现, 但是我们又想要校验数据,则可以直接通过查询数据库实现 关系: 具体存在的商品录入后 -> 产生对应的数据(存到数据库中) -> 最后会被加载到项目页面中 数据库的分类 分类: 1> 关…...
第十六届蓝桥杯嵌入式组准备
最近我看很多人都在准备蓝桥杯的比赛了,这里我给大家整理一下历届真题或模拟题的讲解与源码 蓝桥杯嵌入式第十二届省赛真题二 蓝桥杯嵌入式第十三届省赛真题一 蓝桥杯嵌入式第十三届省赛真题二 蓝桥杯嵌入式第十四届省赛真题 蓝桥杯嵌入式第十四届模拟考试一 蓝…...
城乡供水信息化系统如何建设?
城乡供水信息化建设是一个综合性的过程,旨在通过现代信息技术提升农村供水系统的管理效率和服务质量。这一过程包含以下关键内容: 一、信息化基础设施建设 感知层建设:在农村饮水工程的关键部位,如水源地、水厂、供水管网等&#…...
【Petri网导论学习笔记】Petri网导论入门学习(七) —— 1.5 并发与冲突
导航 1.5 并发与冲突1.5.1 并发定义 1.14定义 1.15 1.5.2 冲突定义 1.17 1.5.3 一般Petri网系统中的并发与冲突定义 1.18一般网系统中无冲撞概念阻塞(有容量函数K的P/T系统,类似于冲撞)一般Petri网中并发与冲突共存情况 1.5 并发与冲突 Petr…...
MongoDB常用语句
1.只统计记录总数: let result await CorrectionRecordModel.countDocuments(db);2.数组遍历,循环体中可以有调用异步函数: for(let item of result2){if(item && Tool.checkNotEmptString(item.auth_id) && (item.status …...
自动创作PPT 利用提示词和大模型自动创建ppt
背景 ppt创作可以分为3个步骤:1.大纲撰写;2.内容填充;3.ppt实现。我前几天用十分钟的时间做了一个ppt,主讲大模型测评。这里给大家分享一下我的创作过程。 关于步骤1和步骤2,最近发现一个非常好的提示词,…...
二分类评价指标AUROC和AUPR
文章目录 一、AUROC(Area Under the Receiver Operating Characteristic Curve)二、AUPR(Area Under the Precision-Recall Curve)三、区别3.1 案例3.2 如何选择? 在分类任务中, AUROC(受试者工…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
