一、引言
Self-Attention并行的计算方式未考虑输入特征间的位置关系,这对NLP来说是不可接受的,毕竟一个句子中每个单词都有着明显的顺序关系。Transformer没有RNN、LSTM那样的顺序结构,所以Transformer在提出Self-Attention的同时提出了Positional Encoding。
如图所示,Transformer在Attention模块之前将位置编码加进了待输入特征中。
二、绝对位置编码
首先需要明确NLP中数据的形式,一个批次包含多个句子,每个句子包含多个单词,每个单词被转为长度相同的token向量。由于每个句子中包含的单词数不同,所以会通过padding统一同一批次的embedding。假设一个批次padding后的embedding维度为 [ b a t c h _ s i z e , n u m _ t o k e n , d i m _ t o k e n ] [batch\_size,num\_token,dim\_token] [batch_size,num_token,dim_token]。
绝对位置编码是一种将序列中每个token的位置进行编码的方法,它为每个位置分配一个唯一的编码向量。由于绝对位置编码只关注单个位置信息,因此它的实现通常在输入层,可以通过与输入向量相加融入模型。
2.1 直观的位置编码
2.1.1 索引型
将token的索引作为位置编码,第一个token编码为0,第二个token编码为1,以此类推。
其主要问题在于位置编码的值无界。
2.1.2 [0,1]型
为保证值有界,可限制位置编码范围为 [ 0 , 1 ] [0,1] [0,1],第一个token编码为0,最后一个token编码为1,其余token等间隔取值。例如共3个token时,位置编码为 [ 0 , 0.5 , 1 ] [0,0.5,1] [0,0.5,1],共4个token时,位置编码为 [ 0 , 0.33 , 0.66 , 1 ] [0,0.33,0.66,1] [0,0.33,0.66,1]。
其主要问题在于两个句子的token个数不同时,两个相同位置间的相对距离不同。共3个token时,第三个与第一个token间距为1,但共4个token时,第三个与第一个token间距为0.66。
2.1.3 二进制型
为保证值有界、句子长度不同时相对距离相同,可通过索引的二进制编码作为位置编码。下图为一个包含8个token,token向量长度为3的句子的位置编码。
如图,因为位置编码与embedding需要相加,所以通常位置编码的维度与embedding的维度相同。直白地说,有几个token就有几个位置编码,token向量的维度是多少位置编码向量的维度就是多少。
其主要问题在于二进制编码的位置向量处于离散空间,与输入相加后进入浮点世界,造成了空间上的浪费。
不过,我们可以观察该类型位置编码的规律。纵向来看,每个维度的编码值变化频率不同,蓝色变化周期为4,绿色变化周期为2,红色变化周期为1。
2.1.4 周期型
为保证值有界、句子长度不同时相对距离相同、节约空间,周期型位置编码包含了类似二进制型位置编码的变化规律,并将离散的二进制转为连续的 sin \sin sin或 cos \cos cos。
以 sin \sin sin为例,我们用 p o s pos pos表示embedding中token的索引,用 i i i表示token上元素的索引。于是第 p o s pos pos个token的位置编码可以表示如下:
P E ( p o s ) = [ sin ( p o s 2 0 ) , sin ( p o s 2 1 ) , ⋯ , sin ( p o s 2 i ) , ⋯ , sin ( p o s 2 d i m _ t o k e n − 1 ) ] PE_{(pos)}=[\sin(\frac{pos}{2^0}),\sin(\frac{pos}{2^1}),\cdots,\sin(\frac{pos}{2^i}),\cdots,\sin(\frac{pos}{2^{dim\_token-1}})] PE(pos)=[sin(20pos),sin(21pos),⋯,sin(2ipos),⋯,sin(2dim_token−1pos)]
其中, p o s = 0 , 1 , ⋯ , n u m _ t o k e n − 1 pos=0,1,\cdots,num\_token-1 pos=0,1,⋯,num_token−1, i = 0 , 1 , ⋯ , d i m _ t o k e n − 1 i=0,1,\cdots,dim\_token-1 i=0,1,⋯,dim_token−1。
可见,每个维度上 1 2 i \frac{1}{2^i} 2i1被用来控制变化规律,详情如下图。
但是,使用 1 2 i \frac{1}{2^i} 2i1来控制变化规律会使 P E ( p o s ) PE_{(pos)} PE(pos)很快形成一个闭环。
如图,当 d i m _ t o k e n = 3 dim\_token=3 dim_token=3时,以 0.1 0.1 0.1的间隔在 [ 0 , 20 ] [0,20] [0,20]取 p o s pos pos,得到200个 P E ( p o s ) PE_{(pos)} PE(pos),前100个点为蓝色,后100个点为橙色,可以清晰看到它们的重叠部分。这表明即便 p o s pos pos不同, P E ( p o s ) PE_{(pos)} PE(pos)也有很多点的值是相同的,但我们希望位置编码像地址一样是独一无二的,所以我们使用 1 1000 0 i / d i m _ t o k e n \frac{1}{10000^{i/dim\_token}} 10000i/dim_token1替换 1 2 i \frac{1}{2^i} 2i1来控制变化规律。此时, P E ( p o s ) PE_{(pos)} PE(pos)如下图,不再有重叠。
于是有:
P E ( p o s ) = [ sin ( w 0 p o s ) , sin ( w 1 p o s ) , ⋯ , sin ( w i p o s ) , ⋯ , sin ( w d i m _ t o k e n − 1 p o s ) ] PE_{(pos)}=[\sin(w_0pos),\sin(w_1pos),\cdots,\sin(w_ipos),\cdots,\sin(w_{dim\_token-1}pos)] PE(pos)=[sin(w0pos),sin(w1pos),⋯

博客围绕Transformer的位置编码展开。因Self - Attention未考虑输入特征位置关系,Transformer提出Positional Encoding。介绍了绝对位置编码(如索引型、[0,1]型等)和相对位置编码,还阐述了其在Transformer、DETR、Swin Transformer中的应用,包括作用和实现方式。
最低0.47元/天 解锁文章
36万+

被折叠的 条评论
为什么被折叠?



