diff --git a/assets/image-20240501171813234.png b/assets/image-20240501171813234.png
new file mode 100644
index 0000000..2468dd7
Binary files /dev/null and b/assets/image-20240501171813234.png differ
diff --git a/assets/image-20240501173316308.png b/assets/image-20240501173316308.png
new file mode 100644
index 0000000..9c9d105
Binary files /dev/null and b/assets/image-20240501173316308.png differ
diff --git a/人人都能看懂的Transformer/第四章——语义关系学习.md b/人人都能看懂的Transformer/第四章——语义关系学习.md
index 1d85148..b2bb5be 100644
--- a/人人都能看懂的Transformer/第四章——语义关系学习.md
+++ b/人人都能看懂的Transformer/第四章——语义关系学习.md
@@ -99,6 +99,20 @@ $$
### 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个字符。
比如现在我们有4句话,同时我们复用GPT-2的768维向量
@@ -117,4 +131,26 @@ $$
-把4个[16, 768]维的矩阵分别拿出来,去与[768, 768]维的矩阵相乘。原矩阵里的数值,经过W权重后,出来的Q里的值会不一样。即最终出来的QKV三个矩阵里的值都跟原始的有所变化。
\ No newline at end of file
+把4个[16, 768]维的矩阵分别拿出来,去与[768, 768]维的矩阵相乘。原矩阵里的数值,经过W权重后,出来的Q里的值会不一样。即最终出来的QKV三个矩阵里的值都跟原始的有所变化。
+
+
+
+### Attention——QKV多头机制
+
+上面我们看到单个头的是[4, 16, 768],前面我们也一直提到QKV的多头机制,如果按照GPT里的12头(Transformer原文是4头),那么会这么切分,如下图:
+
+
+
+可以看到我们将768维的矩阵,切成了12分,每份是64维。另外,由于大模型都是后两位数矩阵相乘,所以我们把头跟长互换,即[4, 16, 12, 64]转为[4, 12, 16, 64]。
+
+
+
+### QK矩阵相乘
+
+> 再次补充一下,Q是要查询的文本的信息,K则是被查询的信息或索引。即要查询文本的向量跟其它文本的向量的相似度。
+
+QKV分别获得后,QK则是根据路线进行矩阵相乘,如下图
+
+
+
+其中我们把K进行了翻转,方便相乘。矩阵相乘则是每个batch_size里的每个头进行矩阵相乘,即[16, 64]和[64, 16]进行矩阵相乘,相乘后则是变成了[16, 16]的矩阵。
\ No newline at end of file