|
|
|
@ -52,7 +52,7 @@ $$
|
|
|
|
|
|
|
|
|
|
将上面的值转成0到1直接的值,即百分比的概率分布。它会放大分数较高的元素,并抑制分数较低的元素。在注意力机制中,这意味着模型可以更加集中地关注那些与当前查询(Query)最相关的键(Key),从而获取对应的值(Value)。
|
|
|
|
|
|
|
|
|
|
<img src="../assets/image-20240502150841107.png" alt="image-20240502150841107" style="zoom:50%;" />
|
|
|
|
|
<img src="../assets/image-20240502212834597.png" alt="image-20240502212834597" style="zoom:50%;" />
|
|
|
|
|
|
|
|
|
|
Softmax函数的公式如下:
|
|
|
|
|
$$
|
|
|
|
@ -60,10 +60,68 @@ $$
|
|
|
|
|
$$
|
|
|
|
|
这里就不做详解,你就简单理解为:它可以将一批值,转换为一个概率分布,其中每个元素的值介于0和1之间,并且所有元素的和为1。
|
|
|
|
|
|
|
|
|
|
<img src="../assets/image-20240502152450856.png" alt="image-20240502152450856" style="zoom:50%;" />
|
|
|
|
|
<img src="../assets/image-20240502214058704.png" alt="image-20240502214058704" style="zoom:50%;" />
|
|
|
|
|
|
|
|
|
|
可以看到`LL`对其它文本信息的概率总和是1,`M`对其它文本信息的概率总和也是1。以此类推,此时整个矩阵的形状是没有变的。
|
|
|
|
|
可以看到`LL`对全部文本信息(包括它本身)的概率总和是1,`M`对全部文本信息的概率总和也是1。以此类推,此时整个矩阵的形状是没有变的。
|
|
|
|
|
|
|
|
|
|
> 为什么是包括它本身?
|
|
|
|
|
>
|
|
|
|
|
> 1.**完整的上下文信息**:一个元素的含义往往不仅取决于它与其他元素的关系,也取决于它自身的特性。
|
|
|
|
|
>
|
|
|
|
|
> 2.**自引用的重要性**:在某些情况下,元素自身可能是理解其上下文中最重要的部分。即代词“它”指代前文提到的名词。
|
|
|
|
|
>
|
|
|
|
|
> 3.**灵活性和泛化能力**:自注意力机制不对元素之间的关系做任何先验假设,它允许模型在训练过程中学习到元素之间的复杂关系,包括元素与自身的关系。
|
|
|
|
|
>
|
|
|
|
|
> 4.**简化模型结构**:不做过多的代码处理,使得模型更易于实现和优化。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### QK与V矩阵相乘
|
|
|
|
|
|
|
|
|
|
前面我们QK矩阵相乘,并经过了Scale、Mask和Softmax,接下来就要跟V去做矩阵相乘
|
|
|
|
|
|
|
|
|
|
<img src="../assets/image-20240502223139032.png" alt="image-20240502223139032" style="zoom:50%;" />
|
|
|
|
|
|
|
|
|
|
如上图所示,V跟一开始的QK一样,都是[4, 12, 16, 64]即64维,前面的矩阵相乘我们知道,只要第一个矩阵的第二个维度值 跟 第二个矩阵的第一个维度值一样,它们就能相乘。即[16, 16]跟[16, 64]是可以矩阵相乘的,得出的矩阵A。
|
|
|
|
|
|
|
|
|
|
A就代表着我们这个Attention关注度计算。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### QKV机制的数学逻辑
|
|
|
|
|
|
|
|
|
|
<img src="../assets/image-20240502223231828.png" alt="image-20240502223231828" style="zoom:50%;" />
|
|
|
|
|
|
|
|
|
|
我们先看Q@K的结果,里面是每一个token(文字的信息)对应其它文字token的权重关系且是一个百分比的形式。V是原始形状[16, 64],每行就是每个文字随机初始化的数字矩阵(如果是推理截断,这些值则是训练好的),即每个token对应的64维的向量数据,64维。两者矩阵相乘是矩阵A。
|
|
|
|
|
|
|
|
|
|
这里建议大家回到第四章,再看一遍“什么是矩阵相乘”以及“为什么是矩阵相乘-几何解释”。看完后你再确定矩阵相乘,就是第一个矩阵的第一行 跟 第二个矩阵的第一列相乘求和,以此类推。伪代码如下
|
|
|
|
|
|
|
|
|
|
~~~python
|
|
|
|
|
# 我随便造一点数据
|
|
|
|
|
import numpy as np
|
|
|
|
|
|
|
|
|
|
np.random.seed(0)
|
|
|
|
|
matrix_A = np.random.rand(3, 3)
|
|
|
|
|
matrix_B = np.random.rand(3, 6)
|
|
|
|
|
product_matrix = np.dot(matrix_A, matrix_B)
|
|
|
|
|
|
|
|
|
|
print("Matrix A (3x3):")
|
|
|
|
|
print(matrix_A)
|
|
|
|
|
print("\nMatrix B (3x6):")
|
|
|
|
|
print(matrix_B)
|
|
|
|
|
print("\nProduct Matrix (3x6):")
|
|
|
|
|
print(product_matrix)
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
<img src="../assets/image-20240502222706741.png" alt="image-20240502222706741" style="zoom:50%;" />
|
|
|
|
|
|
|
|
|
|
可以看到,A1的结果是QK矩阵的第一行跟V矩阵的第一列相乘的结果。而第一行是QK最终通过softmax输出的`LL`对全部文本信息的概率总和,而V矩阵的第一列,则是全部文字向量化后,在64维里的第一个维度的数值。即`LL`的概率总和(向量) 与 `LLM with me.郭同学热爱AI喜欢游戏`的一维向量 相乘。等于`LL`在这个维度里(第一维),对所有文本(包括它本身)的关注度的总权重(权重总和)。
|
|
|
|
|
|
|
|
|
|
当然,我们的V还有第二维,如下所示
|
|
|
|
|
|
|
|
|
|
<img src="../assets/image-20240502224309316.png" alt="image-20240502224309316" style="zoom:50%;" />
|
|
|
|
|
|
|
|
|
|
A矩阵里的第一行第二列的值,则是QK矩阵第一行跟V的第二列 相乘的结果,也就是`LL`对于在第二维,对所有文本的总权重。后续的值则以此类推。
|
|
|
|
|
|
|
|
|
|
也就是最终的矩阵A里面,就是每个文本对所有文本的关注度的总权重(权重总和),并且有64个维度(每个头和每个批次里)。在训练过程中,通过不断的训练后,推理阶段就能得出输入文字中,哪些文字的权重比较高(重要性)。
|
|
|
|
|
|
|
|
|
|