实际训练或使用大模型时,Query, Key, Value怎么定义?
·
实际训练或使用大模型时,Query, Key, Value怎么定义?
在实际训练和使用大模型时,Query, Key, Value 并不是由我们人工定义的,而是由模型通过训练,从数据中自动学习出来的。
让我们深入拆解这个过程。
核心思想:学习出来的“提问”、“索引”和“内容”
您可以将这个过程想象成训练一个超级研究员:
- 训练前:你只告诉他:“这里有一些研究资料(输入文本),你需要学会如何提出好问题(Query),如何给资料贴上有用的标签(Key),以及如何提取核心内容(Value)。”
- 训练后:通过海量数据的训练,他自己学会了一套提出关键问题、制作精准标签和提炼核心信息的方法。这套方法(即权重矩阵)就是模型学到的知识。
具体实现:线性变换
在代码和数学上,这是通过可训练的线性变换层(即一个全连接层)实现的。
步骤分解:
-
输入表示:
- 首先,输入文本被转换为一系列数字向量,称为词嵌入。假设我们有一个词,其嵌入向量是
X(一个维度为d_model的向量,例如 768 维)。
- 首先,输入文本被转换为一系列数字向量,称为词嵌入。假设我们有一个词,其嵌入向量是
-
线性变换(学习阶段):
- 模型初始化三个独立的、可训练的权重矩阵:
W_Q,W_K,W_V。它们的形状通常是(d_model, d_k),其中d_k是注意力头的维度。 - 然后,通过简单的矩阵乘法,为每个输入词生成其对应的 Q, K, V 向量:
Q = X * W_QK = X * W_KV = X * W_V
- 模型初始化三个独立的、可训练的权重矩阵:
这里的精髓在于:
W_Q,W_K,W_V这些矩阵中的参数,是在预训练过程中通过反向传播和梯度下降学习到的。- 模型通过大量文本的训练,逐渐调整这些矩阵的值,使得最终生成的 Q, K, V 能够最有效地完成当前的任务(如预测下一个词)。
不同场景下的 Q, K, V 来源
虽然生成 Q, K, V 的方式(线性变换)是固定的,但它们的来源取决于具体的架构和任务。下图清晰地展示了三种主要场景下的数据流:
1. 编码器自注意力
- 描述:模型需要理解输入文本本身(例如,做文本分类时)。
- Q, K, V 来源:全部来自于编码器的输入。
- 目的:让序列中的每个词都能与其他所有词交互,从而获得全局上下文理解。
2. 解码器自注意力
- 描述:模型在生成输出时,需要关注已经生成的输出部分(例如,在翻译时,生成下一个词前要看已生成的词)。
- Q, K, V 来源:全部来自于解码器已经生成的部分。
- 特殊之处:为了防止模型“偷看”未来信息,会使用掩码,确保在计算第
i个位置的注意力时,只能看到第1到i个位置。
3. 编码器-解码器注意力
- 描述:这是连接输入和输出的桥梁(例如,在翻译时,生成目标语言词汇时需要关注源语言的哪些词)。
- Q 来源:来自解码器(代表当前需要什么信息)。
- K, V 来源:来自编码器的最终输出(代表输入序列提供了哪些信息)。
- 目的:实现对齐,让解码器在每一步生成时,都能聚焦于输入序列中最相关的部分。
一个简单的比喻总结
- 权重矩阵
W_Q, W_K, W_V:就像三个不同的**“提问模板”、“索引制作规则”** 和 “内容提炼指南”。模型通过阅读全世界的文本(训练),学会了这些模板、规则和指南应该长什么样。 - 输入词向量
X:就像是原始的文本材料。 - 计算 Q, K, V:就是研究员根据他学会的“模板”和“规则”,针对眼前的“原始材料”,提出具体的问题、制作索引卡和提炼出内容卡片。
- 注意力计算:就是研究员拿着他的问题,去翻阅所有的索引卡,找到最相关的几张,然后把这些内容卡片上的信息融合起来,形成自己的理解。
所以,您不需要手动定义 Q, K, V。您只需要给模型提供数据,它就会在训练过程中自己学会如何生成最有利于解决任务的 Q, K, V。这正是深度学习和大模型的魅力所在。
更多推荐
所有评论(0)