Reformer RoPE,旋转位置编码,关于Transformer当中的位置编码的优化考察

2023-11-11

1. 工作简介
这篇文章是苏剑林的一篇关于Transformer当中的位置编码的优化考察

众所周知,transformer的attention机制本身是不带有位置信息的,因此对于文本序列,attention机制本身就会丢失掉原文当中的序列信息,造成信息缺失,影响到模型的效果表达,这个应该已经算是面试中常见的八股文问题了。

但是,对于位置编码的具体实现,大概会去考虑这个问题的人就大幅减少了。而苏剑林这里就是对这部分内容进行了详细的考察和优化尝试,这点真心还是很佩服他的。

2. 常见位置编码方式
首先,我们来考察一下现有的一些位置编码的方法。

这部分的内容我们主要参考苏剑林的博客《让研究人员绞尽脑汁的Transformer位置编码》进行一些自己的整理。

1. 绝对位置编码
1. Bert
绝对位置编码的一个典型的例子就是Bert模型。

他的思路非常的简单粗暴,既然attention层本身无法识别位置信息,那么我就在输入当中显式地多加一个序列位置信号,然后让模型自己去学习这个序列位置信号的分布。

具体来说,就是讲原本的输入xi 变成了 ,其中, 表示的就是第i个位置的绝对位置编码

这种编码方式的好处在于说简单直接,而且模型直接参数拟合的方式也不会产生人为的信号偏差,但是缺点在于说推理阶段只能使用训练中预先定义好的位置编码,比如bert,最大输入句长就是512,超过了512模型就失去了编码能力。

此外,位置编码的训练充分度也会是一个需要考虑的问题。

2. Attention Is All You Need
绝对位置编码的另一个典型例子就是vanilla transformer

不过,不同于Bert那样直接交给模型去训练position embedding,经典Transformer的位置Embedding的定义是直接通过三角函数的方式进行预先定义好的。

他的出发点在于说参考了三角函数的性质:



  
=cosα⋅cosβ−sinα⋅sinβ
=sinα⋅cosβ−cosα⋅sinβ

这个性质刚好可以用于描述两个位置之间的相对距离关系。

因此,文中先验地给出一个人工预设的位置编码如下:

 

其中,表示第个位置,,表示position embedding当中某一个具体维度上的值。

 

可以看到,这样的情况下位置表征就是先验确定的了,我们无需交由模型进行额外地拟合,而且长度使用上也更加自由,基本没有长度限制,但是代价就是给模型增加了人工的先验限制,学习到的embedding特征不但要满足token本身的信息表征,还要满足三角函数形式的数据分布表达,收缩了解空间的表达域。

2. 相对位置编码
在考察相对位置编码之前,我们首先来看一下位置编码到底做的是一个什么样的事。

它本质上就是在原本的词向量上面额外地加上一个用于标定位置信息的位置向量 ,从而使得attention层的输入带有位置信息

我们将attention层的运算进行具体的展开如下:


我们将位置向量p 写入之后可以得到:

 

因此,事实上位置向量的加入本质上也可以通过加入偏置矩阵的方式直接作用到Attention矩阵A 以及V上面。

1. 经典相对位置编码
相对位置编码的思路来自于文献Self-Attention with Relative Position Representations。

如前所述,位置编码的核心就是给每一个位置添加一个具体的position embedding从而令attention层的输入可以识别出其具体的位置,但是由于句长的无限性所以限制了绝对位置编码的使用方法。

而相对位置编码的核心思路就是说通过一个滑动窗口,换句话来说,就是对于每一个位置i , j i,ji,j,如果它们的相对距离相同,那么他们共享同一个position向量。

而对于句长特别长的输入,如果两个位置i , j i,ji,j的距离特别大,那么我们就对其做一个截断,从而规避掉句长带来的限制。

而关于这部分内容的具体实现,文中首先去除了Query当中包含的位置信息,从而将Attention矩阵和输出Output变成了如下的形式:



 

然后,文中将两个位置相关的矩阵直接替换成了两个相对位置的偏移矩阵,具体而言:

{ A = s o f t m a x ( Q ⋅ ( K + R K ) T d ) O = A ⋅ ( V + R V ) \left\{ \begin{aligned} A &= softmax(\frac{Q \cdot (K + R_K)^T}{\sqrt{d}}) \\ O &= A \cdot (V + R_V) \end{aligned} \right.






  
A
O

  
=softmax( 
d

 
Q⋅(K+R 
K

 ) 
T
 

 )
=A⋅(V+R 
V

 )

 

其中,R i , j R_{i,j}R 
i,j

 表示第j jj个位置相对于第i ii个位置的位置偏移向量,具体而言:

R i , j = P [ c l i p ( i − j , p m i n , p m a x ) ] R_{i, j} = P[clip(i-j, p_{min}, p_{max})]

i,j

 =P[clip(i−j,p 
min

 ,p 
max

 )]

因此,R是一个三维矩阵,即R K , R V ∈ R n × n × d R_K, R_V \in \mathbb{R}^{n \times n \times d}R 
K

 ,R 
V

 ∈R 
n×n×d
 。

故在计算中会略带一点特殊,具体而言可以表达如下:

Attn = tf.math.softmax(
    (tf.einsum("bik,bjk->bij", Q, K) + tf.einsum("bik,ijk->bij", Q, R))/tf.math.sqrt(d)
)
O =  tf.einsum("bij,bjk->bik", Attn, V) + tf.einsum("bij,ijk->bik", Attn, R)
1
2
3
4
2. XLNet
XLNet较之经典的相对位置编码进一步移除了V上面的位置信息,所有的位置信息全部都只发生在attention矩阵上面。

因此,我们这里只需要考察attention矩阵在这里的具体形式。

如前所述,Attention权重矩阵事实上就是Query(Q QQ)和Key(K KK)的内积,调整权重之后求一个softmax,因此,我们只需要看Q QQ和K KK的内积部分即可。

事实上,在后续的各种相对位置编码当中,似乎都已经只在Attention矩阵当中加入位置信息来影响权重分布,而不会对value加入权重信息。

言归正传,XLNet的位置编码加入的方式具体如下:

Q ⋅ K T = x W Q ⋅ W K T x T + x W Q ⋅ R T + u W Q ⋅ W K T x T + v W Q ⋅ R T Q \cdot K^T = xW_Q \cdot W_K^T x^T + xW_Q \cdot R^T + uW_Q \cdot W_K^T x^T + vW_Q \cdot R^T
Q⋅K 
T
 =xW 
Q

 ⋅W 
K
T

 x 
T
 +xW 
Q

 ⋅R 
T
 +uW 
Q

 ⋅W 
K
T

 x 
T
 +vW 
Q

 ⋅R 
T
 

其中,R RR的定义和经典相对位置编码中的定义相同,而u , v u,vu,v则是两个可训练的向量。

换成伪代码即:

Attn = tf.math.softmax(
    (
        tf.einsum("bik,bjk->bij", Q, K) \
        + tf.einsum("bik,ijk->bij", Q, R) \
        + tf.einsum("bik,bjk->bij", tf.matmul(u, W_Q), K) \
        + tf.einsum("bik,ijk->bij", tf.matmul(v, W_Q), R)
    )/tf.math.sqrt(d)
)
O =  tf.einsum("bij,bjk->bik", Attn, V)
1
2
3
4
5
6
7
8
9
3. T5
T5的位置信息编码则更加暴力一些,都不是使用相对位置的偏置向量,而是直接给出一个偏置矩阵,然后对这个矩阵进行训练。

具体而言:

Q ⋅ K T = x W Q ⋅ W K T x T + B Q \cdot K^T = xW_Q \cdot W_K^T x^T + B
Q⋅K 
T
 =xW 
Q

 ⋅W 
K
T

 x 
T
 +B

其中,B ∈ R n × n B \in \mathbb{R}^{n \times n}B∈R 
n×n
 就是一个权重矩阵。

Attn = tf.math.softmax(
    (tf.einsum("bik,bjk->bij", Q, K) + B)/tf.math.sqrt(d)
)
O =  tf.einsum("bij,bjk->bik", Attn, V)
1
2
3
4
4. DeBerta
DeBerta矩阵的定义与T5相反,T5是去除了位置与token的交叉项,只保留相对位置产生的偏移矩阵,而DeBerta与之相反,它去除掉了相对位置产生的偏置矩阵,但是留下了两个位置与token之间的交叉项,并将之用相对位置矩阵的方式进行保留。

具体而言:

Q ⋅ K T = x W Q ⋅ W K T x T + x W Q ⋅ W K T R T + R W Q ⋅ W K T x T Q \cdot K^T = xW_Q \cdot W_K^T x^T + xW_Q \cdot W_K^T R^T + R W_Q \cdot W_K^T x^T
Q⋅K 
T
 =xW 
Q

 ⋅W 
K
T

 x 
T
 +xW 
Q

 ⋅W 
K
T

 R 
T
 +RW 
Q

 ⋅W 
K
T

 x 
T
 

用伪代码表述就是:

Attn = tf.math.softmax(
    (
        tf.einsum("bik,bjk->bij", tf.matmul(x, W_Q), tf.matmul(x, W_K)) \
        + tf.einsum("bik,ijk->bij", tf.einsum("bil,lk->bik", x, W_Q), tf.einsum("kl,ijk->ijl", W_K, R)) \
        + tf.einsum("ijk,bjk->bij", tf.einsum("ijk,kl->ijl", R, W_Q), tf.einsum("bil,lk->bik", x, W_K))
    )/tf.math.sqrt(d)
)
O =  tf.einsum("bij,bjk->bik", Attn, V)
1
2
3
4
5
6
7
8
3. RoPE方法介绍
RoPE(Rotary Position Embedding)位置编码是Rofermer这篇文献的核心贡献点。

他的核心想法就是,借用苏剑林自己的话说:

通过绝对位置编码的方式实现相对位置编码。

如前,我们已经注意到了,相对位置编码在实现上是直接作用于attention权重矩阵的,这样的实现方式使得类似Linformer这种直接先对Attention矩阵中间结果进行投影的方式无法实现(关于Linformer相关的内容也可以参考我的博客文献阅读:Linformer: Self-Attention with Linear Complexity)。

因此,苏剑林基于复数相乘的特性设计了如下的位置编码函数:

{ f q ( x m , m ) = ( W Q x m ) ⋅ e i m θ f k ( x n , n ) = ( W K x n ) ⋅ e i n θ g ( x m , x n , m , n ) = R e [ ( W Q x m ) ( W K x n ) e i ( m − n ) θ ] \left\{ \begin{aligned} f_q(x_m, m) &= (W_Q x_m) \cdot e^{im\theta} \\ f_k(x_n, n) &= (W_K x_n) \cdot e^{in\theta} \\ g(x_m, x_n, m, n) &= Re[(W_Q x_m) (W_K x_n) e^{i(m-n) \theta}] \end{aligned} \right.








  

q

 (x 
m

 ,m)

k

 (x 
n

 ,n)
g(x 
m

 ,x 
n

 ,m,n)

  
=(W 
Q

 x 
m

 )⋅e 
imθ
 
=(W 
K

 x 
n

 )⋅e 
inθ
 
=Re[(W 
Q

 x 
m

 )(W 
K

 x 
n

 )e 
i(m−n)θ
 ]

 

对于二维情况,我们可以给出一组可行解:

f ( q , m ) = ( c o s m θ − s i n m θ s i n m θ c o s m θ ) ( q 0 q 1 ) f(q, m) = \begin{pmatrix} cos m\theta & -sin m\theta \\ sin m\theta & cos m\theta \end{pmatrix} \begin{pmatrix} q_0 \\ q_1 \end{pmatrix}
f(q,m)=( 
cosmθ
sinmθ

  
−sinmθ
cosmθ

 )( 

0

 

1

 

 )

我们很快可以仿照上述方式给出一组高维情况下的可行解:

此时,由R矩阵的稀疏性,我们可以直接用下述变换来进行替换:

f ( q , m ) = ( c o s   m θ 0 c o s   m θ 0 c o s   m θ d / 2 − 1 c o s   m θ d / 2 − 1 ) ⊗ ( q 0 q 1 . . . q d − 2 q d − 1 ) + ( s i n   m θ 0 s i n   m θ 0 s i n   m θ d / 2 − 1 s i n   m θ d / 2 − 1 ) ⊗ ( − q 1 q 0 . . . − q d − 1 q d − 2 ) f(q, m) = \begin{pmatrix} cos\ m\theta_0 \\ cos\ m\theta_0 \\ cos\ m\theta_{d/2-1} \\ cos\ m\theta_{d/2-1} \end{pmatrix} \otimes \begin{pmatrix} q_0 \\ q_1 \\ ... \\ q_{d-2} \\ q_{d-1} \end{pmatrix} + \begin{pmatrix} sin\ m\theta_0 \\ sin\ m\theta_0 \\ sin\ m\theta_{d/2-1} \\ sin\ m\theta_{d/2-1} \end{pmatrix} \otimes \begin{pmatrix} -q_1 \\ q_0 \\ ... \\ -q_{d-1} \\ q_{d-2} \end{pmatrix}
f(q,m)= 





  
cos mθ 
0

 
cos mθ 
0

 
cos mθ 
d/2−1

 
cos mθ 
d/2−1

 

  





 ⊗ 







  

0

 

1

 
...

d−2

 

d−1

 

  







 + 





  
sin mθ 
0

 
sin mθ 
0

 
sin mθ 
d/2−1

 
sin mθ 
d/2−1

 

  





 ⊗ 







  
−q 
1

 

0

 
...
−q 
d−1

 

d−2

 

  







 

而关于其具体实现,我们摘录苏剑林在他们自己在GitHub上面的伪代码实现如下:

sinusoidal_pos.shape = [1, seq_len, hidden_size] # Sinusoidal position embeddings
qw.shape = [batch_size, seq_len, num_heads, hidden_size]  # query hiddens
kw.shape = [batch_size, seq_len, num_heads, hidden_size]  # key hiddens

cos_pos = repeat_elements(sinusoidal_pos[..., None, 1::2], rep=2, axis=-1)
sin_pos = repeat_elements(sinusoidal_pos[..., None, ::2], rep=2, axis=-1)
qw2 = stack([-qw[..., 1::2], qw[..., ::2]], 4)
qw2 = reshape(qw2, shape(qw))
qw = qw * cos_pos + qw2 * sin_pos
kw2 = K.stack([-kw[..., 1::2], kw[..., ::2]], 4)
kw2 = K.reshape(kw2, K.shape(kw))
kw = kw * cos_pos + kw2 * sin_pos

# Attention
a = tf.einsum('bjhd,bkhd->bhjk', qw, kw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
4. 实验效果考察
1. 翻译任务上的表现
RoPE编码方式最直接的一个检验方法就是直接在翻译任务上测试一下,文中也是这么干的,直接在transformer当中将位置编码进行了一下替换,得到结果如下:

可以看到:

RoPE位置编码是可以正常work的。
2. 预训练任务上的表现
然后,文中考察了一下RoPE在预训练任务当中的效果,得到结果如下:

可以看到:

RoPE编码在预训练任务当中也是有效的。
3. GLUE下游Finetune效果
然后,文中还考察了一下与训练得到的模型在GLUE任务当中finetune的效果,得到结果如下:

可以看到:

在STS-B,QQP以及MRPC任务上Roformer效果优于BERT,而在剩余的三个任务当中效果不及BERT。
因此可以认为RoPE编码的效果和经典的方法各有优劣吧。

4. 中文任务中效果表达
最后,文中还在中文语料上面进行了预训练以及下游finetune任务的效果考察,得到的结果和前面基本一致。

5. 总结 & 思考
结论而言,RoPE编码较之传统的几种位置编码方式其实效果上可能难分伯仲,但是其优点在于说既不受句长的限制,又可以被应用于Linformer,这点较之于他的前辈们还是有很大的优势的。

因此,如果是选择长文本处理任务的位置编码,可能RoPE会是一个更好的选择方案。

6. 参考链接
https://kexue.fm/archives/8265
https://kexue.fm/archives/8130
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Reformer RoPE,旋转位置编码,关于Transformer当中的位置编码的优化考察 的相关文章

  • 【信道估计】【MIMO】【FBMC】未来移动通信的滤波器组多载波调制方案(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 【路径规划】基于A*算法路径规划研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 用CHAT写一份标题为职业教育教师教学能力提升培训总结

    CHAT回复 标题 职业教育教师教学能力提升培训总结 一 活动概述 本次由学校组织的职业教育教师教学能力提升培训于8月15日至8月20日顺利进行 来自全校的60位职业教育教师参与了此次培训 主讲人为享有盛名的教育专家马丁先生 二 培训内容与
  • 喜报|华测导航荣获“张江之星”领军型企业称号

    近日 2023年度 张江之星 企业培育名单发布 上海华测导航荣获2023年度 张江之星 领军型企业称号 据悉 张江之星 企业培育是上海科创办为落实 关于推进张江高新区改革创新发展建设世界领先科技园区的若干意见 张江高新区加快世界领先科技园区
  • socket网络编程几大模型?看看CHAT是如何回复的?

    CHAT回复 网络编程中常见的有以下几种模型 1 阻塞I O模型 Blocking I O 传统的同步I O模型 一次只处理一个请求 2 非阻塞I O模型 Non blocking I O 应用程序轮询调用socket相关函数检查请求 不需
  • 什么是充放电振子理论?

    CHAT回复 充放电振子模型 Charging Reversal Oscillator Model 是一种解释ENSO现象的理论模型 这个模型把ENSO现象比喻成一个 热力学振荡系统 在这个模型中 ENSO现象由三个组成部分 充电 Char
  • 利用CHAT上传文件的操作

    问CHAT autox js ui 上传框 CHAT回复 上传文件的操作如果是在应用界面中的话 由于Android对于文件权限的限制 你可能不能直接模拟点击选择文件 一般来说有两种常见的解决方案 一种是使用intent来模拟发送一个文件路径
  • 打造完美人像,PixCake像素蛋糕助您一键修图

    您是否曾经为自己的人像照片需要进行繁琐的修图而感到困扰 是否曾经想要打造出完美的自拍照 却不知道该如何下手 现在 我们为您推荐一款强大的人像处理技术修图软件 PixCake像素蛋糕 PixCake像素蛋糕是一款基于AI人像处理技术的修图软件
  • 基于opencv的大米计数统计(详细处理流程+代码)

    在我每周的标准作业清单中 有一项是编写计算机视觉算法来计算该图像中米粒的数量 因此 当我的一个好朋友M给我发了一张纸上的扁豆照片 显然是受到上述转发的启发 请我帮他数一下谷物的数量时 它勾起了我怀旧的回忆 因此 我在我的旧硬盘上寻找很久以前
  • 毕业设计:基于卷积神经网络的验证码识别系统 机器视觉 人工智能

    目录 前言 设计思路 一 课题背景与意义 二 算法理论原理 2 1 字符分割算法 2 2 深度学习 三 检测的实现 3 1 数据集 3 2 实验环境搭建 3 3 实验及结果分析 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实
  • 性能大减80%,英伟达芯片在华“遇冷”,我方霸气回应:不强求

    中国这么大一块市场 谁看了不眼馋 在科技实力大于一切的今天 高端芯片的重要性不言而喻 作为半导体产业发展过程中不可或缺的一环 芯片技术也一直是我国技术发展的一大 心病 在美西方等国的联手压制下 我国芯片技术发展处处受阻 至今也未能在高端芯片
  • 作物叶片病害识别系统

    介绍 由于植物疾病的检测在农业领域中起着重要作用 因为植物疾病是相当自然的现象 如果在这个领域不采取适当的护理措施 就会对植物产生严重影响 进而影响相关产品的质量 数量或产量 植物疾病会引起疾病的周期性爆发 导致大规模死亡 这些问题需要在初
  • 2024 人工智能与大数据专业毕业设计(论文)选题指导

    目录 前言 毕设选题 选题迷茫 选题的重要性 更多选题指导 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生
  • 如何用GPT进行论文润色与改写?

    详情点击链接 如何用GPT GPT4进行论文润色与改写 一OpenAI 1 最新大模型GPT 4 Turbo 2 最新发布的高级数据分析 AI画图 图像识别 文档API 3 GPT Store 4 从0到1创建自己的GPT应用 5 模型Ge
  • 不要再苦苦寻觅了!AI 大模型面试指南(含答案)的最全总结来了!

    AI 大模型技术经过2023年的狂飙 2024年必将迎来应用的落地 对 IT 同学来讲 这里蕴含着大量的技术机会 越来越多的企业开始招聘 AI 大模型岗位 本文梳理了 AI 大模型开发技术的面试之道 从 AI 大模型基础面 AI 大模型进阶
  • 人工智能 AI 如何让我们的生活更加便利

    每个人都可以从新技术中获益 一想到工作或生活更为便利 简捷且拥有更多空余时间 谁会不为之高兴呢 借助人工智能 每天能够多一些空余时间 或丰富自己的业余生活 为培养日常兴趣爱好增添一点便利 从电子阅读器到智能家居 再到植物识别应用和智能室内花
  • AI帮助终结全球饥饿问题

    全球饥饿问题是牵动人心的头等大事 5月28日是 世界饥饿日 这一问题更值得关注 让人人都能吃饱的想法不仅令人向往 而且很快就会变成现实 与大多数新事物引进一样 对于在控制世界粮食供应这样复杂的任务中AI究竟应该发挥多大的作用 人们还踟蹰不前
  • 开始弃用NeRF?为什么Gaussian Splatting在自动驾驶场景如此受欢迎?(浙江大学最新)...

    点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 今天自动驾驶之心为大家分享浙大刚刚出炉的3D Gaussian Splatting综述 文章首先回顾了3D Gaussian的原理和应用 借着全面比较了3D GS在静态
  • 基于节点电价的电网对电动汽车接纳能力评估模型研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • 国产化率100%,北斗导航单日定位4500亿次,外媒:GPS将被淘汰

    追赶30年的技术差距 国产卫星导航系统 北斗 开始扬眉吐气 数据显示 北斗导航目前单日定位量达4500亿次 已经获得100多个国家的合作意向 甚至国际民航也摒弃以往 独宠 GPS的惯例 将北斗纳入参考标准 对此 有媒体直言 GPS多年来的技

随机推荐