|
|
@ -99,6 +99,20 @@ $$
|
|
|
|
|
|
|
|
|
|
|
|
### Attention——QKV权重运算
|
|
|
|
### Attention——QKV权重运算
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
> - **Q的权重矩阵**:用于将输入转换为Query向量,这些向量代表了要查询的信息或者关注的点。
|
|
|
|
|
|
|
|
> - **K的权重矩阵**:用于将输入转换为Key向量,这些向量代表了可以被查询的信息或者关注点的索引。
|
|
|
|
|
|
|
|
> - **V的权重矩阵**:用于将输入转换为Value向量,这些向量代表了与Key相关联的实际信息内容。
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
> 想象你在一个聚会上,你(Query)想找人聊天。你环顾四周,试图找出谁(Key)可能和你兴趣相投。你找到了几个人,然后根据他们的兴趣(Value),你决定和谁聊得更投机。
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
> 在Transformer模型中,这个过程是这样的:
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
> - **Query(Q)**:就像你想找的聊天对象。
|
|
|
|
|
|
|
|
> - **Key(K)**:就像聚会上每个人的兴趣标签。
|
|
|
|
|
|
|
|
> - **Value(V)**:就像根据兴趣标签找到的人,你实际上会和他们聊天。
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
> 模型通过比较每个Query和所有Key,来决定哪些Value最相关,然后把这些信息结合起来,帮助模型更好地理解整个场景。
|
|
|
|
|
|
|
|
|
|
|
|
接下来,我们逐层拆解,来到本章节重点QKV。上一章,文本结果向量化再加上位置编码输出的矩阵是[1,4,768],然而我们不可能只有一个句子,或者是长度只有3个字符。
|
|
|
|
接下来,我们逐层拆解,来到本章节重点QKV。上一章,文本结果向量化再加上位置编码输出的矩阵是[1,4,768],然而我们不可能只有一个句子,或者是长度只有3个字符。
|
|
|
|
|
|
|
|
|
|
|
|
比如现在我们有4句话,同时我们复用GPT-2的768维向量
|
|
|
|
比如现在我们有4句话,同时我们复用GPT-2的768维向量
|
|
|
@ -117,4 +131,26 @@ $$
|
|
|
|
|
|
|
|
|
|
|
|
<img src="../assets/image-20240501162941113.png" alt="image-20240501162941113" style="zoom:50%;" />
|
|
|
|
<img src="../assets/image-20240501162941113.png" alt="image-20240501162941113" style="zoom:50%;" />
|
|
|
|
|
|
|
|
|
|
|
|
把4个[16, 768]维的矩阵分别拿出来,去与[768, 768]维的矩阵相乘。原矩阵里的数值,经过W权重后,出来的Q里的值会不一样。即最终出来的QKV三个矩阵里的值都跟原始的有所变化。
|
|
|
|
把4个[16, 768]维的矩阵分别拿出来,去与[768, 768]维的矩阵相乘。原矩阵里的数值,经过W权重后,出来的Q里的值会不一样。即最终出来的QKV三个矩阵里的值都跟原始的有所变化。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Attention——QKV多头机制
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
上面我们看到单个头的是[4, 16, 768],前面我们也一直提到QKV的多头机制,如果按照GPT里的12头(Transformer原文是4头),那么会这么切分,如下图:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<img src="../assets/image-20240501171813234.png" alt="image-20240501171813234" style="zoom:50%;" />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
可以看到我们将768维的矩阵,切成了12分,每份是64维。另外,由于大模型都是后两位数矩阵相乘,所以我们把头跟长互换,即[4, 16, 12, 64]转为[4, 12, 16, 64]。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### QK矩阵相乘
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
> 再次补充一下,Q是要查询的文本的信息,K则是被查询的信息或索引。即要查询文本的向量跟其它文本的向量的相似度。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QKV分别获得后,QK则是根据路线进行矩阵相乘,如下图
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<img src="../assets/image-20240501173316308.png" alt="image-20240501173316308" style="zoom:50%;" />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
其中我们把K进行了翻转,方便相乘。矩阵相乘则是每个batch_size里的每个头进行矩阵相乘,即[16, 64]和[64, 16]进行矩阵相乘,相乘后则是变成了[16, 16]的矩阵。
|