大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调重新阅读。而最新科技(Mamba,xLSTM,KAN)则提供了大模型领域最新技术跟踪。若对于具身智能感兴趣的请移步具身智能专栏。技术宅麻烦死磕AI架构设计。
6月份第一天CoPE诞生了。与传统基于Token的位置编码不一样,CoPE采用上下文进行位置编码,进而帮助LLMs更好地进行计数任务。
快速总览
研究人员提出了一种新颖的位置编码方法,称为上下文位置编码(下文称之为CoPE),它有别于基于标记的传统位置编码范式。
-
它以上下文依赖的方式测量位置,在按位置寻址时会更加自由
-
它在如下的任务中获得不错的收益:Flip-Flop, Selective Copy, Counting, Language Modeling, and Code Modeling tasks
-
它优于现有方法,尤其是在域外泛化场景
-
它有可能改善其他领域的编码,例如视频和语音。在这些领域,基于Token位置的编码不太合适。
位置编码的思考
大型语言模型(LLMs)如何理解句子中单词的顺序?这是语言理解的关键部分,这样的机制称为位置编码( Positional Encoding)。
先考虑一个简单的例子:“狗坐在椅子上”。若只给出LLM一个单词列表“dog、sat、on、the、chair”,它不知道哪个单词排在第一位、第二位,而位置编码此时就大派用场。
位置编码主要是用于添加有关序列中每个单词位置的信息,帮助大模型解码个中含义。从常识出发,有很多不同的方法可以实现。例如绝对位置编码,其中每个单词都被分配一个表示其位置的唯一向量;还有相对位置编码,其中相对于当前单词测量位置。但是,这两种方法都基于对Token进行计数编码,而不考虑上下文。
上图为传统Transformer的位置编码
在这里举个例子,假如n=10000(超参数,可以设置),L=6(输入序列长度),d_model=4(向量维度)。那么下图为每个Token的编码向量P0,……,P5的计算方法。这里值得一提的是P下标0,……5某种意义上就是每个Token的位置信息。
研究人员认为现有的位置编码方法不足以完成更复杂的任务,例如理解句子或段落的结构,因此CoPE(上下文位置编码)诞生。它与上下文相关,也意味着一个单词的位置不仅取决于它在序列中的数字位置,还取决于它与其他单词的关系以及文本的整体结构。
上图体现了新的位置编码和传统相对位置编码之间的区别。传统的方法从11开始一直延续到0(最近)。仔细观察,CoPE的位置编码和Q和K相关。
传统的位置编码
绝对位置编码:想象一个单词序列,每个单词都有一个与之关联的唯一向量。此向量表示其在序列中的位置。因此,第一个单词有一个表示位置 1 的向量,第二个单词有一个表示位置 2 的向量,依此类推。
相对位置编码:相对位置编码考虑单词在序列中的相对位置。它不是为每个位置分配一个固定的向量,而是计算当前单词和它所关注的单词之间的距离。例如“前N个单词”、“后退M个单词”等。
论文中给出了一个例子,给出一段文字,问它某个单词出现几次。结果GPT4和Llama2都扑街了。
因为模型依赖于标记位置,当单词与上次出现之间的距离很大或序列长度不可预测时,标记位置可能不精确。
下图为论证过程,没兴趣的读者可以跳过。大致的意思就是假设有个输入“yyyyxyyyy……”,若是序列过长,大于某个阈值(i > Δ/δ )则大模型则无法关注到x。
CoPE
CoPE提供了一种新颖的方法,通过考虑上下文来解决现有方法的局限性。对于序列中的每个单词,CoPE 会计算每个前一个单词的门值(gate value)。门值是通过将当前单词的查询向量与前一个单词的键向量进行比较来确定的。门值为 1 表示前一个词很重要,在位置测量中应予以考虑。值为 0 表示前一个单词不相关。
CoPE 使用门值的累积总和来计算每个单词相对于当前单词的位置。这意味着位置编码不仅是一个数字,而是相关单词的计数。
由于位置编码不一定是整数,所以CoPE使用整数位置之间的插值来生成位置嵌入(Embedings)。然后嵌入添加到K向量,从而允许Q向量在注意力机制中使用。
一头雾水,没关系,拿论文的实例来讲解下。
假如输入为“Alice was tired. She tried reading. A rabbit came”,当前的单词为“came”。
-
CoPE 将首先计算此序列中每个单词的门值。例如,单词“tired”的门值可能为1,表示它与当前单词相关,而“rabbit”的门值可能为0,表示不相关。
-
然后,CoPE 将使用这些门值的累积总和来计算数值。例如,“tired”相对于最后一个单词“came”的位置可以认为是2。
-
紧接着CoPE 将为位置2生成一个位置嵌入,该位置嵌入将是位置1和3的之间的插值。
-
最后,将获得到的位置嵌入加到单词“tired”的K向量中,允许模型根据其上下文位置(而不仅仅是其在序列中的数字位置)来关注“tired”。
当然实际的算法比较复杂,上面仅仅是为了辅助理解。一般而言注意力的运算如下公式,其实就是上面那张可视化的数学表达方法
而CoPE则利用Qi和Kj相乘过激活函数σ,累加得到Pij。
这个时候pij不一定是个整数,因此不能像RoPE一样将Pij进行变换得到位置编码向量。因此首先针对每个p ∈ [0, T]分配一个可以学习的编码向量e[p],然后按照下面的公式进行插值处理。
最终在进行注意力的计算:
小结
这幅图展示了CoPE可以将注意力集中在抽象元素上,例如当前段落(左)和章节(右)。这里展示了Wikitext-103上仅由位置引起的注意力。由于CoPE是语境化的,它根据段落和章节的位置来关注它们。在左侧,可以它留意到了各段由换行符分隔(用黑色加号标记),而右侧则留意到章节标题分隔,例如“==说明==”(黑色加号记)。
最后来看看它的荣誉墙,Flip-Flop Task要求模型记住特定单词的最后一次出现,并在可以有“ignore”指令的序列中找回其相关的部分。CoPE 在此任务中的表现优于现有方法,尤其是在当前单词与最后一个“w”之间的距离远远超出的场景。
Selective Copy Task要求模型有选择地从序列中复制标记,跳过指定的“空白”标记。CoPE 在这项任务上获得了满分,显示了它处理特定单词和排除不需要的元素的能力。
CoPE 还在代码任务上进行了测试。实验表明与传统方法相比,它提高了困惑度分数。这表明CoPE在更多结构化数据领域中可能有一定的提升。