发布日期:2024-11-29 13:07 点击次数:75
机器之心报谈パナソニック 分電盤 大形リミッタースペースなし 露出・半埋込両用形
裁剪:蛋酱
一个灵验的复杂系统老是从一个灵验的通俗系统演化而来的。——John Gall
在 Transformer 模子中,位置编码(Positional Encoding) 被用来默示输入序列中的单词位置。与隐式包含规章信息的 RNN 和 CNN 不同,Transformer 的架构中莫得内置处理序列规章的机制,需要通过位置编码显式地为模子提供序列中单词的位置信息,以更好地学习序列关系。
位置编码每每通过数学函数生成,主义是为每个位置生成一个私有的向量。这些向量在镶嵌空间中具有特定的性质,比如周期性和连气儿性。
在最近的一篇著述中,HuggingFace 机器学习工程师 Christopher Fleetwood 先容了缓缓发现 Transformer 模子中开头进位置编码的智商。为此,作家会陈说怎样握住纠正位置编码智商,最终变成旋转位置编码 (RoPE),并在最新的 LLama 3.2 版块和大大王人当代 Transformer 中使用。在读这篇著述前,你需要掌持一些基本的线性代数、三角学和高傲目力的学问。
问题叙述
与扫数问题一样,最好开端了解咱们想要完毕的主义。Transformer 中的高傲目力机制用于领略序列中 token 之间的关系。高傲目力是一种集结运算,这意味着它是置换等变的。如若咱们不应用位置信息来丰富高傲目力,就无法细目好多热切的关系。
例如证明最能证明这少量。
磋商一下这个句子,其中并吞个单词出当今不同的位置:
「这只狗追逐另一只狗」
直不雅地看,「狗」指的是两个不同的实体。如若咱们开端对它们进行 token 化,映射到 Llama 3.2 1B 的着实 token 镶嵌,并将它们传递给 torch.nn.MultiheadAttention ,会发生什么。
import torchimport torch.nn as nnfrom transformers import AutoTokenizer, AutoModelmodel_id = \"meta-llama/Llama-3.2-1B\"tok = AutoTokenizer.from_pretrained(model_id)model = AutoModel.from_pretrained(model_id)text = \"The dog chased another dog\"tokens = tok(text, return_tensors=\"pt\")[\"input_ids\"]embeddings = model.embed_tokens(tokens)hdim = embeddings.shape[-1]W_q = nn.Linear(hdim, hdim, bias=False)W_k = nn.Linear(hdim, hdim, bias=False)W_v = nn.Linear(hdim, hdim, bias=False)mha = nn.MultiheadAttention(embed_dim=hdim, num_heads=4, batch_first=True)with torch.no_grad(): for param in mha.parameters(): nn.init.normal_(param, std=0.1) # Initialize weights to be non-negligibleoutput, _ = mha(W_q(embeddings), W_k(embeddings), W_v(embeddings))dog1_out = output[0, 2]dog2_out = output[0, 5]print(f\"Dog output identical?: {torch.allclose(dog1_out, dog2_out, atol=1e-6)}\") #True
不错看到,如若莫得任何位置信息,那么(多头)高傲目力运算的输出关于不同位置的调换 token 是调换的,尽管这些 token 昭着代表不同的实体。
让咱们驱动筹画一种应用位置信息增强高傲目力的智商,以便它不错细目按位置编码的单词之间的关系。
为了领略和筹画最好编码决议,让咱们探讨一下这种决议应具备的一些设想特质。
设想特质
属性 1 :每个位置的唯独编码(跨序列)
每个位置王人需要一个非论序列长度怎样王人保持一致的唯独编码 - 非论现时序列的长度是 10 如故 10,000,位置 5 处的象征王人应该具有调换的编码。
属性 2 :两个编码位置之间的线性关系
位置之间的关系在数学上应该是通俗的。如若知谈位置 p 的编码,那么测度位置 p+k 的编码就应该很通俗,这么模子就能更容易地学习位置方式。
如若你想一想如安在数线上默示数字,就不难领略 5 距离 3 是 2 步,或者 10 距离 15 是 5 步。不异的直不雅关系也应该存在于编码中。
属性 3:可泛化到比练习中遭逢的序列更长的序列上
为了提高模子在执行天下中的实用性,它们应该在练习散布除外泛化。因此,编码决议需要有弥散的适合性,以处理出东谈主预想的输入长度,同期又不违反任何其他设想特质。
属性 4:由模子不错学习细目性流程生成
如若位置编码能从一个细主义流程中产生,那将是最设想的。这么,模子就能灵验地学习编码决议背后的机制。
属性 5:可推广至多个维度
跟着多模态模子成为常态,位置编码决议必须不祥当然地从 1D 推广到 nD。这将使模子不祥使用像图像或脑部扫描这么的数据,它们差异是 2D 和 4D 的。
整数位置编码パナソニック 分電盤 大形リミッタースペースなし 露出・半埋込両用形
咱们开端猜想的智商是将 token 位置的整数值添加到 token 镶嵌的每个重量中,取值范畴为 0→L,其中 L 是现时序列的长度。
IntegerEncoding
在上头的动画中,咱们为索引中的 token 创建了位置编码向量,并将其添加到 token 镶嵌中。这里的镶嵌值是 Llama 3.2 1B 中着实值的子集。不错不雅察到,这些值王人集结在 0 隔邻。这么不错幸免在练习流程中出现梯度消释或爆炸的情况,因此,咱们但愿在通盘模子中王人能保持这种情况。
很显明,目下的智商会带来问题,位置值的大小远远高出了输入的本体值。这意味着信噪比终点低,模子很难从位置信息平分离出语义信息。
有莫得更好的智商来确保咱们的数字介于 0 和 1 之间呢?如若咱们崇拜念念考一段时候,也许会猜想将十进制数退换为二进制数。
二进制位置编码
咱们不错将其退换为二进制默示法,并将咱们的值(可能已归一化)与镶嵌维度相匹配,而不是将咱们的(可能已归一化的)整数位置添加到镶嵌的每个重量中,如下图所示。
BinaryEncoding
咱们将感酷爱酷爱的位置(252)退换为二进制默示(11111100),并将每一位添加到 token 镶嵌的相应组件中。最小灵验位(LSB)将在每个后续象征的 0 和 1 之间轮回,而最大灵验位(MSB)将每 2^(n-1) 个 token 轮回一次,其中 n 是位数。你不错不才面的动画中看到不同索引的位置编码向量。
咱们照旧贬责了数值范畴的问题,当今咱们有了在不同序列长度上保持一致的唯独编码。如若咱们绘画 token 镶嵌的低维版块,并可视化不同值的二进制位置向量的加法,会发生什么情况呢?
不错看到,为止终点「跨越」(正如咱们对二进制毁坏性的预期)。优化流程可爱平滑、连气儿和可预测的变化。那么有哪些具有雷同取值范畴的函数是平滑连气儿的吗?
如若咱们稍加属意,就会发现 sin 和 cos 王人适宜条目!
正弦位置编码
上头的动画形象地展示了咱们的位置镶嵌,如若每个重量王人是由波长渐渐加多的 sin 和 cos 轮流绘画而成。如若将其与之前的动画进行相比,你会发现两者有惊东谈主的相似之处。
当今,咱们照旧掌持了正弦波镶嵌的智商,这领先是在《Attention is all you need》论文中界说的。让咱们来望望方程式:
其中,pos 是词块位置索引,i 是位置编码向量中的重量索引,d 是模子维度。10,000 是基本波长(下文简称为 θ),咱们证据重量索引的函数对其进行拉伸或压缩。我饱读舞环球输入一些本体值来感受这种几何级数。
这个等式有几个部分乍看之下令东谈主困惑。作家是怎样选择 10,00 的?为什么偶数和奇数位置差异使用 sin 和 cos?
磋商一串正弦和余弦对,每对王人与频率 ω_i 关联联。咱们的主义是找到一个线性变换矩阵 M,它能将这些正弦函数移动一个固定的偏移量 k:
自慰女孩频率 ω_i 随维度指数 i 递减,其几何级数为:
要找到这个变换矩阵,咱们不错将其默示为一个包含未知总共 u_1、v_1、u_2 和 v_2 的一般 2×2 矩阵:
证据三角加法定理,咱们不错将右边的公式推广为:
通过匹配总共,此张开式为咱们提供了两个方程的系统:
通过相比双方的 sin (ω_ip) 和 cos (ω_ip) 项,咱们不错解出未知总共:
这些贬责决议为咱们提供了最终的变换矩阵 M_k:
如若你畴昔作念过游戏编程,你可能会发现咱们的推导为止终点熟悉。没错,这即是旋转矩阵。
因此,早在 2017 年,Noam Shazeer 在《Attention is all you need》论文中筹画的编码决议就照旧将相对位置编码为旋转。从正弦编码到 RoPE 又花了 4 年时候,尽管旋转照旧摆在桌面上......
完全 vs 相对位置编码
在了解了旋转在这里的热切性之后,让咱们回到咱们的激发样本,尝试为下一次迭代发现一些直观。
在上头,咱们不错看到 token 的完全位置,以及从 chased 到其他 token 的相对位置。通过正弦编码,咱们生成了一个单独的向量来默示完全位置,并使用一些三角函数期间来编码相对位置。
当咱们试图领略这些句子时,这个单词是这篇博文的第 2149 个单词热切吗?如故咱们良善它与周围单词的关系?一个单词的完全位置对其风趣风趣来说很少热切,热切的是单词之间的关系。
高下文中的位置编码
从这少量启航,在高傲目力的布景下磋商位置编码是要津。重申一下,高傲目力机制使模子不祥估量输入序列中不同元素的热切性,并动态调理它们对输出的影响。
在咱们畴昔的迭代中,咱们照旧生成了一个单独的位置编码向量,并在 Q、 K 和 V 投影之前将其添加到咱们的 token 镶嵌中。通过将位置信息平直添加到 token 镶嵌中,咱们正在用位置信息欺凌语义信息。咱们应该尝试在不修改规范的情况下对信息进行编码。转向乘法是要津。
使用字典类比,当查找一个词 (查询) 在咱们的字典 (键) ,隔邻的词应该比远方的词有更多的影响。一个 token 对另一个 token 的影响是由 QK^T 点积决定的 —— 是以这恰是咱们应该关注位置编码的处所。
上头露馅的点乘的几何讲授给了咱们一个知悉:咱们不错通过加多或减小两个向量之间的夹角来调理咱们的两个向量的点积的为止。此外,通过旋转向量,咱们对向量的范数完全莫得影响,这个范数编码了咱们 token 的语义信息。
因此,当今咱们知谈重目力集结在那处,况兼从另一个角度看到了为什么旋转可能是一个合理的「通谈」,在其中编码咱们的位置信息,让咱们把它们放在一齐。
旋转位置编码
RoForm 的论文中界说了旋转位置编码或 RoPE (苏剑林在他的博客中独处筹画了它)。如若你平直跳到最终为止,这看起来像是巫术,通过在高傲目力 (更具体地说是点积) 的布景下念念考正弦编码,咱们不错看到它是怎样整合在一齐的。
就像在 Sinusoidal Encoding 一样,咱们把向量 (q 或 k,而不是事先投影 x) 阐发成 2D 对 / 块。咱们莫得平直编码完全位置,而是加入一个咱们从频率清静递减的正弦函数中索要的矢量,咱们切入 chase,通过将每对旋转矩阵相乘来编码相对位置。
设 q 或 k 是位置为 p 的输入向量。咱们创建了一个块对角矩阵,其中 M_i 是该组件对所需旋转的对应旋转矩阵:
与正弦编码终点相似,M_i 是通俗的:
在实践中,咱们不使用矩阵乘法来测度 RoPE,因为使用这么一个寥落的矩阵会导致测度为止低下。违反,咱们不错应用测度中的规则方式,将旋转平直应用于独处的元素对:
即是这么!通过玄机地将咱们的旋转应用于点积之前的 q 和 k 的 2D 块,并从加法退换为乘法,咱们不错在评估中获取很大的性能进步。
将 RoPE 推广到 n 维
咱们照旧探讨了 1D 情况下的 RoPE,这少量,我但愿你照旧获取了一个直不雅的领略,公认的非直不雅构成部分的 transformer。终末,让咱们探索怎样将其推广到更高的维度,例如图像。
在 1D 情况下,咱们通过从输入向量旋转一双值来编码相对位置 m-n。关于 2D 数据,咱们需要编码水温暖垂直的相对位置,比如 m-n 和 i-j 是独处的。RoPE 的上风在于它怎样处理多个维度。咱们莫得尝试在一个旋转中编码扫数位置信息,而是将并吞维度内的组件配对并旋转它们,不然咱们将羼杂使用 x 和 y 偏移量信息。通过独处处理每个维度,咱们保持了空间的当然结构。这不错证据需要履行到纵情多个维度!
位置编码的异日
RoPE 是位置编码的最终化身吗?DeepMind 最近的一篇论文(https://arxiv.org/pdf/2410.06205)深远分析了 RoPE,并强调了一些基本问题。
我瞻望异日会有一些冲破,也许会从信号处理中获取灵感,比如小波或者分层完毕。跟着模子越来越多地被量化用于部署,我也但愿在编码决议中看到一些调动,这些编码决议在低精度算术下仍然具有鲁棒性。
参考联贯:https://fleetwood.dev/posts/you-could-have-designed-SOTA-positional-encoding