|
|
|
@ -1,4 +1,4 @@
|
|
|
|
|
# 第四章——语义关系学习(多头注意力机制)
|
|
|
|
|
# 第四章——多头注意力机制——QK矩阵相乘
|
|
|
|
|
|
|
|
|
|
<img src="../assets/image-20240421212923027.png" alt="语义关系学习" style="zoom:50%;" />
|
|
|
|
|
|
|
|
|
@ -97,7 +97,7 @@ $$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Attention——QKV权重运算
|
|
|
|
|
### QKV权重运算
|
|
|
|
|
|
|
|
|
|
> - **Q的权重矩阵**:用于将输入转换为Query向量,这些向量代表了要查询的信息或者关注的点。
|
|
|
|
|
> - **K的权重矩阵**:用于将输入转换为Key向量,这些向量代表了可以被查询的信息或者关注点的索引。
|
|
|
|
@ -117,13 +117,13 @@ $$
|
|
|
|
|
|
|
|
|
|
比如现在我们有4句话,同时我们复用GPT-2的768维向量
|
|
|
|
|
|
|
|
|
|
<img src="../assets/image-20240501154039606.png" alt="image-20240501154039606" style="zoom:50%;" />
|
|
|
|
|
<img src="../assets/image-20240502132738816.png" alt="image-20240502132738816" style="zoom:50%;" />
|
|
|
|
|
|
|
|
|
|
[4, 16, 768] = [batch_size, max_length, d_model],batch_size就是我们可以做并行的设置,做算法建模的同学应该对这个比较熟悉,越大的batch_size,意味着需要越大的内存和显存。max_length则是我们设置的最大长度,超过则截断(因为资源也是有限的,我们一般取能获取到绝大多数完整句子的长度即可)。768则是GPT-2的默认向量维度。
|
|
|
|
|
|
|
|
|
|
看上面的图,[4, 16, 768]复制成3份,分别去与Wq、Wk和Wv矩阵相乘。
|
|
|
|
|
|
|
|
|
|
<img src="../assets/image-20240501155804590.png" alt="image-20240501155804590" style="zoom:50%;" />
|
|
|
|
|
<img src="../assets/image-20240502132811665.png" alt="image-20240502132811665" style="zoom:50%;" />
|
|
|
|
|
|
|
|
|
|
如上图所示,Wq的也是[768, 768]维的矩阵,Wk、Wv同理,它们一开始会初始化值,训练过程会自动调整。
|
|
|
|
|
|
|
|
|
@ -135,11 +135,11 @@ $$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Attention——QKV多头机制
|
|
|
|
|
### QKV多头机制
|
|
|
|
|
|
|
|
|
|
上面我们看到单个头的是[4, 16, 768],前面我们也一直提到QKV的多头机制,如果按照GPT里的12头(Transformer原文是4头),那么会这么切分,如下图:
|
|
|
|
|
|
|
|
|
|
<img src="../assets/image-20240501171813234.png" alt="image-20240501171813234" style="zoom:50%;" />
|
|
|
|
|
<img src="../assets/image-20240502134443646.png" alt="image-20240502134443646" style="zoom:50%;" />
|
|
|
|
|
|
|
|
|
|
可以看到我们将768维的矩阵,切成了12分,每份是64维。另外,由于大模型都是后两位数矩阵相乘,所以我们把头跟长互换,即[4, 16, 12, 64]转为[4, 12, 16, 64]。
|
|
|
|
|
|
|
|
|
@ -153,4 +153,23 @@ QKV分别获得后,QK则是根据路线进行矩阵相乘,如下图
|
|
|
|
|
|
|
|
|
|
<img src="../assets/image-20240501173316308.png" alt="image-20240501173316308" style="zoom:50%;" />
|
|
|
|
|
|
|
|
|
|
其中我们把K进行了翻转,方便相乘。矩阵相乘则是每个batch_size里的每个头进行矩阵相乘,即[16, 64]和[64, 16]进行矩阵相乘,相乘后则是变成了[16, 16]的矩阵。
|
|
|
|
|
其中我们把K进行了翻转,方便相乘。矩阵相乘则是每个batch_size里的每个头进行矩阵相乘,即[16, 64]和[64, 16]进行矩阵相乘,相乘后则是变成了[16, 16]的矩阵。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### QK与V矩阵相乘
|
|
|
|
|
|
|
|
|
|
上面我们计算好了QK相乘后的矩阵,我们看下原文中的Attention公式
|
|
|
|
|
$$
|
|
|
|
|
\operatorname{Attention}(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V
|
|
|
|
|
$$
|
|
|
|
|
<img src="../assets/image-20240502140356134.png" alt="image-20240502140356134" style="zoom:50%;" />
|
|
|
|
|
|
|
|
|
|
我们单独拿1个批次的第一个头出来
|
|
|
|
|
|
|
|
|
|
![image-20240502140715615](../assets/image-20240502140715615.png)
|
|
|
|
|
|
|
|
|
|
第一行的所有数据,分别上`LL`分别跟`LLM with me.郭同学热爱AI喜欢游戏`每个词的相关性。第二行则是`M`分别跟`LLM with me.郭同学热爱AI喜欢游戏`每个词的相关性。越高则代表两个字的相关性越高,越低则代表两个字的相关性越低。
|
|
|
|
|
|
|
|
|
|
<img src="../assets/image-20240502141342857.png" alt="image-20240502141342857" style="zoom:50%;" />
|
|
|
|
|
|