Transformer中的自注意力机制计算过程分析

目录

1 什么是自注意力机制

2 自注意力的计算过程


1 什么是自注意力机制

自注意力机制(Self-Attention)顾名思义就是关注单个序列内部元素之间的相关性,不仅可以用于 seq2seq 的机器翻译模型,还能用于情感分析、内容提取等场景。因此分析网络如何表达出“单个序列”与“内部元素”之间的相关性这一问题可以回答开头所述的大部分疑问。

2 自注意力的计算过程

如图1所示,假设网络某一个自注意力层的输入向量序列为 \left \{ a_{1},\cdots ,a_{n} \right \}a_{i}\left ( i=1,2,\cdots ,n \right )维度均为 d_{model},该层的输出向量序列为 \left \{ o_{1},\cdots ,o_{n} \right \}o_{i}\left ( i=1,2,\cdots ,n \right ) 的维度同样都为 d_{model}

首先将 \left \{ a_{1},\cdots ,a_{n} \right \} 分别乘以同一个矩阵\mathbf{\mathit{W}_{\mathit{K}}}\mathbf{\mathit{W}_{\mathit{Q}}}\mathbf{\mathit{W}_{\mathit{V}}} 得到 key 向量  \mathbf{\mathit{k}_{\mathit{n}}}、query 向量 \mathbf{\mathit{q}_{\mathit{n}}} 以及 value 向量 \mathbf{\mathit{v}_{\mathit{n}}},且维度均为 d_{model}

然后以 \mathbf{\mathit{a}}_{1} 输出到 \mathbf{\mathit{o}}_{1} 的过程为例。把 \mathbf{\mathit{q}}_{1} 依次与所有的key做点积后得到初步的注意力值  a_{1,i}\left ( i=1,2,\cdots ,n \right ),图1所示。

图1 自注意力计算过程1 

然后将 a_{1,i} 经过 softmax 函数归一化得到最终的注意力权重 a_{1,n}^{'} ,这个 a_{1,n}^{'} 可以看作我们给输入向量序列中的每个位置的向量打分,而这个分数决定了当我们在一个特定的位置处理一个向量时,在输入的句子的其他部分应该给予多少关注。

图2 注意力权重计算

将权重 a_{1,n}^{'} 与 \mathbf{\mathit{v}}_{i}\left ( i=1,2,\cdots ,n \right ) 加权相乘之后再相加得到 \mathbf{\mathit{a}_{\boldsymbol{\mathit{i}}}} 对应的自注意力输出向量 \mathbf{\mathit{o}_{\boldsymbol{\mathit{1}}}} ,如图3所示。

 图3 自注意力计算3

其他的计算方法与此相同,最终的计算结果如图4所示。其中 \mathbf{\mathit{a}_{\boldsymbol{\mathit{i}}}} 与相应的 \mathbf{\mathit{o}_{\boldsymbol{\mathit{i}}}} 的维度相同,都是 d_{model} 整个注意力机制中只有\mathbf{\mathit{W}_{\mathit{K}}}、 \mathbf{\mathit{W}_{\mathit{Q}}}以及 \mathbf{\mathit{W}_{\mathit{V}}} 三个矩阵是可学习的参数。

 图4 自注意力计算4

进一步地,既然每个输入向量 \mathbf{\mathit{a}_{\boldsymbol{\mathit{i}}}} 都是乘以相同的矩阵,那么可以将所有输入向量 \left \{ a_{1},\cdots ,a_{n} \right \}整合为一个矩阵 \mathbf{\mathit{A}}=\left [ \mathbf{\mathit{a}_{1}},\cdots ,\mathbf{\mathit{a}_{n}} \right ]_{d_{model}\times n},然后把三种输出向量 \mathbf{\mathit{k}_{\mathit{i}}}\mathbf{\mathit{q}_{\mathit{i}}} 以及 \mathbf{\mathit{v}_{\mathit{i}}} 也整合成矩阵的形式分别为 \mathbf{\mathit{K}}\mathbf{\mathit{Q}}\mathbf{\mathit{V}},比如 \mathbf{\mathit{K}} 可以写为下式所示的形式:

此时的输出矩阵就可以写成下式的结果:

这里的矩 softmax\left ( \mathbf{\mathit{QK}^{T}} \right ) 就是注意力矩阵,代表着当处理当前位置向量时,其他位置的向量对当前位置向量的影响程度。

Transformer中的输出矩阵还乘以了一个缩放系数 \frac{1}{\sqrt{d_{k}}}d_{k} 是  \mathbf{\mathit{k}_{\mathit{n}}} 的维度。所以最终的输出是下式所示的形式:

在这里使用矩阵运算的目的是可以提升计算效率。

猜你喜欢

转载自blog.csdn.net/Flag_ing/article/details/136421027