实际训练或使用大模型时,Query, Key, Value怎么定义?

在实际训练和使用大模型时,Query, Key, Value 并不是由我们人工定义的,而是由模型通过训练,从数据中自动学习出来的。

让我们深入拆解这个过程。

核心思想:学习出来的“提问”、“索引”和“内容”

您可以将这个过程想象成训练一个超级研究员:

  • 训练前:你只告诉他:“这里有一些研究资料(输入文本),你需要学会如何提出好问题(Query),如何给资料贴上有用的标签(Key),以及如何提取核心内容(Value)。”
  • 训练后:通过海量数据的训练,他自己学会了一套提出关键问题、制作精准标签和提炼核心信息的方法。这套方法(即权重矩阵)就是模型学到的知识。

具体实现:线性变换

在代码和数学上,这是通过可训练的线性变换层(即一个全连接层)实现的。

步骤分解:

  1. 输入表示

    • 首先,输入文本被转换为一系列数字向量,称为词嵌入。假设我们有一个词,其嵌入向量是 X(一个维度为 d_model 的向量,例如 768 维)。
  2. 线性变换(学习阶段)

    • 模型初始化三个独立的、可训练的权重矩阵W_Q, W_K, W_V。它们的形状通常是 (d_model, d_k),其中 d_k 是注意力头的维度。
    • 然后,通过简单的矩阵乘法,为每个输入词生成其对应的 Q, K, V 向量:
      • Q = X * W_Q
      • K = X * W_K
      • V = X * W_V

这里的精髓在于:

  • W_Q, W_K, W_V 这些矩阵中的参数,是在预训练过程中通过反向传播和梯度下降学习到的。
  • 模型通过大量文本的训练,逐渐调整这些矩阵的值,使得最终生成的 Q, K, V 能够最有效地完成当前的任务(如预测下一个词)。

不同场景下的 Q, K, V 来源

虽然生成 Q, K, V 的方式(线性变换)是固定的,但它们的来源取决于具体的架构和任务。下图清晰地展示了三种主要场景下的数据流:

编码器-解码器注意力
作为 K
编码器输出
作为 V
解码器输出
生成 Q
Q·K 计算关联度
加权求和 V
解码器自注意力
生成 Q
目标序列
生成 K
生成 V
掩码 Q·K
加权求和 V
编码器自注意力
生成 Q
输入序列
生成 K
生成 V
Q·K 计算关联度
加权求和 V

1. 编码器自注意力

  • 描述:模型需要理解输入文本本身(例如,做文本分类时)。
  • Q, K, V 来源全部来自于编码器的输入
  • 目的:让序列中的每个词都能与其他所有词交互,从而获得全局上下文理解。

2. 解码器自注意力

  • 描述:模型在生成输出时,需要关注已经生成的输出部分(例如,在翻译时,生成下一个词前要看已生成的词)。
  • Q, K, V 来源全部来自于解码器已经生成的部分
  • 特殊之处:为了防止模型“偷看”未来信息,会使用掩码,确保在计算第 i 个位置的注意力时,只能看到第 1i 个位置。

3. 编码器-解码器注意力

  • 描述:这是连接输入和输出的桥梁(例如,在翻译时,生成目标语言词汇时需要关注源语言的哪些词)。
  • Q 来源:来自解码器(代表当前需要什么信息)。
  • K, V 来源:来自编码器的最终输出(代表输入序列提供了哪些信息)。
  • 目的:实现对齐,让解码器在每一步生成时,都能聚焦于输入序列中最相关的部分。

一个简单的比喻总结

  • 权重矩阵 W_Q, W_K, W_V:就像三个不同的**“提问模板”“索引制作规则”** 和 “内容提炼指南”。模型通过阅读全世界的文本(训练),学会了这些模板、规则和指南应该长什么样。
  • 输入词向量 X:就像是原始的文本材料
  • 计算 Q, K, V:就是研究员根据他学会的“模板”和“规则”,针对眼前的“原始材料”,提出具体的问题、制作索引卡和提炼出内容卡片。
  • 注意力计算:就是研究员拿着他的问题,去翻阅所有的索引卡,找到最相关的几张,然后把这些内容卡片上的信息融合起来,形成自己的理解。

所以,您不需要手动定义 Q, K, V。您只需要给模型提供数据,它就会在训练过程中自己学会如何生成最有利于解决任务的 Q, K, V。这正是深度学习和大模型的魅力所在。

更多推荐