transformer encoder整体结构梳理
下面用公式把一个transformer block的计算过程整理一下:
(1)字向量与位置编码:
X
=
E
m
b
e
d
d
i
n
g
L
o
o
k
u
p
(
X
)
+
P
o
s
i
t
i
o
n
a
l
E
n
c
o
d
i
n
g
X=EmbeddingLookup(X)+PositionalEncoding
X=EmbeddingLookup(X)+PositionalEncoding
X
∈
R
b
a
t
c
h
s
i
z
e
∗
s
e
q
.
l
e
n
.
∗
e
m
b
e
d
.
d
i
m
.
X\in R^{batch size * seq.len.*embed.dim.}
X∈Rbatchsize∗seq.len.∗embed.dim.
(2) 字注意力机制:
Q
=
L
i
n
e
a
r
(
X
)
=
X
W
Q
Q = Linear(X)=XW_Q
Q=Linear(X)=XWQ
K
=
L
i
n
e
a
r
(
X
)
=
X
W
K
K = Linear(X)=XW_K
K=Linear(X)=XWK
V
=
L
i
n
e
a
r
(
X
)
=
X
W
V
V = Linear(X)=XW_V
V=Linear(X)=XWV
X
a
t
t
e
n
t
i
o
n
=
S
e
l
f
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
X_{attention}=SelfAttention(Q,K,V)
Xattention=SelfAttention(Q,K,V)
(3) 残差连接与Layer Normalization:
LayerNormalization的作用是把神经网络中隐藏层归一为标准正态分布,也就是i.i.d独立同分布,以起到加快训练速度,加速收敛的作用。
X
a
t
t
e
n
t
i
o
n
=
X
+
X
a
t
t
e
n
t
i
o
n
X_{attention}=X+X_{attention}
Xattention=X+Xattention
X
a
t
t
e
n
t
i
o
n
=
L
a
y
e
r
N
o
r
m
(
X
a
t
t
e
n
t
i
o
n
)
X_{attention}=LayerNorm(X_{attention})
Xattention=LayerNorm(Xattention)
(4)FeedForward,其实就是两层线性映射并用激活函数激活,比如说ReLU:
X
h
i
d
d
e
n
=
A
c
t
i
v
a
t
e
(
L
i
n
e
a
r
(
L
i
n
e
a
r
(
X
a
t
t
e
n
t
i
o
n
)
)
)
X_{hidden}=Activate(Linear(Linear(X_{attention})))
Xhidden=Activate(Linear(Linear(Xattention)))
(5) 重复(3),可以重复N次,N表示transformer block的个数:
X
h
i
d
d
e
n
=
X
a
t
t
e
n
t
i
o
n
+
X
h
i
d
d
e
n
X_{hidden}=X_{attention}+X_{hidden}
Xhidden=Xattention+Xhidden
X
h
i
d
d
e
n
=
L
a
y
e
r
N
o
r
m
(
X
h
i
d
d
e
n
)
X_{hidden}=LayerNorm(X_{hidden})
Xhidden=LayerNorm(Xhidden)
X
h
i
d
d
e
n
∈
R
b
a
t
c
h
s
i
z
e
∗
s
e
q
.
l
e
n
.
∗
e
m
b
e
d
.
d
i
m
.
X_{hidden}\in R^{batch size * seq.len.*embed.dim.}
Xhidden∈Rbatchsize∗seq.len.∗embed.dim.
以上就是transformer的编码器的部分,值得注意一点是,经过自注意力机制,一句话中的每个字都含有这句话中其他所有字的信息,那么我们可以添加一个空白字符到句子的最前面,让句子中的所有信息向这个空白字符(hidden state)汇总,然后再映射成想要分的类别。