0%

Self-Attention

介绍Self-Attention的计算过程。

输入 (1)

数学上,向量 $\boldsymbol{v}$ 通常指列向量(即 $d \times 1$ 的矩阵),其线性投影记作 $\boldsymbol{M} \boldsymbol{v}$,其中 $\boldsymbol{M}$ 是投影矩阵,形状是 $r \times d$。若改用行向量表示,则需转置为 $\boldsymbol{v}^\top \boldsymbol{M}^\top$。而本文遵从 Transformer 的惯例:向量(如 embedding、query、key、value)特指行向量,其中 embedding 向量是 $1 \times d_{model}$,query 和 key 向量是 $1 \times d_k$,value 向量是 $1 \times d_v$(其中 $d_k$ 和 $d_v$ 不一定相等)。同时权重矩阵 $\boldsymbol{W}^Q$、$\boldsymbol{W}^K$ 和 $\boldsymbol{W}^V$ 的形状分别直接定义成 $d_{model} \times d_k$、$d_{model} \times d_k$ 和 $d_{model} \times d_v$,使得投影运算可以直接写成 $\boldsymbol{e} \boldsymbol{W}^Q$、$\boldsymbol{e} \boldsymbol{W}^K$、$\boldsymbol{e} \boldsymbol{W}^V$,无需额外转置。这样记的好处是更接近于编程:$n$ 个 token 的 embedding 向量组成 $n \times d_{model}$ 的矩阵,每行对应一个 token,批量投影只需一次矩阵乘法。

假设当前上下文是“humpty dumpty sat on”,我们要预测下一个单词。有以下输入:

Embedding矩阵 (1.1)

假设每个单词的 embedding 向量是 512 维($d_{model} = 512$),并且假设:

  • “humpty” 的 embedding 向量(行向量)是:

$$
\boldsymbol{e}_1 = [e_{1,1}, e_{1,2}, e_{1,3}, \ldots, e_{1,512}]
$$

  • “dumpty” 的 embedding 向量(行向量)是:

$$
\boldsymbol{e}_2 = [e_{2,1}, e_{2,2}, e_{2,3}, \ldots, e_{2,512}]
$$

  • “sat” 的 embedding 向量(行向量)是:

$$
\boldsymbol{e}_3 = [e_{3,1}, e_{3,2}, e_{3,3}, \ldots, e_{3,512}]
$$

  • “on” 的 embedding 向量(行向量)是:

$$
\boldsymbol{e}_4 = [e_{4,1}, e_{4,2}, e_{4,3}, \ldots, e_{4,512}]
$$

按行拼起来就是一个 $4 \times 512$ 的矩阵:

$$
X = \begin{bmatrix}
e_{1,1} & e_{1,2} & e_{1,3} & \cdots & e_{1,512} \\
e_{2,1} & e_{2,2} & e_{2,3} & \cdots & e_{2,512} \\
e_{3,1} & e_{3,2} & e_{3,3} & \cdots & e_{3,512} \\
e_{4,1} & e_{4,2} & e_{4,3} & \cdots & e_{4,512}
\end{bmatrix}
$$

投影矩阵 (1.2)

投影矩阵也叫权重矩阵:$\boldsymbol{W}^Q$ 和 $\boldsymbol{W}^K$ 的行数必须等于 $d_{model}$(因为 embedding 向量要和它们相乘);它俩的列数必须相等(因为将来 $\boldsymbol{Q}$ 要乘以 $\boldsymbol{K}^\top$,这就要求 $\boldsymbol{Q}$ 和 $\boldsymbol{K}$ 列数相等,进而要求 $\boldsymbol{W}^Q$ 和 $\boldsymbol{W}^K$ 列数相等),把它俩的形状记为 $d_{model} \times d_k$;$\boldsymbol{W}^V$ 的行数也必须等于 $d_{model}$(同样因为 embedding 向量要和它相乘),但列数可以不等于 $d_k$,把它的形状记为 $d_{model} \times d_v$;其中 $d_k$ 和 $d_v$ 可以不相等。下文假设:

$$
\begin{aligned}
& d_{model} = 512 \\
& d_k = 64 \\
& d_v = 128
\end{aligned}
$$

所以,

$$
\boldsymbol{W}^Q =
\begin{bmatrix}
w_{1,1}^q & w_{1,2}^q & w_{1,3}^q & \cdots & w_{1,64}^q \\
w_{2,1}^q & w_{2,2}^q & w_{2,3}^q & \cdots & w_{2,64}^q \\
\vdots & \vdots & \vdots & \ddots & \vdots \\
w_{512,1}^q & w_{512,2}^q & w_{512,3}^q & \cdots & w_{512,64}^q
\end{bmatrix}
\in \mathbb{R}^{512 \times 64}
$$

$$
\boldsymbol{W}^K =
\begin{bmatrix}
w_{1,1}^k & w_{1,2}^k & w_{1,3}^k & \cdots & w_{1,64}^k \\
w_{2,1}^k & w_{2,2}^k & w_{2,3}^k & \cdots & w_{2,64}^k \\
\vdots & \vdots & \vdots & \ddots & \vdots \\
w_{512,1}^k & w_{512,2}^k & w_{512,3}^k & \cdots & w_{512,64}^k
\end{bmatrix}
\in \mathbb{R}^{512 \times 64}
$$

$$
\boldsymbol{W}^V =
\begin{bmatrix}
w_{1,1}^v & w_{1,2}^v & w_{1,3}^v & \cdots & w_{1,128}^v \\
w_{2,1}^v & w_{2,2}^v & w_{2,3}^v & \cdots & w_{2,128}^v \\
\vdots & \vdots & \vdots & \ddots & \vdots \\
w_{512,1}^v & w_{512,2}^v & w_{512,3}^v & \cdots & w_{512,128}^v
\end{bmatrix}
\in \mathbb{R}^{512 \times 128}
$$

这几个矩阵都是学习得到的。它们叫做投影矩阵,意思是把单词的 512 维 embedding 向量分别投影到 64 维、64 维和 128 维空间,见第2节如何使用它们生成每个单词的 query 向量、key 向量和 value 向量。

生成 query、key、value 向量(矩阵) (2)

  • “humpty” 的 query 向量:

$$
\boldsymbol{q}_{humpty} =
\boldsymbol{e}_1 \boldsymbol{W}^Q = \begin{bmatrix}
\sum\limits_{n=1}^{512}e_{1,n}w_{n,1}^q & \sum\limits_{n=1}^{512}e_{1,n}w_{n,2}^q & \cdots & \sum\limits_{n=1}^{512}e_{1,n}w_{n,64}^q
\end{bmatrix}
$$

  • “humpty”的 key 向量:

$$
\boldsymbol{k}_{humpty} =
\boldsymbol{e}_1 \boldsymbol{W}^K = \begin{bmatrix}
\sum\limits_{n=1}^{512}e_{1,n}w_{n,1}^k & \sum\limits_{n=1}^{512}e_{1,n}w_{n,2}^k & \cdots & \sum\limits_{n=1}^{512}e_{1,n}w_{n,64}^k
\end{bmatrix}
$$

  • “humpty”的 value 向量:

$$
\boldsymbol{v}_{humpty} =
\boldsymbol{e}_1 \boldsymbol{W}^V = \begin{bmatrix}
\sum\limits_{n=1}^{512}e_{1,n}w_{n,1}^v & \sum\limits_{n=1}^{512}e_{1,n}w_{n,2}^v & \cdots & \sum\limits_{n=1}^{512}e_{1,n}w_{n,128}^v
\end{bmatrix}
$$

同理,我们可以计算出”dumpty”, “sat”和”on”的 query,key,value 向量。

可以使用矩阵表示它们:

  • Query 矩阵:

$$
\boldsymbol{Q} = \boldsymbol{X} \boldsymbol{W}^Q =
\begin{bmatrix}
\sum\limits_{n=1}^{512}e_{1,n}w_{n,1}^q & \sum\limits_{n=1}^{512}e_{1,n}w_{n,2}^q & \sum\limits_{n=1}^{512}e_{1,n}w_{n,3}^q & \cdots & \sum\limits_{n=1}^{512}e_{1,n}w_{n,64}^q \\
\sum\limits_{n=1}^{512}e_{2,n}w_{n,1}^q & \sum\limits_{n=1}^{512}e_{2,n}w_{n,2}^q & \sum\limits_{n=1}^{512}e_{2,n}w_{n,3}^q & \cdots & \sum\limits_{n=1}^{512}e_{2,n}w_{n,64}^q \\
\sum\limits_{n=1}^{512}e_{3,n}w_{n,1}^q & \sum\limits_{n=1}^{512}e_{3,n}w_{n,2}^q & \sum\limits_{n=1}^{512}e_{3,n}w_{n,3}^q & \cdots & \sum\limits_{n=1}^{512}e_{3,n}w_{n,64}^q \\
\sum\limits_{n=1}^{512}e_{4,n}w_{n,1}^q & \sum\limits_{n=1}^{512}e_{4,n}w_{n,2}^q & \sum\limits_{n=1}^{512}e_{4,n}w_{n,3}^q & \cdots & \sum\limits_{n=1}^{512}e_{4,n}w_{n,64}^q
\end{bmatrix}
\in \mathbb{R}^{4 \times 64}
$$

审视一下这个 $4 \times 64$ 的矩阵:首先,第 1 行是一个 64 维的向量,每个元素都是第 1 个单词 “humpty” 的 embedding 向量($\boldsymbol{e}_1$)的线性组合,所以,它是 “humpty” 的 embedding 向量的投影(参考第1.2节的投影矩阵 $\boldsymbol{W}^Q$)。或者说,它是第 1 个单词 “humpty” 的一些特征,来自第1个单词的 embedding 向量。同理,第 2 行是第 2 个单词特征,来自第 2 个单词的 embedding 向量;第 3 行是第 3 个单词的特征;第 4 行是第 4 个单词的特征。$\boldsymbol{Q}$ 空间定义我在找什么;就是说,每一行(每个 token 的 query 向量)定义对应 token 找什么(匹配什么 token,或者和什么 token 关联性强)。

下面的 \boldsymbol{K} 矩阵和 \boldsymbol{V} 矩阵也是一样,每一行都是一个单词的特征:只是投影矩阵不同($\boldsymbol{W}^Q$、$\boldsymbol{W}^K$、$\boldsymbol{W}^V$互不相同),得到的特征也不同。

  • Key 矩阵:

$$
\boldsymbol{K} = \boldsymbol{X} \boldsymbol{W}^K =
\begin{bmatrix}
\sum\limits_{n=1}^{512}e_{1,n}w_{n,1}^k & \sum\limits_{n=1}^{512}e_{1,n}w_{n,2}^k & \sum\limits_{n=1}^{512}e_{1,n}w_{n,3}^k & \cdots & \sum\limits_{n=1}^{512}e_{1,n}w_{n,64}^k \\
\sum\limits_{n=1}^{512}e_{2,n}w_{n,1}^k & \sum\limits_{n=1}^{512}e_{2,n}w_{n,2}^k & \sum\limits_{n=1}^{512}e_{2,n}w_{n,3}^k & \cdots & \sum\limits_{n=1}^{512}e_{2,n}w_{n,64}^k \\
\sum\limits_{n=1}^{512}e_{3,n}w_{n,1}^k & \sum\limits_{n=1}^{512}e_{3,n}w_{n,2}^k & \sum\limits_{n=1}^{512}e_{3,n}w_{n,3}^k & \cdots & \sum\limits_{n=1}^{512}e_{3,n}w_{n,64}^k \\
\sum\limits_{n=1}^{512}e_{4,n}w_{n,1}^k & \sum\limits_{n=1}^{512}e_{4,n}w_{n,2}^k & \sum\limits_{n=1}^{512}e_{4,n}w_{n,3}^k & \cdots & \sum\limits_{n=1}^{512}e_{4,n}w_{n,64}^k
\end{bmatrix}
\in \mathbb{R}^{4 \times 64}
$$

  • Value 矩阵:

$$
\boldsymbol{V} = \boldsymbol{X} \boldsymbol{W}^V =
\begin{bmatrix}
\sum\limits_{n=1}^{512}e_{1,n}w_{n,1}^v & \sum\limits_{n=1}^{512}e_{1,n}w_{n,2}^v & \sum\limits_{n=1}^{512}e_{1,n}w_{n,3}^v & \cdots & \sum\limits_{n=1}^{512}e_{1,n}w_{n,128}^v \\
\sum\limits_{n=1}^{512}e_{2,n}w_{n,1}^v & \sum\limits_{n=1}^{512}e_{2,n}w_{n,2}^v & \sum\limits_{n=1}^{512}e_{2,n}w_{n,3}^v & \cdots & \sum\limits_{n=1}^{512}e_{2,n}w_{n,128}^v \\
\sum\limits_{n=1}^{512}e_{3,n}w_{n,1}^v & \sum\limits_{n=1}^{512}e_{3,n}w_{n,2}^v & \sum\limits_{n=1}^{512}e_{3,n}w_{n,3}^v & \cdots & \sum\limits_{n=1}^{512}e_{3,n}w_{n,128}^v \\
\sum\limits_{n=1}^{512}e_{4,n}w_{n,1}^v & \sum\limits_{n=1}^{512}e_{4,n}w_{n,2}^v & \sum\limits_{n=1}^{512}e_{4,n}w_{n,3}^v & \cdots & \sum\limits_{n=1}^{512}e_{4,n}w_{n,128}^v
\end{bmatrix}
\in \mathbb{R}^{4 \times 128}
$$

其中 $\boldsymbol{Q}$ 和 $\boldsymbol{K}$ 是 $4 \times 64$ 的矩阵,$\boldsymbol{V}$ 是 $4 \times 128$ 的矩阵,分别记为:

$$
\boldsymbol{Q} =
\begin{bmatrix}
q_{humpty,1} & q_{humpty,2} & \cdots & q_{humpty,64} \\
q_{dumpty,1} & q_{dumpty,2} & \cdots & q_{dumpty,64} \\
q_{sat,1} & q_{sat,2} & \cdots & q_{sat,64} \\
q_{on,1} & q_{on,2} & \cdots & q_{on,64}
\end{bmatrix}
\in \mathbb{R}^{4 \times 64}
$$

$$
\boldsymbol{K} =
\begin{bmatrix}
k_{humpty,1} & k_{humpty,2} & \cdots & k_{humpty,64} \\
k_{dumpty,1} & k_{dumpty,2} & \cdots & k_{dumpty,64} \\
k_{sat,1} & k_{sat,2} & \cdots & k_{sat,64} \\
k_{on,1} & k_{on,2} & \cdots & k_{on,64}
\end{bmatrix}
\in \mathbb{R}^{4 \times 64}
$$

$$
\boldsymbol{V} =
\begin{bmatrix}
v_{humpty,1} & v_{humpty,2} & \cdots & v_{humpty,128} \\
v_{dumpty,1} & v_{dumpty,2} & \cdots & v_{dumpty,128} \\
v_{sat,1} & v_{sat,2} & \cdots & v_{sat,128} \\
v_{on,1} & v_{on,2} & \cdots & v_{on,128}
\end{bmatrix}
\in \mathbb{R}^{4 \times 128}
$$

这些矩阵到底什么意思呢?其实是把每个单词(单词的 embedding 向量)投影了3次,得到每个单词的 query 投影,key 投影和 value 投影。

  • value 投影代表“我能提供什么信息”,也就是单词本身的含义;
  • query 投影代表“我在找什么”,用于查询自己和别的单词的关系;
  • key 投影代表“我能被什么匹配到”,用于别的单词查询和自己的关系;

Query 投影(我在找什么)和 key 投影(我能被什么匹配到)这两个向量的匹配度,就代表两个单词的相关性,也就是注意力分数。如何计算呢?通常采用 Dot-Product,即:

$$
\begin{aligned}
& \boldsymbol{q}_i \cdot \boldsymbol{k}_j = \lVert \boldsymbol{q}_i \rVert \lVert \boldsymbol{k}_j \rVert \cos(\theta) \\
\\
& i,j \in \{humpty,dumpty,sat,on\}
\end{aligned}
$$

其中 $\theta$ 是两个向量的夹角。所以,点积就是两个向量的模长相乘,再乘以夹角的余弦值。也就是说:

  • 在模长一定的情况下:两个向量方向越一致(夹角越小),注意力分数越高。换言之,单词之间的相关性,体现在 query 向量和 key 向量的夹角上;
  • 夹角一定的情况下:
    • 若某个单词的 key 向量模长较大,它会与更多 query 产生较大的点积,从而更容易被其他单词关注到;
    • 若某个单词的 query 向量模长较大,它对所有 key 的点积都会整体变大,得分之间的绝对差距也随之放大;而 softmax 对数值差距敏感,经过 softmax 后,注意力分布会更尖锐,更集中在得分最高的几个 key 上;

注意力分数经过缩放、归一化处理就是单词之间的注意力权重。注意:一个单词和其它所有单词,包括自己,都有一个注意力权重,它们相加和为 1。

用一个单词相对各个单词(包括自己)的权重对各个单词(包括自己)的 value 向量进行加权求和——即线性组合,得到一个 $d_v = 128$ 维向量(因为 value 向量是 $d_v$ 维,所以新向量也是 $d_v$ 维),就是这个单词的“新的表示”,即这个单词的Self Attention Output,它包含来自整个序列的信息(包括自己)。

换言之,Self Attention 就是把 “humpty dumpty sat on” 转化成一个人类读不懂的新形式;新形式还是四个单词,不过这四个单词“我中有你,你中有我”,“我中有多少你”取决于“我和你有多相关”。可以理解成一种非线性文字?

我们使用 $\boldsymbol{q}_x$,$\boldsymbol{k}_x$,$\boldsymbol{v}_x$ 分别表示单词 $x$ 的 query 投影,key 投影和 value 投影(它们分别是 64、64 和 128 维向量),$x \in \{humpty, dumpty, sat, on\}$,则:

$$
Q = XW^Q = \begin{bmatrix}
\boldsymbol{q}_{humpty} \\
\boldsymbol{q}_{dumpty} \\
\boldsymbol{q}_{sat} \\
\boldsymbol{q}_{on}
\end{bmatrix}
$$

$$
K = XW^K = \begin{bmatrix}
\boldsymbol{k}_{humpty} \\
\boldsymbol{k}_{dumpty} \\
\boldsymbol{k}_{sat} \\
\boldsymbol{k}_{on}
\end{bmatrix}
$$

$$
V = XW^V = \begin{bmatrix}
\boldsymbol{v}_{humpty} \\
\boldsymbol{v}_{dumpty} \\
\boldsymbol{v}_{sat} \\
\boldsymbol{v}_{on}
\end{bmatrix}
$$

计算一个单词的 Self Attention Output (3)

以第4个单词”on”为例,计算它的 Self Attention Output:

计算注意力分数 (3.1)

$AttentionScore_{on} =$

$$
\begin{bmatrix}
\frac{\boldsymbol{q}_{on} \cdot \boldsymbol{k}_{humpty}}{\sqrt{d_k}}, & \frac{\boldsymbol{q}_{on} \cdot \boldsymbol{k}_{dumpty}}{\sqrt{d_k}}, & \frac{\boldsymbol{q}_{on} \cdot \boldsymbol{k}_{sat}}{\sqrt{d_k}}, & \frac{\boldsymbol{q}_{on} \cdot \boldsymbol{k}_{on}}{\sqrt{d_k}}
\end{bmatrix}
$$

除以 $\sqrt{d_k}$ 用来防止梯度不稳定(vanishing gradient和exploding gradient),忽略它不影响理解。

看分子,它是”on”的 query 向量和其它各个单词的 key 向量的点积,所以得到的是”on”对于各个单词(包括自己)的注意力分数。

计算注意力权重 (3.2)

使用 softmax 对上一步算出的 $AttentionScore_{on}$ 进行归一化,就的得到 “on” 相对于其它单词的权重:

$AttentionWeight_{on} = softmax(AttentionScore_{on}) =$

$$
\begin{bmatrix}
w_{on,humpty}, & w_{on,dumpty}, & w_{on,sat}, & w_{on,on}
\end{bmatrix}
$$

对于任意$x$($x \in \{humpty, dumpty, sat, on\}$),满足$w_{on,x} \ge 0$并且$\sum_x w_{on,x} = 1$。也就是概率分布。

加权聚合 (3.3)

使用矩阵 $\boldsymbol{O}$ 表示 Self Attention Output;使用 $\boldsymbol{o}_x$ 表示单词 $x$ 的 Self Attention Output;

$$
\boldsymbol{o}_{on} =
w_{on,humpty} \cdot \boldsymbol{v}_{humpty} + w_{on,dumpty} \cdot \boldsymbol{v}_{dumpty} + w_{on,sat} \cdot \boldsymbol{v}_{sat} + w_{on,on} \cdot \boldsymbol{v}_{on}
$$

这是什么意思呢?对于任意 $x$($x \in \{humpty, dumpty, sat, on\}$),$w_{on,x}$ 是一个标量,$\boldsymbol{v}_x$ 是一个 $d_v=128$ 维的向量(即各个单词的 value 向量),也即是这些 value 向量的线性组合,结果是一个 128 维的向量,展开就是:

$$
\begin{bmatrix}
\sum_x w_{on,x} v_{x,1}, & \sum_x w_{on,x} v_{x,2}, & \cdots, & \sum_x w_{on,x} v_{x,128}
\end{bmatrix}
$$

其中$x \in \{humpty, dumpty, sat, on\}$。

线性代数中,我们常见列向量的线性组合,其实对于行向量也一模一样:对应分量加权相加。

可见 “on” 的输入是 512 维的embedding向量,输出 $\boldsymbol{o}_{on}$ 是一个 128 维向量。它是所有单词(包括 “on” 自己)的 value 向量的加权求和。这里的“权”就是 “on” 和各个单词之间关系的远近。例如:

  • $w_{on,humpty} = 0.15$
  • $w_{on,dumpty} = 0.25$
  • $w_{on,sat} = 0.55$
  • $w_{on,on} = 0.05$

注意,”on” 和自己的关系也并不近。动词 “sat” 与介词 “on” 搭配,所以权重高。所以,$\boldsymbol{o}_{on}$中,来自 “sat” 的信息最多,使其主导了输出。自注意力机制通过动态计算序列内所有词的相关性,使模型能够捕捉长距离依赖。

单词 “on” 的 embedding 向量只是单个词的静态表示,而 $\boldsymbol{o}_{on}$ 向量实际上包含了整个序列中其他词的信息,特别是那些与当前词相关的部分。比如,会更多地受到 “sat” 的影响,因为它的注意力权重较高。所以,$\boldsymbol{o}_{on}$ 就不再仅仅是 “on” 这个词本身的含义,而是结合了它在当前句子中的上下文关系后的动态表示。这种动态表示能够更准确地反映词在特定语境中的意义,从而帮助模型更好地进行后续的预测任务。

计算所有单词的 Self Attention Output (4)

其实,会算一个单词的 Self Attention Output 也就会算所有单词的;但是可以通过矩阵运算,一次计算所有单词的 Self Attention Output。

计算注意力分数矩阵 (4.1)

$$
AttentionScore = \frac{\boldsymbol{Q} \boldsymbol{K}^\top}{\sqrt{d_k}}
$$

这样就一次算出所有单词之间的注意力分数。注意:第3.1节中的点积($\boldsymbol{q}_{on} \cdot \boldsymbol{k}_{humpty}$),在这里就是矩阵的一行和一列对应相乘再相加。因为 $\boldsymbol{Q}$ 矩阵和 $\boldsymbol{K}$ 矩阵都是按行组织的(一行一个单词,$4 \times 64$),没法直接相乘,所以 $\boldsymbol{K}$ 需要转置。转置之后就和第3.1节计算点积一模一样。

同样,除以$\sqrt{d_k}$用来防止梯度不稳定(vanishing gradient和exploding gradient)。

总之,得到的 $AttentionScore$ 是一个 $4 \times 4$ 的矩阵:第 1 行是第 1 个单词 “humpty” 与各个单词的注意力分数;第 2 行是第 2 个单词 “dumpty” 与各个单词的注意力分数;以此类推。

计算注意力权重矩阵 (4.2)

使用矩阵 $\boldsymbol{A}$ 来表示注意力权重矩阵:

$$
\boldsymbol{A} = softmax(AttentionScore) = softmax(\frac{\boldsymbol{Q} \boldsymbol{K}^\top}{\sqrt{d_k}})
$$

注意 softmax 不是针对整个矩阵的,而是逐行归一化,即每行的所有元素独立进行 softmax 归一化,确保每行的和为 1。

将所有元素视为一个向量,整体归一化(所有元素和为1),这种方式几乎不使用:因为这种操作会破坏矩阵的语义结构,导致行/列间依赖关系丢失。

所以,这一步比较简单,没有改变矩阵的结构,$\boldsymbol{A}$ 还是一个 $4 \times 4$ 的矩阵。就是把 $AttentionScore$ 逐行归一化,转化成概率分布。即 $\boldsymbol{A}[m][n]$ 是单词 m 对单词 n 的 weight:

$$
\boldsymbol{A} = \begin{bmatrix}
w_{humpty,humpty} & w_{humpty,dumpty} & w_{humpty,sat} & w_{humpty,on} \\
w_{dumpty,humpty} & w_{dumpty,dumpty} & w_{dumpty,sat} & w_{dumpty,on} \\
w_{sat,humpty} & w_{sat,dumpty} & w_{sat,sat} & w_{sat,on} \\
w_{on,humpty} & w_{on,dumpty} & w_{on,sat} & w_{on,on}
\end{bmatrix}
$$

加权聚合 (4.3)

$\boldsymbol{O} = \boldsymbol{A} \boldsymbol{V} = softmax(\frac{\boldsymbol{Q} \boldsymbol{K}^\top}{\sqrt{d_k}}) \boldsymbol{V} =$
$$
\begin{bmatrix}
w_{humpty,humpty} & w_{humpty,dumpty} & w_{humpty,sat} & w_{humpty,on} \\
w_{dumpty,humpty} & w_{dumpty,dumpty} & w_{dumpty,sat} & w_{dumpty,on} \\
w_{sat,humpty} & w_{sat,dumpty} & w_{sat,sat} & w_{sat,on} \\
w_{on,humpty} & w_{on,dumpty} & w_{on,sat} & w_{on,on}
\end{bmatrix} \boldsymbol{V}
$$

如第2节所述,$\boldsymbol{V}$可表示为:

$$
\boldsymbol{V} =
\begin{bmatrix}
v_{humpty,1} & v_{humpty,2} & \cdots & v_{humpty,128} \\
v_{dumpty,1} & v_{dumpty,2} & \cdots & v_{dumpty,128} \\
v_{sat,1} & v_{sat,2} & \cdots & v_{sat,128} \\
v_{on,1} & v_{on,2} & \cdots & v_{on,128}
\end{bmatrix} =
\begin{bmatrix}
\boldsymbol{v}_{humpty} \\
\boldsymbol{v}_{dumpty} \\
\boldsymbol{v}_{sat} \\
\boldsymbol{v}_{on}
\end{bmatrix}
\in \mathbb{R}^{4 \times 128}
$$

可见,$\boldsymbol{O}$ 是 $4 \times 4$ 的矩阵乘以 $4 \times 128$ 的矩阵的结果,也就是一个$4 \times 128$ 的矩阵。

$\boldsymbol{O} = \boldsymbol{A} \boldsymbol{V} = softmax(\frac{\boldsymbol{Q} \boldsymbol{K}^\top}{\sqrt{d_k}}) \boldsymbol{V} =$

$$
\begin{bmatrix}
w_{humpty,humpty} \cdot \boldsymbol{v}_{humpty} + w_{humpty,dumpty} \cdot \boldsymbol{v}_{dumpty}+ w_{humpty,sat} \cdot \boldsymbol{v}_{sat}+ w_{humpty,on} \cdot \boldsymbol{v}_{on} \\
w_{dumpty,humpty} \cdot \boldsymbol{v}_{humpty} + w_{dumpty,dumpty} \cdot \boldsymbol{v}_{dumpty}+ w_{dumpty,sat} \cdot \boldsymbol{v}_{sat}+ w_{dumpty,on} \cdot \boldsymbol{v}_{on} \\
w_{sat,humpty} \cdot \boldsymbol{v}_{humpty} + w_{sat,dumpty} \cdot \boldsymbol{v}_{dumpty}+ w_{sat,sat} \cdot \boldsymbol{v}_{sat}+ w_{sat,on} \cdot \boldsymbol{v}_{on} \\
w_{on,humpty} \cdot \boldsymbol{v}_{humpty} + w_{on,dumpty} \cdot \boldsymbol{v}_{dumpty}+ w_{on,sat} \cdot \boldsymbol{v}_{sat}+ w_{on,on} \cdot \boldsymbol{v}_{on}
\end{bmatrix}
$$

其中第 4 行就是第3.3节中的 $\boldsymbol{o}_{on}$;同理,第 1 行是 $\boldsymbol{o}_{humpty}$,第 2 行是 $\boldsymbol{o}_{dumpty}$,第3行是 $\boldsymbol{o}_{sat}$。

以第3行”sat”为例,展开一下:

$$
\boldsymbol{o}_{sat} =
\begin{bmatrix}
w_{sat,humpty}, & w_{sat,dumpty}, & w_{sat,sat}, & w_{sat,on}
\end{bmatrix} \boldsymbol{V}
$$

所以,结果是:

$$
\begin{bmatrix}
\sum_x w_{sat,x} v_{x,1}, & \sum_x w_{sat,x} v_{x,2}, & \cdots, & \sum_x w_{sat,x} v_{x,128}
\end{bmatrix}
$$

其中$x \in \{humpty, dumpty, sat, on\}$。

总结 (5)

Self Attention 就是把输入句子($n$个单词,每个单词由一个 $d_{model}$ 维 embedding 向量表示)转换成另一个句子:也是 $n$ 个单词,每个单词由一个 $d_v$ 维向量表示,其中 $d_v$ 可以不等于 $d_{model}$。输出单词的特别之处在于“每个单词都包含其它单词的信息”(是其它单词信息的线性组合)。所以,自注意力输出不是简单的词向量变换,而是一种语境增强的语义表示,为下游任务提供强大的上下文感知能力。

从后文我们将发现,Self Attention是MultiHead Attention的一个特例。

写的不错,有赏!