跳转至

Attention is All You Need

Warning

这是第一次学的时候记的笔记,可能会过于简单、啰嗦,而且后面没记完,完整的 Transformer 梳理在另一篇笔记里。

经典公式

\[Attention(Q, K, V) = softmax(\frac{Q K^{\top}}{\sqrt{d_k}}) V\]

每个 token 都有一个 Query 和 Key:

\[ Q = \begin{bmatrix} q_1 \\ q_2 \\ q_3 \\ q_4 \end{bmatrix},\quad K = \begin{bmatrix} k_1 \\ k_2 \\ k_3 \\ k_4 \end{bmatrix}\]

那么:

\[ QK^\top = \begin{bmatrix} q_1k_1 & q_1k_2 & q_1k_3 & q_1k_4 \\ q_2k_1 & q_2k_2 & q_2k_3 & q_2k_4 \\ q_3k_1 & q_3k_2 & q_3k_3 & q_3k_4 \\ q_4k_1 & q_4k_2 & q_4k_3 & q_4k_4 \end{bmatrix} \]

每一行表示,某一个 token 应该关注所有 token 的程度

  • \(d_k\) 是 Key 向量的维度,除了之后先让点积变小一点,再 softmax,把数值控制在合适的范围

Q K V 从哪里来

每个 token 被嵌入为一个向量,把他们堆起来,得到输入矩阵

\[X\]

然后分别训练三个不同的可训练矩阵:

\[Q = X W_Q\]
\[K = X W_K\]
\[V = X W_V\]
  • \(W_Q\): 学习怎样产生查询角度
  • \(W_K\): 学习增样产生被匹配角度
  • \(W_V\): 学习增样产生实际传递的信息

Self-Attention: 同一组信息内部互相注意

指的应该就是\(QKV\)都来自同一个输入矩阵\(X\)

让每个 token 不再只是孤立的词,而是根据整个上下文更新自己的含义

Cross-Attention: 一组信息查询另一组信息

一组 token(如\(X_action\)得到的 token) 拿着 Q,去另一组 token(如\(X_{vision-language}\))的 K 和 V 中查询信息

VLA 就会使用类似这样的思想,把图像、语言、机器人状态、动作 token 全拼起来,本质就是让不同模态的信息根据相关性进行交流

Multi-Head Attention

不同 head 拥有不同的:

\[W_Q, W_K, W_V\]

可以学习不同的角度

每个 head 单独计算:

\[head_i = Attention(QW_i^Q, KW_i^K, VW_i^V)\]

然后把各个 head 的结果拼起来:

\[Multi-Head(Q, K, V) = Concat(head_1, ..., head_h) W_O\]

从不同角度查资料,然后把各自的资料汇总起来

head的计算有点没看懂,concat是什么

计算 head_i 里的 QKV 其实是最初的 X,只是为了区分功能写错不一样的字母

concatenate:把几个向量首尾拼接起来

\(W_O\)是为了把不同 head 的直接拼接的信息再杂糅一下

位置编码

句子中的 token 不能光有向量的内容,还要有位置编码写好是第几个 token,在图像中就是二维位置,视频和机器人中就还要时间位置

Mask

训练的时候不看未来的答案

注意力分数矩阵可能原本是:

\[ \begin{bmatrix} s_{11} & s_{12} & s_{13} \\ s_{21} & s_{22} & s_{23} \\ s_{31} & s_{32} & s_{33} \end{bmatrix} \]

加上 mask 后,未来位置被屏蔽:

\[ \begin{bmatrix} s_{11} & -\infty & -\infty \\ s_{21} & s_{22} & -\infty \\ s_{31} & s_{32} & s_{33} \end{bmatrix} \]
还没太懂

mask 可以同时实现训练的时候前面的 token 不看到后面的 token,同时可以并行计算

计算量

假设有 n 个 token,\(O(n^2)\)

算出权重矩阵之后

\[A = softmax(\frac{Q K^{\top}}{\sqrt{d_k}})\]

接着和所有 token 的 value 信息加权求和

\[Attention(Q, K, V) = A V\]

\(V\)的形状是每个 token 的\(v\)堆成的列向量

\(AV\) 就是 \(V\) 的每一行的线性组合

评论