注意力机制相关

注意力机制简单了解。

简介

注意力机制的通俗理解

让我们通过几个生活中的例子来理解:

例子1: 阅读理解
假设有这样一段话:
“小明很喜欢打篮球。他每天都会去操场练习。”

当我们读到”他”这个字的时候,大脑会自动去寻找这个”他”指的是谁。通过上下文,我们知道”他”指的是”小明”。这就是一个最基本的注意力机制 - 我们的大脑会自动关注到相关的重要信息。

例子2: 歧义词理解
“我在得物上买了最新款的苹果,体验非常好”
“我在得物上买了阿克苏的苹果,口感非常好”

在这两句话中,”苹果”是一个歧义词:

  • 第一句中的”苹果”指的是iPhone手机,因为搭配了”最新款”和”体验”
  • 第二句中的”苹果”指的是水果,因为搭配了”阿克苏”和”口感”

注意力机制就是帮助模型像人类大脑一样,通过上下文来理解每个词的真实含义。

注意力机制是如何工作的

让我用一个形象的例子来解释:

想象你在看一个很长的句子:”昨天下午,小明在公园里遇到了小红,她穿着一条蓝色的裙子。”

当模型在处理”她”这个词时,会:

1) 计算相关度分数:

  • “她” 和 “小明” 的相关度: 较低(因为性别不匹配)
  • “她” 和 “小红” 的相关度: 很高(因为性别匹配)
  • “她” 和其他词的相关度: 较低

2) 分配注意力权重:

  • “小红” 获得最高的注意力权重
  • 其他词获得较低的注意力权重

3) 整合信息:
模型会重点关注高权重的信息,从而理解”她”指代的是”小红”。

多头注意力机制

继续用刚才的例子:
“昨天下午,小明在公园里遇到了小红,她穿着一条蓝色的裙子。”

多头注意力就像是从多个角度来理解这句话:

  • 第1个注意力头可能关注人物关系:
    发现”她”和”小红”的关联

  • 第2个注意力头可能关注时间信息:
    关注”昨天下午”这个时间点

  • 第3个注意力头可能关注地点信息:
    关注”公园”这个场所

  • 第4个注意力头可能关注动作信息:
    关注”遇到”这个动作

这就像多个人从不同角度来理解同一句话,最后把这些理解综合起来,得到更全面的理解。

为什么需要注意力机制

在注意力机制出现之前,模型处理长文本有这些问题:

  • 无法很好地处理长距离依赖
    比如在很长的文章中,可能会”忘记”前面提到的重要信息

  • 不能并行处理
    必须一个词一个词按顺序处理,效率较低

注意力机制解决了这些问题:

  • 可以直接建立任意两个词之间的联系
  • 支持并行计算,大大提高了处理效率

为什么可以并行

对比传统模型(RNN)和Transformer来解释为什么Transformer支持并行计算。

传统RNN模型的处理方式

假设我们有一句话:”我喜欢吃苹果”

RNN必须按顺序一个词一个词处理:

1
2
3
4
第1步:处理"我"
第2步:处理"喜欢" (必须等第1步完成)
第3步:处理"吃" (必须等第2步完成)
第4步:处理"苹果" (必须等第3步完成)

就像是在读一本书,你必须从第一页开始,按顺序一页一页读下去,不能跳着读。这就是”顺序处理”。

Transformer的并行处理方式

Transformer可以同时处理所有的词:

1
2
3
4
5
同时处理:
- "我"
- "喜欢"
- "吃"
- "苹果"

这就像是有4个人,每个人负责读一个词,他们可以同时开始读。这就是”并行处理”。

为什么Transformer能做到并行?

关键在于位置编码(Positional Encoding)和自注意力机制:

a) 位置编码:

  • 每个词都会被赋予一个位置信息
  • 比如:”我”(位置1)、”喜欢”(位置2)、”吃”(位置3)、”苹果”(位置4)
  • 这样即使同时处理所有词,模型也知道每个词在句子中的位置

举个例子:
就像给每个人发一张带编号的扑克牌:

  • “我” → 1号牌
  • “喜欢” → 2号牌
  • “吃” → 3号牌
  • “苹果” → 4号牌

这样即使大家同时看自己的牌,也知道这些词的正确顺序。

b) 自注意力机制:

  • 每个词可以同时和句子中的所有其他词计算注意力分数
  • 不需要等待前面的词处理完成

举个例子:
想象一个会议室里有4个人,每个人负责一个词:

  • A负责”我”
  • B负责”喜欢”
  • C负责”吃”
  • D负责”苹果”

他们可以同时开始工作:

  1. 每个人都有一份完整的句子副本
  2. 他们可以同时查看整个句子
  3. 各自计算自己负责的词与其他词的关联度

  4. 实际的计算优势:

假设处理一个有100个词的句子:

  • RNN需要100个时间步骤,因为必须一个词一个词处理
  • Transformer只需要1个时间步骤,因为可以同时处理100个词

这就像是:

  • RNN:一个人要读100页书,需要花100分钟
  • Transformer:100个人同时读,每人读1页,只需要1分钟

在GPU上的优势

现代GPU擅长并行计算,就像有很多个小工人可以同时工作。

  • Transformer充分利用了这一优势,可以让GPU同时处理多个词
  • 而RNN因为必须按顺序处理,无法充分利用GPU的并行能力

这就是为什么说Transformer支持并行计算,它通过巧妙的设计(位置编码+自注意力机制),让所有词可以同时被处理,大大提高了计算效率。这也是Transformer相比RNN的一个重要优势。

注意力机制计算过程

基本概念:Query(查询)、Key(键)、Value(值)

先用一个生活中的例子来理解这三个概念:
想象你去图书馆找书:

  • Query(查询):你想找的书的关键词,比如”人工智能入门”
  • Key(键):图书馆里每本书的标题
  • Value(值):书的具体内容

在Transformer中的对应关系

还是用前面的例子:
“昨天下午,小明在公园里遇到了小红,她穿着一条蓝色的裙子。”

当我们要理解”她”这个词时:

  • Query(查询):是”她”这个词的表示向量
  • Key(键):句子中所有词的表示向量
  • Value(值):句子中所有词携带的信息

具体计算步骤

让我们用一个简化的例子来说明:
“小红很喜欢吃苹果”

第一步:转换为向量
假设我们用2维向量来表示每个词(实际中通常是512维或更高):

1
2
3
4
5
"小红" → [2, 3]
"很" → [1, 1]
"喜欢" → [2, 2]
"吃" → [1, 2]
"苹果" → [3, 1]

第二步:计算Query、Key、Value
每个词都会被转换为三种向量:

1
2
3
4
例如"小红":
Q向量(查询):[2, 3] × WQ = [4, 6]
K向量(键):[2, 3] × WK = [5, 7]
V向量(值):[2, 3] × WV = [3, 4]

(其中WQ、WK、WV是可学习的权重矩阵)

第三步:计算注意力分数
以”小红”为例,计算它与所有词的相关度:

1
2
3
4
5
6
7
相关度 = Q向量 · K向量 / √维度

比如"小红"和"苹果"的相关度:
= [4, 6] · [5, 7] / √2
= (4×5 + 6×7) / 1.414
= (20 + 42) / 1.414
= 43.7

第四步:归一化分数
使用softmax函数将所有分数转换为0-1之间的概率值:

1
2
原始分数:[43.7, 35.2, 28.9, 31.5, 39.6]
归一化后:[0.3, 0.2, 0.1, 0.15, 0.25]

第五步:加权求和
用这些概率值去加权每个词的Value向量:

1
最终表示 = 0.3×V1 + 0.2×V2 + 0.1×V3 + 0.15×V4 + 0.25×V5

多头注意力

实际上,Transformer使用了多头注意力机制,相当于:

1
2
3
4
- 注意力头1:可能关注语法关系
- 注意力头2:可能关注语义关系
- 注意力头3:可能关注位置关系
...(通常有8个头)

每个头都独立计算注意力分数,最后将所有结果合并。

形象的比喻

这个过程就像:

  • 一个人(Query)在派对上(句子)寻找聊天对象
  • 他会看看每个人(Key)是否适合聊天
  • 计算相关度就像评估与每个人的共同话题多少
  • 最后主要和相关度高的人(Value)交流

或者像:

  • 一个学生(Query)在解答问题
  • 他会查看所有笔记(Key)
  • 计算每页笔记与问题的相关度
  • 最后主要参考相关度高的笔记内容(Value)

这就是注意力分数的计算过程。虽然数学计算看起来复杂,但基本思想是让模型能够像人类一样,通过计算相关度来决定应该重点关注哪些信息。

向量

词向量的基本概念

词向量(Word Embedding)是将单词转换为计算机可以理解的数值向量的方法。主要有以下特点:

  • 每个单词被映射到一个固定维度(比如300维)的向量空间中
  • 语义相近的词在向量空间中的距离也相近
  • 向量之间可以进行数学运算,比如:
    vector(‘国王’) - vector(‘男人’) + vector(‘女人’) ≈ vector(‘女王’)

获取词向量的主要方法

(1) Word2Vec模型:

  • CBOW(Continuous Bag of Words):使用上下文预测目标词
  • Skip-gram:使用目标词预测上下文词
  • 通过神经网络训练,学习词与词之间的语义关系

(2) GloVe模型:

  • 基于全局矩阵分解
  • 统计词与词的共现频率
  • 结合局部上下文窗口方法

(3) FastText模型:

  • 将单词分解为子词单元(n-gram)
  • 能处理词表外的词
  • 对拼写错误有一定容忍度

Transformer中的向量表示

Transformer中的输入向量由三部分组成:

(1) 词嵌入(Token Embeddings):

  • 表示单词本身的语义
  • 通过可训练的嵌入矩阵获得
  • 维度通常是512维

(2) 位置嵌入(Positional Embeddings):

  • 表示单词在序列中的位置信息
  • 使用正弦和余弦函数计算
  • 与词嵌入维度相同

(3) 段嵌入(Segment Embeddings):

  • 用于区分不同的句子或段落
  • 主要用于BERT等模型

向量的计算过程

(1) 首先进行分词(Tokenization):

  • 将输入文本分解为token
  • 每个token映射到一个唯一的ID
  • 构建词表(Vocabulary)

(2) 通过嵌入层获取词向量:

1
2
embedding = nn.Embedding(vocab_size, embedding_dim)
token_embedding = embedding(token_ids)

(3) 计算位置编码:

1
2
PE(pos,2i) = sin(pos/10000^(2i/d))
PE(pos,2i+1) = cos(pos/10000^(2i/d))

(4) 将词向量和位置编码相加:

1
final_embedding = token_embedding + positional_embedding

向量的特点

  • 维度固定:通常是512维或768维
  • 稠密表示:每个维度都有值,不是one-hot编码
  • 可训练:通过反向传播不断优化
  • 可解释:向量间的距离和运算有语义含义

这样,每个输入token最终都被转换为一个包含语义信息和位置信息的高维向量,作为Transformer的输入。这种向量表示使得模型能够:

  • 理解词与词之间的语义关系
  • 捕捉序列中的位置信息
  • 并行处理整个序列
  • 处理变长的输入

这就是Transformer中向量表示的基本原理。通过这种方式,模型可以有效地理解和处理自然语言。

------本文结束 感谢阅读------