3x3矩阵乘法公式图
位置编码技术是一种能够让神经网络建模句子中Token位置信息的技术。
在Transformer大行其道的时代,由于Attention结构无法建模每个token的位置信息,位置编码(Position Embedding)成为Transformer非常重要的一个组件。
研究人员也提出了各种各样的位置编码方案来让网络建模位置信息,RoPE和 Alibi 是目前最被广泛采纳的两种位置编码方案。
然而最近来自百川智能的研究发现,RoPE和Alibi位置编码的主流实现在低精度(尤其是bfloat16)下存在位置编码碰撞的bug, 这可能会影响模型的训练和推理。
而且目前大部分主流开源模型的实现都存在该问题,连llama官方代码也中招了。
![](https://p0.ssl.img.360kuai.com/t0142347e3107f01fd0.jpg)
还得从位置编码算法说起
为了弄清楚这个问题,得先从位置编码的算法原理说起。
在Transformer结构中,所有Attention Block的输入都会先经过位置编码, 再输入网络进行后续处理。
纯粹的Attention结构是无法精确感知到每个token的位置信息的,而对于语言的很多任务来说,语句的顺序对语义信息的影响是非常大的,为了建模token之间的位置关系,Transfomer原始论文中引入位置编码来建模位置信息。
![](https://p0.ssl.img.360kuai.com/t01775bf69594a5982d.jpg)
图1-施加 Positon Embedding 示意图
为了让模型更好地建模句子的位置信息,研究人员提出了多种位置编码方案,Meta开源的llama模型采用了RoPE方案,使得RoPE成为在开源社区被广泛采纳的一种位置编码方案。Alibi编码也因为其良好的外推性也被广泛应用。
了解低精度下的位置编码碰撞之前,先来回顾一下相关算法原理
- Sinusoidal位置编码
![](https://p0.ssl.img.360kuai.com/t0118164d49b8343d9f.jpg)
这是Transformer原始论文中提出的位置编码方法。它通过使用不同频率的正弦和余弦函数来为每个位置产生一个独特的编码。选择三角函数来生成位置编码有两个良好的性质:
1)编码相对位置信息,数学上可以证明 PE(pos+k) 可以被 PE(pos) 线性表示, 这意味着位置编码中蕴含了相对位置信息。
![](https://p0.ssl.img.360kuai.com/t012eb9e820c69cf8c1.jpg)
图2-句子长度为50的位置编码,编码维度128,每行代表一个Position Embedding
2)远程衰减:不同位置的position embedding点乘结果会随着相对位置的增加而递减。
![](https://p0.ssl.img.360kuai.com/t0187c4ce0c84f55ee6.jpg)
图3-不同位置的位置编码点积可视化
RoPE
RoPE是目前开源社区应用最广泛的一种位置编码方案, 通过绝对位置编码的方式实现相对位置编码,在引入相对位置信息的同时保持了绝对位置编码的优势(不需要像相对位置编码一样去操作Attention matrix)。令f_q, f_k 为 位置编码的函数,m表示位置, x_m 表示该位置token对应的Embedding,希望经过位置编码后的Embedding 点积仅和相对位置有关,则可以有公式
![](https://p0.ssl.img.360kuai.com/t01a127b69607c767f0.jpg)
上面公式中g是某个函数,表示内积的结果只和x_m 和 x_n的值,以及二者位置的相对关系(m-n)有关在2维的情况下可以推导出(详细推导过程可参考原论文):
![](https://p0.ssl.img.360kuai.com/t0199345e20ab28021c.jpg)
因为矩阵乘法线性累加的性质,可以拓展到多维的情况可得:
![](https://p0.ssl.img.360kuai.com/t01777899ce118dde1e.jpg)
为了引入远程衰减的特性,Rope中\\theta的选取选择了Transformer 原始论文中 sinusoidal 公式。
Alibi
- Alibi是谷歌发表在ICLR2022的一篇工作,Alibi主要解决了位置编码外推效果差的痛点,算法思想非常的简单,而且非常直观。与直接加在Embedding 上的绝对位置编码不同,Alibi的思想是在 Attention matrix上施加一个与距离成正比的惩罚偏置,惩罚偏置随着相对距离的增加而增加。在具体实现时,对于每个head会有一个超参m 来控制惩罚偏置随着相对距离增加的幅度(斜率)。
![](https://p0.ssl.img.360kuai.com/t0192ea7cbfd48d48e3.jpg)
![](https://p0.ssl.img.360kuai.com/t01a9dddc71f83cae35.jpg)
图4-Alibi attention bias示意图
- 论文结果显示Alibi 极大的提升了模型的外推性能,16k token 的输入依然可以很好的支持
![](https://p0.ssl.img.360kuai.com/t0140c6745e973bdf93.jpg)
图5-Alibi 外推效果对比
混合精度下位置编码的bug
- 从上面的算法原理中,不管是RoPE 的 cos(m \\theta) 还是alibi 的 i-1(m, i 代表postion id), 都需要为每个位置生成一个整型的position_id, 在上下文窗口比较大的时候,百川智能发现目前主流的位置编码实现在混合精度下都存在因为低精度(float16/bfloat16)浮点数表示精度不足导致位置编码碰撞的问题。尤其当模型训练(推理)时上下文长度越来越长,低精度表示带来的位置编码碰撞问题越来越严重,进而影响模型的效果,下面以bfloat16为例来说明这个 bug
浮点数表示精度
- 浮点数在计算机中表示由符号位(sign),指数位(exponent),尾数位(fraction) 三部分组成, 对于一个常规的数值表示,可以由如下公式来计算其代表的数值(其中offset是指数位的偏置):
- 由公式可知,尾数位的长度决定了浮点数的表示精度。深度学习中常用的 float32/float16/bfloat16 内存中的表示分别如下图所示:
![](https://p0.ssl.img.360kuai.com/t012f03ba23253dd1e1.jpg)
图6-bfloat16 的表示格式
![](https://p0.ssl.img.360kuai.com/t01cbf53ea96487af46.jpg)
图7-float16 的表示格式
![](https://p0.ssl.img.360kuai.com/t01d0a079ea2e8a934c.jpg)
图8-float32 的表示格式
可以看到可以看到float16和bfloat16相比于float32都牺牲了表示的精度,后续以bfloat16为例说明位置编码中存在的问题(float16同理)。 下表展示了bfloat16在不同数值范围(只截取整数部分)内的表示精度
Min | Max | Interval |
1 | 2 | 2^(-7) |
2 | 4 | 2^(-6) |
4 | 8 | 2^(-5) |
8 | 16 | 2^(-4) |
16 | 32 | 2^(-3) |
32 | 64 | 2^(-2) |
64 | 128 | 2^(-1) |
128 | 256 | 1 |
256 | 512 | 2 |
512 | 1024 | 4 |
1024 | 2048 | 8 |
2048 | 4096 | 16 |
4096 | 8192 | 32 |
8192 | 16384 | 64 |
16384 | 32768 | 128 |
可以看到当整数范围超过256,bfloat16就无法精确表示每一个整数,我们可以用代码验证一下表示精度带来的问题
![](https://p0.ssl.img.360kuai.com/t01bf33c8d0b48c8559.jpg)
RoPE& Alibi 编码的问题
- Meta开源的llama模型采用了RoPE的位置编码方式,官方的实现(以及大部分的第三方llama系列模型)在bfloat16下存在精度问题带来的位置编码碰撞(不同位置的token在bfloat16下变成同一个数)。llama官方代码如下:
![](https://p0.ssl.img.360kuai.com/t01a0591d870281d9c7.jpg)
- 上面第18行核心一句根据输入序列长度生成每个位置的 positon idx在bfloat16 下产生位置碰撞
![](https://p0.ssl.img.360kuai.com/t01e817d910d3bcacac.jpg)
- 在实际训练时如果开了bfloat16, self.inv_freq的 dtype会被转为bfloat16, 我们可以通过简单的代码来看一下位置碰撞的问题
![](https://p0.ssl.img.360kuai.com/t01198c218668fc3fcc.jpg)
![](https://p0.ssl.img.360kuai.com/t01b44bf0047dc4fb38.jpg)
图9-bfloat16位置碰撞示意图
- 根据bfloat16的表示精度可知,训练(推理)时上下文长度越长,位置编码碰撞的情况越严重,长度为8192的上下文推理中,仅有大约10%的token位置编码是精确的,好在位置编码碰撞有局域性的特质,只有若干个相邻的token才会共享同一个position Embedding, 在更大的尺度上,不同位置的token 还是有一定的区分性。
![](https://p0.ssl.img.360kuai.com/t0166cdc3e96f97cbaa.jpg)
图10-不同上下文窗口下位置编码精确token所占比例
除了RoPE位置编码方案,百川智能发现 Alibi 位置编码也存在上述问题,原因依然在于生成整数的位置索引时会在低精度下产生碰撞问题。
修复方案
RoPE修复
- RoPE 的修复相对简单,只需要保证在生成 position_id的时候一定在float32的精度上即可。注意:
- float32的tensor register_buffer后在训练时如果开启了bfloat16, 也会被转为bfloat16
![](https://p0.ssl.img.360kuai.com/t0150eab4d3a5fb7fc1.jpg)
Alibi修复
- Alibi位置编码修复思路和RoPE的修复思路一致,但因为Alibi的 attention bias直接加在 attention matrix上面,如果按照上面的修复思路,attention matrix的类型必须和attention bias 一致,导致整个attention的计算都在float32类型上计算,这会极大的拖慢训练速度
- 目前主流的attention加速方法flashattention不支持 attention bias参数, 而 xformers要求attention bias类型必须与query.dtype相同,因此像RoPE那样简单的将attention bias类型提升到float32将会极大的拖慢训练速度
- 针对该问题百川智能提出了一种新的Alibi attention方案, 整个attention bias依然在bfloat16类型上,类似于sinusoidal的远程衰减特质,我们尽量保证临近token位置编码的精确性,对于相对距离过远的的token我们则可以容忍其产生一定的位置碰撞。原本的Alibi实现则相反,相对距离越远的token表示越精确,相对距离越近的token 则会碰撞
![](https://p0.ssl.img.360kuai.com/t018e3cef7d4c0ad9b4.jpg)
图11- 修复前后alibi attention_bias对照
修复效果
- 此处仅在推理阶段对位置编码的精度问题进行修复【注:训练阶段可能也存在问题,取决于训练的具体配置和方法】,可以看到:
- 在长上下文的推理中,模型的ppl 要显著优于修复前的ppl
- Benchmark上测试结果显示修复前后区别不大,可能是因为benchmark上测试文本长度有限,很少触发Position embedding的碰撞
Benchmark对比
![](https://p0.ssl.img.360kuai.com/t015ff5eb4203268279.jpg)
Perplexity对比
在通用的文本数据上对修改前后模型在中英文文本上的困惑度进行测试,效果如下:
![](https://p0.ssl.img.360kuai.com/t01fc7109e212465d90.jpg)
![](https://p0.ssl.img.360kuai.com/t014f65ba9dba304dec.jpg)
![](https://p0.ssl.img.360kuai.com/t01b25a4447b7adeb87.jpg)
![](https://p0.ssl.img.360kuai.com/t01fe89f644d2c6acf6.jpg)
参考资料:
Dongxu Zhang, & Dong Wang. (2015). Relation Classification via Recurrent Neural Network.
Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, & Illia Polosukhin. (2023). Attention Is All You Need.
Zihang Dai, Zhilin Yang, Yiming Yang, Jaime Carbonell, Quoc V. Le, & Ruslan Salakhutdinov. (2019). Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context.
Colin Raffel, Noam Shazeer, Adam Roberts, Katherine Lee, Sharan Narang, Michael Matena, Yanqi Zhou, Wei Li, & Peter J. Liu. (2020). Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer.
Hugo Touvron, Thibaut Lavril, Gautier Izacard, Xavier Martinet, Marie-Anne Lachaux, Timothée Lacroix, Baptiste Rozière, Naman Goyal, Eric Hambro, Faisal Azhar, Aurelien Rodriguez, Armand Joulin, Edouard Grave, & Guillaume Lample. (2023). LLaMA: Open and Efficient Foundation Language Models.
Jianlin Su, Yu Lu, Shengfeng Pan, Ahmed Murtadha, Bo Wen, & Yunfeng Liu. (2022). RoFormer: Enhanced Transformer with Rotary Position Embedding.
Ofir Press, Noah A. Smith, & Mike Lewis. (2022). Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation.
Yutao Sun, Li Dong, Barun Patra, Shuming Ma, Shaohan Huang, Alon Benhaim, Vishrav Chaudhary, Xia Song, & Furu Wei. (2022). A Length-Extrapolatable Transformer.
https://kazemnejad.com/blog/transformer_architecture_positional_encoding/
Shouyuan Chen, Sherman Wong, Liangjian Chen, & Yuandong Tian. (2023). Extending Context Window of Large Language Models via Positional Interpolation.
https://www.reddit.com/r/LocalLLaMA/comments/14lz7j5/ntkaware_scaled_rope_allows_llama_models_to_have/
— 完 —
量子位 QbitAI · 头条号签约
","gnid":"9cd1a556291e192d7","img_data":[{"flag":2,"img":[{"desc":"","height":"723","title":"","url":"https://p0.ssl.img.360kuai.com/t0142347e3107f01fd0.jpg","width":"1106"},{"desc":"","height":"834","title":"","url":"https://p0.ssl.img.360kuai.com/t01775bf69594a5982d.jpg","width":"872"},{"desc":"","height":"244","title":"","url":"https://p0.ssl.img.360kuai.com/t0118164d49b8343d9f.jpg","width":"988"},{"desc":"","height":"517","title":"","url":"https://p0.ssl.img.360kuai.com/t012eb9e820c69cf8c1.jpg","width":"1070"},{"desc":"","height":"632","title":"","url":"https://p0.ssl.img.360kuai.com/t0187c4ce0c84f55ee6.jpg","width":"786"},{"desc":"","height":"112","title":"","url":"https://p0.ssl.img.360kuai.com/t01a127b69607c767f0.jpg","width":"1074"},{"desc":"","height":"175","title":"","url":"https://p0.ssl.img.360kuai.com/t0199345e20ab28021c.jpg","width":"1200"},{"desc":"","height":"360","title":"","url":"https://p0.ssl.img.360kuai.com/t01777899ce118dde1e.jpg","width":"1200"},{"desc":"","height":"92","title":"","url":"https://p0.ssl.img.360kuai.com/t0192ea7cbfd48d48e3.jpg","width":"1072"},{"desc":"","height":"498","title":"","url":"https://p0.ssl.img.360kuai.com/t01a9dddc71f83cae35.jpg","width":"992"},{"desc":"","height":"446","title":"","url":"https://p0.ssl.img.360kuai.com/t0140c6745e973bdf93.jpg","width":"1200"},{"desc":"","height":"270","title":"","url":"https://p0.ssl.img.360kuai.com/t012f03ba23253dd1e1.jpg","width":"1026"},{"desc":"","height":"240","title":"","url":"https://p0.ssl.img.360kuai.com/t01cbf53ea96487af46.jpg","width":"974"},{"desc":"","height":"161","title":"","url":"https://p0.ssl.img.360kuai.com/t01d0a079ea2e8a934c.jpg","width":"1200"},{"desc":"","height":"830","title":"","url":"https://p0.ssl.img.360kuai.com/t01bf33c8d0b48c8559.jpg","width":"1200"},{"desc":"","height":"1454","title":"","url":"https://p0.ssl.img.360kuai.com/t01a0591d870281d9c7.jpg","width":"1320"},{"desc":"","height":"204","title":"","url":"https://p0.ssl.img.360kuai.com/t01e817d910d3bcacac.jpg","width":"1256"},{"desc":"","height":"302","title":"","url":"https://p0.ssl.img.360kuai.com/t01198c218668fc3fcc.jpg","width":"852"},{"desc":"","height":"818","title":"","url":"https://p0.ssl.img.360kuai.com/t01b44bf0047dc4fb38.jpg","width":"1200"},{"desc":"","height":"643","title":"","url":"https://p0.ssl.img.360kuai.com/t0166cdc3e96f97cbaa.jpg","width":"1200"},{"desc":"","height":"1684","title":"","url":"https://p0.ssl.img.360kuai.com/t0150eab4d3a5fb7fc1.jpg","width":"1406"},{"desc":"","height":"561","title":"","url":"https://p0.ssl.img.360kuai.com/t018e3cef7d4c0ad9b4.jpg","width":"1200"},{"desc":"","height":"277","title":"","url":"https://p0.ssl.img.360kuai.com/t015ff5eb4203268279.jpg","width":"1200"},{"desc":"","height":"631","title":"","url":"https://p0.ssl.img.360kuai.com/t01fc7109e212465d90.jpg","width":"1200"},{"desc":"","height":"631","title":"","url":"https://p0.ssl.img.360kuai.com/t014f65ba9dba304dec.jpg","width":"1200"},{"desc":"","height":"631","title":"","url":"https://p0.ssl.img.360kuai.com/t01b25a4447b7adeb87.jpg","width":"1200"},{"desc":"","height":"631","title":"","url":"https://p0.ssl.img.360kuai.com/t01fe89f644d2c6acf6.jpg","width":"1200"}]}],"original":0,"pat":"qgc,art_src_3,fts0,sts0","powerby":"hbase","pub_time":1692693240000,"pure":"","rawurl":"http://zm.news.so.com/12bb494c6999c2d82d546af980c8cf7c","redirect":0,"rptid":"28c81838a3715ea6","rss_ext":[],"s":"t","src":"量子位","tag":[],"title":"混合精度下位置编码竟有大坑,LLaMA等主流开源模型纷纷中招
廉尚田3650矩阵乘法2x2乘3x3 -
弓之店19392078490 ______ 矩阵乘法一定是第一个矩阵列数等于第二个矩阵行数. 你这样乘是不对的.
廉尚田36502x3矩阵的乘法怎么算? -
弓之店19392078490 ______ 2x3矩阵,左边矩阵第一行的元素分别与右边矩阵第一列的元素相乘,求和得到相乘矩阵的第一行的第一个元素.左边矩阵第一行的元素分别与右边矩阵第二列的元素相乘,求和得到相乘矩阵的第一行的锋伍第二个元素.以此类推. 具体方法如下图: 设m*n的矩阵A与n*s矩阵B相乘,得到m*s的矩阵C.矩阵C的第i行第j列的元素Cij就是取A的第i行、B的第j列,然后对应散扒元素相乘. 这是2*3矩阵与3*3矩阵相乘银掘或的具体结果,可以比对一下.关键还是要掌握一般矩阵乘法的判定方法、基本规则.
廉尚田3650矩阵乘法公式 -
弓之店19392078490 ______ 您好,答案如图所示: 用定义规则计算吧 很高兴能回答您的提问,您不用添加任何财富,只要及时采纳就是对我们最好的回报 .若提问人还有任何不懂的地方可随时追问,我会尽量解答,祝您学业进步,谢谢. ☆⌒_⌒☆ 如果问题解决后,请点击下面的“选为满意答案”
廉尚田3650线性代数,计算乘积, -
弓之店19392078490 ______[答案] 3 =(-1x2+2x1+3x3)=(9) 4 第一个矩阵的第一行,乘以第二个矩阵的第一列: 2x1+1x0+4x1+0x4=6 第一个矩阵的第一行,乘以第二个矩阵的第二列: 2x3+1x(-1)+4x(-3)+0x0=-7 第一个矩阵的第一行,乘以第二个矩阵的第三列: 2x1+1x2+4x1+0x(-2)=8 ...
廉尚田3650矩阵的乘法运算 -
弓之店19392078490 ______ 2行2列矩阵 乘以 2行3列矩阵 所得的矩阵是:2行3列矩阵 最后结果为:|1 3 5| |0 4 6| |a b| |e f g| |ae+bh af+bi ag+bk| |c d| 乘以 |h i k| 等于 |ce+dh cf+di cg+dk| 不知道你能不能看出来, 前一矩阵的第一行对应元乘以后一矩阵第一列对应元之和为新...
廉尚田3650画图表示下面算式的含义3x3 -
弓之店19392078490 ______ 表格表示3*3
廉尚田36503x3矩阵伴随矩阵怎么求
弓之店19392078490 ______ 3x3矩阵伴随矩阵的求法是:主对角元素是将原矩阵该元素所在行列去掉再求行列式.非主对角元素是原矩阵该元素的共轭位置的元素去掉所在行列求行列式乘以(-1)^(x+y)x,y为该元素的共轭位置的元素的行和列的序号,序号从1开始的.在线性代数中,一个方形矩阵的伴随矩阵是一个类似于逆矩阵的概念.如果矩阵可逆,那么它的逆矩阵和它的伴随矩阵之间只差一个系数.然而,伴随矩阵对不可逆的矩阵也有定义,并且不需要用到除法.
廉尚田3650如何利用初等变换将一个3X3矩阵变成两个3X2和2X3的矩阵乘积、 -
弓之店19392078490 ______[答案] 这个貌似很麻烦,而且可能存在错误. 3*2和2*3的矩阵的秩最多只能为2,故这样的两个矩阵相乘的结果的秩最多只能为2. 若A(原3*3矩阵)的秩也≤2,那么可以按下面步骤实现: 【理论上讲任何一个方阵都可以经过满秩初等行列变换化为标准型...
廉尚田3650设A为3x3矩阵,A*是A的伴随矩阵,若|A|=2,求|A*|.如果不知道有这|A*| = |A|^(n - 1)结论的话, -
弓之店19392078490 ______[答案] 由公式 AA* = |A|E 等式两边取行列式 |A||A*| = |A|^3 所以 |A*| = |A|^2 = 4
廉尚田3650编程计算两个3*3矩阵乘积 -
弓之店19392078490 ______ #include"stdio.h" void main() { int a[3][2],b[2][3],c[3][3]; int i,j,k; for(i=0;i<3;i++)//输入 { for(j=0;j<2;j++) scanf("%d",&a[i][j]); } for(i=0;i<2;i++)//输入 { for(j=0;j<3;j++) scanf("%d",&b[i][j]); } for(i=0;i<3;i++)//计算 { for(j=0;j<3;j++) { c[...