在上一篇文章中我们精读了 Transformer 原论文 Attention Is All You Need。Transformer 的核心思想是不再使用 RNN 或 CNN而是完全基于 Attention 机制构建序列建模结构。原论文提出的 Transformer 由 Encoder 和 Decoder 组成其中最关键的模块就是 Scaled Dot-Product Attention 和 Multi-Head Attention。论文摘要中也明确指出Transformer 是一种完全基于 attention mechanism 的网络结构去掉了 recurrence 和 convolution并且更容易并行训练。一、Self-Attention 要解决什么问题在自然语言中一个词的含义往往不能只看它自己而要看上下文。例如下面这句话苹果发布了新的芯片性能提升非常明显。这里的“苹果”不是水果而是公司。再看另一个句子我买了一个苹果吃起来很甜。这里的“苹果”才是水果。同一个词在不同上下文中含义不同。所以语言模型必须解决一个问题当前 token 应该根据上下文中的哪些 token 来更新自己的表示Self-Attention 的作用就是让每个 token 都可以主动去“查看”序列中的其他 token并根据相关程度聚合信息。简单来说Self-Attention 让序列内部的 token 彼此交流信息假设有一句话小明 因为 考试 没考好 所以 他 很难过模型在处理“他”这个 token 时需要知道“他”指的是“小明”。如果是 RNN这个信息需要从“小明”一步一步传递到“他”。而 Self-Attention 可以让“他”直接关注“小明”。这就是 Self-Attention 的直观意义不再依赖顺序递推而是让任意 token 之间直接建立联系。二、从一个句子开始理解 Self-Attention假设输入句子是我 喜欢 机器 学习分词后有 4 个 tokenx1 我x2 喜欢x3 机器x4 学习经过 embedding 层后每个 token 会变成一个向量这些向量可以组成一个矩阵假设每个 token 的 embedding 维度是序列长度是 n那么其中n是 token 数量是每个 token 向量的维度。Self-Attention 要做的事情是根据所有 token 之间的关系为每个 token 生成一个新的上下文表示。也就是说原来的 token 表示只包含自身信息而经过 Self-Attention 后每个 token 的表示都会融合其他 token 的信息。三、为什么需要 Q、K、VSelf-Attention 中最核心的三个概念是QQueryKKeyVValue中文通常翻译为Query查询Key键Value值这三个词看起来有点抽象可以先用一个生活化例子理解。假设你去图书馆找书。你的需求是我想找一本关于深度学习的书。这个需求就像 Query。图书馆中每本书都有一些标签例如机器学习深度学习计算机视觉自然语言处理数学基础这些标签就像 Key。每本书的实际内容就是 Value。你找书的过程可以理解为用 Query 去匹配每本书的 Key找到最相关的书读取这些书的 Value对应到 Self-Attention 中Query当前 token 想找什么信息Key每个 token 能提供什么匹配信号Value每个 token 真正携带的内容信息所以 Q、K、V 的直观含义是符号含义直观理解QQuery我想找什么KKey我有什么特征可供匹配VValue我真正要提供什么信息注意这只是帮助理解的比喻。在模型中Q、K、V 并不是人工定义的而是通过训练自动学出来的向量表示。四、Q、K、V 是怎么生成的输入矩阵为Self-Attention 会通过三个不同的线性变换把 XXX 映射成 Q、K、V