transformer的输入部分input coding
transformer的输入部分input coding=BPE+PE
BPE
BPE是指一种词分类算法。
起初,会将每个单词都拆分成一个个字母扔进词表中。
然后统计byte gram,选出出现次数最多的byte gram,将其塞入到词表中,若组成的byte gram使得原本单独的部分无其他非组成该byte gram的情况,则该部分需要从原先的词表进行删除。
比如e
和s
形成es
,es
在newest
和widest
均有出现,且出现的次数最多,所以可将e
和s
整合成es
塞入到词表中,且s
只在es
中出现,所以在整合的过程中要在原先词表中删去s
,让s
作为es
整体的部分进行出现。
BPE所解决的问题——OOV
OOV
是out of vocabulary
的简称.
OOV是指代一个问题,即目前出现的单词超出已有的知识范围。
而BPE能够处理OOV问题。
比如说BPE会通过学习将smartest
拆分成smart
和est
,当他遇到并不认识的lowest
时,会将其拆分成low
和est
,而可通过之前学习到的smart
和est
来进行泛化/推理,如果说词表中是含有low
这个词项的话,那么是可以推理得到大概lowest
的意思
PE(Position Encoding)位置编码
作用:用于弥补transformer无法处理各输入部分的位置信息。(位置信息是很重要的,词的意思可通过上下文进一步明确,上文放在下文,可能就有不同的意思存在)
如“我吃鱼”和“鱼吃我”是两个不同的概念。
pos是指位置,比如说“我爱你”中的“爱”的位置为第二。
i是词在转为词向量后所得到的索引。比如embedding后的维度为512维,那么i对应其中一个维度。
PE算法会对应一个三角函数。
当索引为偶数时,
P
E
(
p
o
s
+
k
,
2
i
)
=
s
i
n
(
(
p
o
s
+
k
)
/
1000
0
2
i
d
m
o
d
e
l
)
=
s
i
n
(
(
p
o
s
)
/
1000
0
2
i
d
m
o
d
e
l
×
c
o
s
(
(
k
)
/
1000
0
2
i
d
m
o
d
e
l
+
s
i
n
(
(
k
)
/
1000
0
2
i
d
m
o
d
e
l
×
c
o
s
(
(
p
o
s
)
/
1000
0
2
i
d
m
o
d
e
l
=
P
E
(
p
o
s
,
2
i
)
P
E
(
k
,
2
i
+
1
)
+
P
E
(
k
,
2
i
)
P
E
(
p
o
s
,
2
i
+
1
)
PE(pos+k,2i) = sin((pos+k)/10000^{\frac{2i}{d_{model}}})=sin((pos)/10000^{\frac{2i}{d_{model}}}\times cos((k)/10000^{\frac{2i}{d_{model}}}+sin((k)/10000^{\frac{2i}{d_{model}}}\times cos((pos)/10000^{\frac{2i}{d_{model}}}=PE(pos,2i)PE(k,2i+1)+PE(k,2i)PE(pos,2i+1)
PE(pos+k,2i)=sin((pos+k)/10000dmodel2i)=sin((pos)/10000dmodel2i×cos((k)/10000dmodel2i+sin((k)/10000dmodel2i×cos((pos)/10000dmodel2i=PE(pos,2i)PE(k,2i+1)+PE(k,2i)PE(pos,2i+1)
同理,当索引为奇数时,也会得到对应的处理。
也就是说pos为6的位置编码为可以由1和5,2和4,3和3三对位置编码得到。
进而,位置编码可以认为是一种向量。然后向量是具有空间的,通过和积化差可以得到这个向量是由于某些向量线性组合而成,而线性组合也有对应的空间表示,从而通过线性组合区分位置关系。