|
|
|
@ -8,9 +8,9 @@
|
|
|
|
|
|
|
|
|
|
放大语义关系学习(注意力机制)内部
|
|
|
|
|
|
|
|
|
|
<img src="../assets/0*0KPEV8QidHkteKeY.png" alt="A step-by-step breakdown of self attention | by fishingalone | Medium" style="zoom:50%;" />
|
|
|
|
|
<img src="../assets/image-20240501143058994.png" alt="image-20240501143058994" style="zoom:50%;" />
|
|
|
|
|
|
|
|
|
|
> Linear:线性层。数学表达式是 `y = wx + b`,其中 `x` 是输入向量,`W`是权重矩阵,`b` 是偏置向量,`y` 是输出向量。
|
|
|
|
|
> Wq/Wk/Wv(Linear):线性层。数学表达式是 `y = wx + b`,其中 `x` 是输入向量,`W`是权重矩阵,`b` 是偏置向量,`y` 是输出向量。
|
|
|
|
|
>
|
|
|
|
|
> MatMul: 矩阵相乘。一种线性代数运算,用于计算两个矩阵的乘积。如果有两个矩阵 A 和 B,它们的乘积 C 通过将 A 的行与 B 的列对应元素相乘然后求和来计算。
|
|
|
|
|
>
|
|
|
|
@ -18,7 +18,7 @@
|
|
|
|
|
>
|
|
|
|
|
> Softmax:软最大值。oftmax用于将注意力分数(经过缩放的矩阵乘法结果)转换为概率值,这些概率值表示每个头在给定输入时应该关注的程度。
|
|
|
|
|
|
|
|
|
|
QKV会结果一个线形层,也就是X会变成3份,分别去乘以不同的权重W。变成QKV,经过各种层后,最终输出上面说的缩放好的点积注意力机制,也就是除开Scale、Maks、Softmax外,是包裹了两次的矩阵相乘。这也是最重要的部分,为什么是矩阵相乘呢?矩阵相乘能代表词之间的关注度高低吗?
|
|
|
|
|
输入矩阵X会变成3份,分别去乘以不同的权重W。变成QKV,经过各种层后,最终输出上面说的缩放好的点积注意力机制,也就是除开Scale、Maks、Softmax外,是包裹了两次的矩阵相乘。这也是最重要的部分,为什么是矩阵相乘呢?矩阵相乘能代表词之间的关注度高低吗?
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -45,7 +45,7 @@ QKV会结果一个线形层,也就是X会变成3份,分别去乘以不同的
|
|
|
|
|
|
|
|
|
|
<img src="../assets/419801703.png" alt="L15.png" style="zoom:30%;" />
|
|
|
|
|
|
|
|
|
|
最终输出的是[3,1]的矩阵,即一个向量`[16 4 7]`。
|
|
|
|
|
最终输出的是[3,1]的矩阵,即一个向量`[16 4 7]`。从上面我们也知道,只要[3,2]里的这个2,能够对应上另外一个矩阵的行,就能够相乘。即[3,2]对应上面的[2,1],2跟2对应。即第一个矩阵的第二个数 能跟 第二个矩阵的第一个数对应上,就能相乘。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -93,4 +93,28 @@ $$
|
|
|
|
|
|
|
|
|
|
<img src="../assets/image-20240430194034870.png" alt="image-20240430194034870" style="zoom:50%;" />
|
|
|
|
|
|
|
|
|
|
当然时间向量的值一般是[-1,+1]区间的,而不是整数型,这里是一个简单的示例。而且还会经过不断的训练循环,来不断的调整每个文本的多维表达数值分别是多少,也就是LLM初始值假设是[1,2,3],可能训练的下一轮是[-1,3,1]下一轮又是[3,1,2],直到最终训练结束。
|
|
|
|
|
当然时间向量的值一般是[-1,+1]区间的,而不是整数型,这里是一个简单的示例。而且还会经过不断的训练循环,来不断的调整每个文本的多维表达数值分别是多少,也就是LLM初始值假设是[1,2,3],可能训练的下一轮是[-1,3,1]下一轮又是[3,1,2],直到最终训练结束。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Attention——QKV权重运算
|
|
|
|
|
|
|
|
|
|
接下来,我们逐层拆解,来到本章节重点QKV。上一章,文本结果向量化再加上位置编码输出的矩阵是[1,4,768],然而我们不可能只有一个句子,或者是长度只有3个字符。
|
|
|
|
|
|
|
|
|
|
比如现在我们有4句话,同时我们复用GPT-2的768维向量
|
|
|
|
|
|
|
|
|
|
<img src="../assets/image-20240501154039606.png" alt="image-20240501154039606" 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%;" />
|
|
|
|
|
|
|
|
|
|
如上图所示,Wq的也是[768, 768]维的矩阵,Wk、Wv同理,它们一开始会初始化值,训练过程会自动调整。
|
|
|
|
|
|
|
|
|
|
单独拿一个Q出来细看,[4, 16, 768]跟[768, 768]是怎么矩阵相乘的,实际上,相乘都是后两个维度跟768相乘,也就是[16,768]跟[768,768]。如下图所示:
|
|
|
|
|
|
|
|
|
|
<img src="../assets/image-20240501162941113.png" alt="image-20240501162941113" style="zoom:50%;" />
|
|
|
|
|
|
|
|
|
|
把4个[16, 768]维的矩阵分别拿出来,去与[768, 768]维的矩阵相乘。原矩阵里的数值,经过W权重后,出来的Q里的值会不一样。即最终出来的QKV三个矩阵里的值都跟原始的有所变化。
|