Transformer系列2Transformer结构位置编码的详细解析1(相对位置关系的推导证明与个人理解)
Posted 呆呆象呆呆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Transformer系列2Transformer结构位置编码的详细解析1(相对位置关系的推导证明与个人理解)相关的知识,希望对你有一定的参考价值。
1、Attention is all you need 中的位置编码
1.1 部分论文解释截图
中文翻译为位置编码(后面用PE代替)。这个操作,直观上非常容易理解,就是对序列中的词的位置进行编码。但是,原文并没有对这种新颖的位置编码方式作细致的讲解。对很多人来说,依然一头雾水。因此,本博客旨在让大家真正理解位置编码的原理。
1.2 在公式形成中的考量
1.2.1 引入PE的意义
对于任何一门语言,单词在句子中的位置以及排列顺序是非常重要的,它们不仅是一个句子的语法结构的组成部分,更是表达语义的重要概念。一个单词在句子的位置或排列顺序不同,可能整个句子的意思就发生了偏差。
I do not like the story of the movie, but I do like the cast.
I do like the story of the movie, but I do not like the cast.
上面两句话所使用的的单词完全一样,但是所表达的句意却截然相反。那么,引入词序信息有助于区别这两句话的意思。
针对现在广泛应用的图像处理也是一样,可能针对全图而言像素点的绝对坐标不那么重要(其实位置对全图也有一定的影响),但是临近像素点序列的排布顺序,临近像素块(像素点集)序列的排布顺序也很重要。
Transformer模型
抛弃了RNN
、CNN
作为序列学习的基本模型。我们知道,循环神经网络本身就是一种顺序结构,天生就包含了词在序列中的位置信息。当抛弃循环神经网络结构,完全采用Attention取而代之,这些词序信息就会丢失,模型就没有办法知道每个词在句子中的相对和绝对的位置信息。因此,有必要把词序信号加到词向量上帮助模型学习这些信息,PE就是用来解决这种问题的方法。
1.2.2 PE的作用
PE是一种用位置信息对序列中的每个序列信息进行二次表示的方法。正如1.2.1所述,Transformer模型
本身不具备像RNN那样的学习词序信息的能力,RNN在模型定义时就已经包含了逐个输入的信息的顺序等价于信息出现的次序。Transformer
需要主动将序列的顺序信息喂给模型。
那么,以这篇论文为例,模型原先的输入是不含词序信息的词向量,位置编码需要将词序信息和词向量结合起来形成一种新的表示输入给模型,达到增强输入的目的,这样模型就具备了按照编码适应序列信息的能力。
1.2.3 PE需要满足的要求
- 举例一:
分配一个0到1之间的数值给每个时间步,其中,0表示第一个词,1表示最后一个词。
这种方法虽然简单,但会带来很多问题。其中一个就是你无法知道在一个特定区间范围内到底存在多少个单词。也就是说,按照这种操作,不同句子,有不一样的长度,时间步长也会被分配成不同的精度,时间步差值就没有任何的意义了。
- 举例二:
线性分配一个数值给每个时间步。也就是,1分配给第一个词,2分配给第二个词,以此类推。
这种方法带来的问题一:特殊情况下PE数值信息会变得非常大,淹没有其他价值信息。
这种方法带来的问题二:模型会遇到一些比训练中的所有句子都要长的句子,无法适应没有见到过的更大PE信息。
这种方法带来的问题三:数据集中不一定在所有数值上都会包含相对应长度的句子,也就是模型很有可能没有看到过任何一个这样的长度的样本句子,这会严重影响模型的泛化能力。
-
一种好的位置编码方案需要满足以下几条要求:
- 为每个时间步输出一个独一无二的编码
- 不同长度的句子之间,任何两个时间步之间的距离应该保持一致
- 模型应该能毫不费力地泛化到更长的句子
- 它的值应该是有界的
- 它必须是确定性的
1.3 公式说明
本文内容中提出了一个简单但非常创新的位置编码方法,能够满足上述所有的要求。
首先,这种编码不是单一的一个数值,而是包含句子中特定位置信息的向量计算方式(非常像词向量)。
第二,这种编码没有整合进模型,而是用这个向量让每个词具有它在句子中的位置的信息。换句话说,通过注入词的顺序信息来增强模型输入。
具体公式如下
P
E
(
p
o
s
,
2
i
)
=
sin
(
p
o
s
/
1000
0
2
i
/
d
model
)
P
E
(
pos,
2
i
+
1
)
=
cos
(
p
o
s
/
1000
0
2
i
/
d
model
)
\\begin{aligned}P E_{(p o s, 2 i)} &=\\sin \\left(p o s / 10000^{2 i / d_{\\text {model }}}\\right) \\\\P E_{(\\text {pos, } 2 i+1)} &=\\cos \\left(p o s / 10000^{2 i / d_{\\text {model }}}\\right)\\end{aligned}
PE(pos,2i)PE(pos, 2i+1)=sin(pos/100002i/dmodel )=cos(pos/100002i/dmodel )
- pos \\text{pos} pos:表示注入的顺序,也就是所想表述的空间或者时间上的顺序
- pos ∈ r a n g e ( l e n ( Input ) ) \\text{pos} \\in range(len(\\text{Input})) pos∈range(len(Input))
- i \\text{i} i:表示维度的序号,每一个输入可能对应若干深层隐藏的变量
- 2i ∈ [ 0 , 2 , ⋯ d model ] \\text{2i} \\in [0,2, \\cdots d_{\\text{model}}] 2i∈[0,2,⋯dmodel]
- 2i+1 ∈ [ 1 , 3 ⋯ d model − 1 ] \\text{2i+1} \\in [1,3 \\cdots d_{\\text{model}-1}] 2i+1∈[1,3⋯dmodel−1]
换一个更形象的好看的形式
P
E
→
=
[
P
E
(
0
)
→
⋯
P
E
(
pos
)
→
⋯
P
E
(
N
)
→
]
\\overrightarrow{PE} = \\left[\\overrightarrow{PE_{(\\text{0})}} \\cdots \\overrightarrow{PE_{(\\text{pos})}} \\cdots \\overrightarrow{PE_{(\\text{N})}}\\right]
PE=[PE(0)⋯PE(pos)⋯PE(N)]
向量
P
E
→
\\overrightarrow{PE}
PE,对应每个位置都有一个对应位置的向量
P
E
(
pos
)
→
\\overrightarrow{PE_{(\\text{pos})}}
PE(pos),共有输入长度
N
=
l
e
n
(
i
n
p
u
t
)
N=len(input)
N=len(input)个
P
E
(
pos
)
→
\\overrightarrow{PE_{(\\text{pos})}}
PE(pos)组成。每一个位置的向量都有
d
model
d_{\\text{model}}
dmodel维度,表示为
P
E
(pos)
→
∈
R
d
model
,
pos
=
0
,
1
,
2
,
⋯
,
N
−
1
\\overrightarrow{PE_{\\text{(pos)}}} \\in \\mathbb{R}^{d_\\text{model}},\\text{pos} = 0,1,2,\\cdots,N-1
PE(pos)∈Rdmodel,pos=0,1,2,⋯,N−1
P
E
(pos)
→
=
[
P
E
(pos)
→
(
0
)
⋮
P
E
(pos)
→
(
d
model
)
]
\\overrightarrow{PE_{\\text{(pos)}}}=\\left[\\begin{array}{c} \\overrightarrow{PE_{\\text{(pos)}}}^{(0)}\\\\ \\vdots \\\\ \\overrightarrow{PE_{\\text{(pos)}}}^{(d_\\text{model})} \\end{array}\\right]
PE(pos)=⎣⎢⎢⎢⎡PE(pos)(0)⋮PE(pos)(dmodel)⎦⎥⎥⎥⎤
每一个元素的定义
P
E
(
pos
)
→
(
i
)
=
{
sin
(
ω
k
⋅
pos
)
,
if
i
=
2
k
cos
(
ω
k
⋅
pos
)
,
if
i
=
2
k
+
1
频率:
ω
k
=
1
1000
0
2
k
/
d
model
\\overrightarrow{PE_{(\\text{pos})}}^{(i)}=\\left\\{\\begin{array}{ll 以上是关于Transformer系列2Transformer结构位置编码的详细解析1(相对位置关系的推导证明与个人理解)的主要内容,如果未能解决你的问题,请参考以下文章 双目深度算法——基于Transformer的方法(STTR) 双目深度算法——基于Transformer的方法(STTR) Transformer系列1Attention is all you need解析Transformer结构总览