简介
注意力机制的通俗理解
让我们通过几个生活中的例子来理解:
例子1: 阅读理解
假设有这样一段话:
“小明很喜欢打篮球。他每天都会去操场练习。”
当我们读到”他”这个字的时候,大脑会自动去寻找这个”他”指的是谁。通过上下文,我们知道”他”指的是”小明”。这就是一个最基本的注意力机制 - 我们的大脑会自动关注到相关的重要信息。
例子2: 歧义词理解
“我在得物上买了最新款的苹果,体验非常好”
“我在得物上买了阿克苏的苹果,口感非常好”
在这两句话中,”苹果”是一个歧义词:
- 第一句中的”苹果”指的是iPhone手机,因为搭配了”最新款”和”体验”
- 第二句中的”苹果”指的是水果,因为搭配了”阿克苏”和”口感”
注意力机制就是帮助模型像人类大脑一样,通过上下文来理解每个词的真实含义。
注意力机制是如何工作的
让我用一个形象的例子来解释:
想象你在看一个很长的句子:”昨天下午,小明在公园里遇到了小红,她穿着一条蓝色的裙子。”
当模型在处理”她”这个词时,会:
1) 计算相关度分数:
- “她” 和 “小明” 的相关度: 较低(因为性别不匹配)
- “她” 和 “小红” 的相关度: 很高(因为性别匹配)
- “她” 和其他词的相关度: 较低
2) 分配注意力权重:
- “小红” 获得最高的注意力权重
- 其他词获得较低的注意力权重
3) 整合信息:
模型会重点关注高权重的信息,从而理解”她”指代的是”小红”。
多头注意力机制
继续用刚才的例子:
“昨天下午,小明在公园里遇到了小红,她穿着一条蓝色的裙子。”
多头注意力就像是从多个角度来理解这句话:
第1个注意力头可能关注人物关系:
发现”她”和”小红”的关联第2个注意力头可能关注时间信息:
关注”昨天下午”这个时间点第3个注意力头可能关注地点信息:
关注”公园”这个场所第4个注意力头可能关注动作信息:
关注”遇到”这个动作
这就像多个人从不同角度来理解同一句话,最后把这些理解综合起来,得到更全面的理解。
为什么需要注意力机制
在注意力机制出现之前,模型处理长文本有这些问题:
无法很好地处理长距离依赖
比如在很长的文章中,可能会”忘记”前面提到的重要信息不能并行处理
必须一个词一个词按顺序处理,效率较低
注意力机制解决了这些问题:
- 可以直接建立任意两个词之间的联系
- 支持并行计算,大大提高了处理效率
为什么可以并行
对比传统模型(RNN)和Transformer来解释为什么Transformer支持并行计算。
传统RNN模型的处理方式
假设我们有一句话:”我喜欢吃苹果”
RNN必须按顺序一个词一个词处理:
1 | 第1步:处理"我" |
就像是在读一本书,你必须从第一页开始,按顺序一页一页读下去,不能跳着读。这就是”顺序处理”。
Transformer的并行处理方式
Transformer可以同时处理所有的词:
1 | 同时处理: |
这就像是有4个人,每个人负责读一个词,他们可以同时开始读。这就是”并行处理”。
为什么Transformer能做到并行?
关键在于位置编码(Positional Encoding)和自注意力机制:
a) 位置编码:
- 每个词都会被赋予一个位置信息
- 比如:”我”(位置1)、”喜欢”(位置2)、”吃”(位置3)、”苹果”(位置4)
- 这样即使同时处理所有词,模型也知道每个词在句子中的位置
举个例子:
就像给每个人发一张带编号的扑克牌:
- “我” → 1号牌
- “喜欢” → 2号牌
- “吃” → 3号牌
- “苹果” → 4号牌
这样即使大家同时看自己的牌,也知道这些词的正确顺序。
b) 自注意力机制:
- 每个词可以同时和句子中的所有其他词计算注意力分数
- 不需要等待前面的词处理完成
举个例子:
想象一个会议室里有4个人,每个人负责一个词:
- A负责”我”
- B负责”喜欢”
- C负责”吃”
- D负责”苹果”
他们可以同时开始工作:
- 每个人都有一份完整的句子副本
- 他们可以同时查看整个句子
各自计算自己负责的词与其他词的关联度
实际的计算优势:
假设处理一个有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] |
第二步:计算Query、Key、Value
每个词都会被转换为三种向量:
1 | 例如"小红": |
(其中WQ、WK、WV是可学习的权重矩阵)
第三步:计算注意力分数
以”小红”为例,计算它与所有词的相关度:
1 | 相关度 = Q向量 · K向量 / √维度 |
第四步:归一化分数
使用softmax函数将所有分数转换为0-1之间的概率值:
1 | 原始分数:[43.7, 35.2, 28.9, 31.5, 39.6] |
第五步:加权求和
用这些概率值去加权每个词的Value向量:
1 | 最终表示 = 0.3×V1 + 0.2×V2 + 0.1×V3 + 0.15×V4 + 0.25×V5 |
多头注意力
实际上,Transformer使用了多头注意力机制,相当于:
1 | - 注意力头1:可能关注语法关系 |
每个头都独立计算注意力分数,最后将所有结果合并。
形象的比喻
这个过程就像:
- 一个人(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 | embedding = nn.Embedding(vocab_size, embedding_dim) |
(3) 计算位置编码:
1 | PE(pos,2i) = sin(pos/10000^(2i/d)) |
(4) 将词向量和位置编码相加:
1 | final_embedding = token_embedding + positional_embedding |
向量的特点
- 维度固定:通常是512维或768维
- 稠密表示:每个维度都有值,不是one-hot编码
- 可训练:通过反向传播不断优化
- 可解释:向量间的距离和运算有语义含义
这样,每个输入token最终都被转换为一个包含语义信息和位置信息的高维向量,作为Transformer的输入。这种向量表示使得模型能够:
- 理解词与词之间的语义关系
- 捕捉序列中的位置信息
- 并行处理整个序列
- 处理变长的输入
这就是Transformer中向量表示的基本原理。通过这种方式,模型可以有效地理解和处理自然语言。