自注意力
1. 自注意力 self-attention
输入序列:
x
1
,
…
,
x
n
\mathbf{x}_1, \ldots, \mathbf{x}_n
x1,…,xn,任意
x
i
∈
R
d
\mathbf{x}_i \in \mathbb{R}^d
xi∈Rd
自注意力池化层:将
x
i
\mathbf{x}_i
xi当作key,value,query对序列抽取特征
输出序列:
y
1
,
…
,
y
n
\mathbf{y}_1, \ldots, \mathbf{y}_n
y1,…,yn
注意力汇聚函数
f
f
f:
y
i
=
f
(
x
i
,
(
x
1
,
x
1
)
,
…
,
(
x
n
,
x
n
)
)
∈
R
d
\mathbf{y}_i = f(\mathbf{x}_i, (\mathbf{x}_1, \mathbf{x}_1), \ldots, (\mathbf{x}_n, \mathbf{x}_n)) \in \mathbb{R}^d
yi=f(xi,(x1,x1),…,(xn,xn))∈Rd
2. 比较卷积神经网络、循环神经网络和自注意力
目标:将由
n
n
n个词元组成的序列映射到另一个长度相等的序列,其中的每个输入词元或输出词元都由
d
d
d维向量表示
3. 位置编码 Positional Encoding
自注意力因为并行计算而放弃了顺序操作。为了像RNN一样纳入顺序信息,通过在输入表示中添加位置编码(positional encoding)来注入绝对的或相对的位置信息。位置编码可以学习也可以固定得到。
基于正弦函数和余弦函数的固定位置编码
假设输入长度为n的序列是
X
∈
R
n
×
d
\mathbf{X} \in \mathbb{R}^{n \times d}
X∈Rn×d,用位置编码矩阵
P
∈
R
n
×
d
\mathbf{P} \in \mathbb{R}^{n \times d}
P∈Rn×d输出
X
+
P
\mathbf{X}+\mathbf{P}
X+P, 矩阵第
i
i
i行、第
2
j
2j
2j列和
2
j
+
1
2j+1
2j+1列上的元素为:
p
i
,
2
j
=
sin
(
i
1000
0
2
j
/
d
)
,
p
i
,
2
j
+
1
=
cos
(
i
1000
0
2
j
/
d
)
.
\begin{split}\begin{aligned} p_{i, 2j} &= \sin\left(\frac{i}{10000^{2j/d}}\right),\\p_{i, 2j+1} &= \cos\left(\frac{i}{10000^{2j/d}}\right).\end{aligned}\end{split}
pi,2jpi,2j+1=sin(100002j/di),=cos(100002j/di).
举例如下:
第六列是sin;
第七列相对于第六列位移 sin变cos;
第6列和第7列的频率高于第8列和第9列
位置矩阵编码可视化
捕捉绝对位置
位置编码通过使用三角函数在编码维度上降低频率。横列对应一个位置,相当于一句话中的一个词,纵列是同一个维度。纵列的值周期性变化,且沿着编码维度,频率单调降低。
相对位置信息
允许模型学习得到输入序列中相对位置信息;
这是因为对于任何确定的位置偏移
δ
\delta
δ,位置处
i
+
δ
i + \delta
i+δ的位置编码可以线性投影位置
i
i
i处的位置编码来表示。任何一对
(
p
i
,
2
j
,
p
i
,
2
j
+
1
)
(p_{i, 2j}, p_{i, 2j+1})
(pi,2j,pi,2j+1)都可以线性投影到
(
p
i
+
δ
,
2
j
,
p
i
+
δ
,
2
j
+
1
)
(p_{i+\delta, 2j}, p_{i+\delta, 2j+1})
(pi+δ,2j,pi+δ,2j+1)
[
cos
(
δ
ω
j
)
sin
(
δ
ω
j
)
−
sin
(
δ
ω
j
)
cos
(
δ
ω
j
)
]
[
p
i
,
2
j
p
i
,
2
j
+
1
]
=
[
cos
(
δ
ω
j
)
sin
(
i
ω
j
)
+
sin
(
δ
ω
j
)
cos
(
i
ω
j
)
−
sin
(
δ
ω
j
)
sin
(
i
ω
j
)
+
cos
(
δ
ω
j
)
cos
(
i
ω
j
)
]
=
[
sin
(
(
i
+
δ
)
ω
j
)
cos
(
(
i
+
δ
)
ω
j
)
]
=
[
p
i
+
δ
,
2
j
p
i
+
δ
,
2
j
+
1
]
,
\begin{split}\begin{aligned} &\begin{bmatrix} \cos(\delta \omega_j) & \sin(\delta \omega_j) \\ -\sin(\delta \omega_j) & \cos(\delta \omega_j) \\ \end{bmatrix} \begin{bmatrix} p_{i, 2j} \\ p_{i, 2j+1} \\ \end{bmatrix}\\ =&\begin{bmatrix} \cos(\delta \omega_j) \sin(i \omega_j) + \sin(\delta \omega_j) \cos(i \omega_j) \\ -\sin(\delta \omega_j) \sin(i \omega_j) + \cos(\delta \omega_j) \cos(i \omega_j) \\ \end{bmatrix}\\ =&\begin{bmatrix} \sin\left((i+\delta) \omega_j\right) \\ \cos\left((i+\delta) \omega_j\right) \\ \end{bmatrix}\\ =& \begin{bmatrix} p_{i+\delta, 2j} \\ p_{i+\delta, 2j+1} \\ \end{bmatrix}, \end{aligned}\end{split}
===[cos(δωj)−sin(δωj)sin(δωj)cos(δωj)][pi,2jpi,2j+1][cos(δωj)sin(iωj)+sin(δωj)cos(iωj)−sin(δωj)sin(iωj)+cos(δωj)cos(iωj)][sin((i+δ)ωj)cos((i+δ)ωj)][pi+δ,2jpi+δ,2j+1],
参考
DIVE INTO DEEP LEARNING> 10 注意力机制 > 10.6. 自注意力和位置编码
67 自注意力【动手学深度学习v2】
系列文章
【动手学深度学习v2】注意力机制—1 注意力评分函数
【动手学深度学习v2】注意力机制—2 使用注意力机制Seq2Seq
【动手学深度学习v2】注意力机制—3 自注意力&位置编码
【动手学深度学习v2】注意力机制—4 Transformer