从OpenAI ChatGPT火热之后,国内外各公司或机构发布的大模型大多都基于OpenAI已公开的基本流程,即以下4步:
- 预训练模型
- 有监督微调SFT
- 训练奖励模型RM
- 基于人类反馈的强化学习RLHF
最近几个月业界在整理流程上没有大的创新,各家只是在每个步骤里使用了一些不同的方法,新技术的出现不像前端时间那么频繁,之前In-context leanring、Prompt Tuning、Chain-of-Thought等技术一个接一个应接不暇。
在这种情况下,系统深入地学习总结大模型的某些基础组件不失为学习大模型的一种好方法。目前绝大多数大模型都使用Transformer结构,其中的位置编码是一个重要组件,并且近几年有不少对其研究改进的方法,本文记录我学习记录的内容。
1
Transformer位置编码基础知识
对文本句子的处理,每个字(字更好理解,准确说是各种不同粒度的token,字是一个例子)的位置是重要的输入信息,因为相同的一串字如果位置不一样表达的意思可能千差万别,如何把位置信息输入模型就是一个重要的问题。目前主要的方法都是把位置信息在计算self-attention之前作为输入的一部分。
以进行变换得到query、key、value向量q、k、v,此时把位置信息加入,得到函数表达为:
其中同理表示第n个token考虑了位置信息n后的key和value向量。
下一步就是attention权重和输出计算了:
所以Transformer的位置编码,本质上就是如何设计上面的f()函数的问题,把位置信息考虑进去。
2
绝对位置编码
最简单的考虑,可能会认为位置信息很简单,直接使用每个token的位置编号1,2,3...不就行了,但越往后面编号就越大,直接用来当位置计算是不恰当的。下面主要介绍两种绝对位置编码方式。
2.1训练式
既然直接用1,2,3...编号不恰当,神经网络一贯做法就是初始化一个值让网络去学习好了。比如若模型支持最大token长度256,位置编码向量长度128,就初始化一个256*128的位置编码向量矩阵,让模型在训练过程中不断学习更新,最终的值作为位置向量信息。BERT、GPT、ERNIE、ALBERT、Electra就使用的这种方法。
BERT和GPT刚出来的时候,对token的最大长度要求不太高,不像现在最新的大模型最大token长度上万。训练式方法得到的位置信息最大的问题就是支持的最大长度是固定的,因为每个位置训练得到的位置信息只能代表该位置,最大长度512训练得到的模型,没法支持长度大于512的场景,就是现在说的不支持大模型的 外推性 。
2.2三角函数式
Transformer原始论文中,使用了如下Sinusoidal 三角函数表示位置信息:
其中,表示第2t+1分量即奇数索引对应的值。
由于三角函数是周期函数,可以认为该方法有一定的外推性。
3
相对位置编码
相对位置编码使用相对的位置信息,总体上能解决模型外推性的问题。使用相对位置编码比较有名的模型有Transformer-XL、T5、DeBERTa等,他们各自的实现又有区别。网上看到两种不同的解释方法,每种方法都按照其理论把多个模型的实现统一在一个公式下。
3.1 统一解释方法之一
第一种方法来自张义策知乎文章https://zhuanlan.zhihu.com/p/415020704,相对位置编码在计算attention的时候,直接考虑两个token之间的相对位置信息,抽象出来就是:
以下摘抄自知乎原文,不同模型相对位置信息实现的不同就在于
上述抽象出来在统一公式下的解释很优美。
3.2 统一解释方法之二
第二种方法来自苏剑林 https://spaces.ac.cn/archives/8130
认为相对位置编码由绝对位置编码启发而来,在绝对位置编码中把位置信息和token输入向量相加,然后把计算attention中的q*k扩展开,对扩展开后的各项做不同处理,就得到了各个模型的相对位置编码,本质上和第一种方法是一致的。展开公式如下:
3.2.1 Google的经典式相对位置编码 和华为NEZHA模型在此基础上把第一位置项去掉,简化为:
相对位置即,具体定义为:
其中i-j既是相对位置的体现。
3.2.2 Transformer-XL 也使用相对位置编码,把上述公式进一步展开:
把乘上权重部分直接设为可训练的参数u、v,得到:
3.2.3 T5模型 更简化,在3.2.2的展开式中,直接去掉中间两项,原因是中间两项都是输入和位置的关系,应该是相对独立的,相关性不大。第四项目是相对位置之间的关系,直接设为可训练的参数,最终变为:
它就是在attention基础上加了个代表相对位置的偏移项,和3.1中最基本那个公式一致。
3.2.4 DeBERTa模型 和T5相反,去掉了原始展开式的第四项,保留了第二、三项目并替换为相对位置编码:
并且DeBERTa实验效果比T5还好,说明各种解释只要能找到合理角度都可能行得通,哪怕是相反的方向。也说明只要能解释通,神经网络就能给你学好。
4
旋转位置编码RoPE
把旋转位置编码单独当成一节,是因为它使绝对位置编码和相对位置编码融为一体,也可以说通过绝对位置编码的方式实现相对位置编码,和前面单独的绝对位置编码和相对位置编码都有区别。它是苏剑林等人提出的一种编码方式,最近开源大模型里最热门的LLaMA,以及ChatGLM就用了RoPE,说明了它的有效性和重要性。
Attention的核心计算是q和k的内积计算,RoPE的想法就是要找到一个内积结果里带有相对位置信息,即要求下面恒等式的一个解:
等式左边是带位置信息的q、k的内积,右边含有相对位置信息的函数。
经过一堆复杂的推导后,得到的内积函数的复数形式如下:
从复数的意义上理解,其实就是在原有q向量的基础上做了个旋转,所以叫做“ 旋转位置编码 ”。
在维度为2的时候,其矩阵形式表示为:
任意偶数维的RoPE,可以表示为二维情形的拼接:
加上位置信息后q、k内积可表示为:
其中的n-m表示了相对位置信息,可以看出RoPE是从绝对位置编码出发,表示了相对位置信息。具体公式推导请阅读作者原文https://spaces.ac.cn/archives/8265
以上就是目前基于Transformer结构的大模型的主要位置编码方式。
参考文章:
https://spaces.ac.cn/archives/8130 苏剑林 《让研究人员绞尽脑汁的Transformer位置编码》
https://zhuanlan.zhihu.com/p/659505866 Wave 《大模型位置编码 利落干脆朴素总结》
https://zhuanlan.zhihu.com/p/415020704 张义策 《六种位置编码的代码实现及性能实验》
https://spaces.ac.cn/archives/8265 苏剑林 《Transformer升级之路:2、博采众长的旋转式位置编码》