【三个月 AI Agent 实战学习】Day 2 详细展开:Transformer 直觉(上)—— Self-Attention 核心思想
Day 2 详细展开:Transformer 直觉(上)—— Self-Attention 核心思想
欢迎来到第二天!今天我们暂别大量代码,将重心放在**理解大模型最核心的机制——自注意力(Self-Attention)**上。你不需要任何数学背景,只需要带着直觉去感受模型是如何“读懂”上下文的。

一、今日学习目标
- 了解 Transformer 的整体架构(编码器-解码器,但重点是注意力层)。
- 用直觉理解 Self-Attention 到底在做什么:让每个词都能“看到”句子中的其他词,并动态决定该关注谁。
- 通过大模型辅助学习,观察模型如何利用注意力机制消解句子中的歧义(指代消解)。
- 亲手运行一个简单的 Python 脚本,调用大模型解释一个经典歧义句,加深理解。
- 初步了解注意力权重的概念(软对齐)。
二、详细实现步骤
步骤 1:阅读《The Illustrated Transformer》前两章
这是 Jay Alammar 的经典科普文章,用大量可视化图解释了 Transformer 的原理。我们只读前两章(“A High-Level Look” 和 “Self-Attention in Detail” 的前半部分)。如果你英文阅读有困难,可以找中文翻译版,比如知乎或博客上的翻译。
阅读地址:
- 英文原版:https://jalammar.github.io/illustrated-transformer/
- 中文翻译(参考):可在搜索引擎搜“The Illustrated Transformer 中文翻译”
阅读重点:
- 不要纠结于数学公式,重点关注图中的箭头和颜色。
- 理解几个关键概念:
- 词嵌入(Word Embedding):每个词被表示成一个高维向量(例如 512 维),向量中的数字代表了该词的语义特征。
- Query(查询)、Key(键)、Value(值):可以把它们想象成搜索引擎的机制。每个词都会生成三个向量:Query 代表“我在找什么”,Key 代表“我能提供什么”,Value 代表“我实际的内容是什么”。
- 注意力权重:通过计算 Query 和所有 Key 的相似度(点积),得到一个分数,再经过 softmax 变成 0 到 1 之间的权重。权重越高,表示该词对当前词的“关注”越多。
- 加权求和:将每个词的 Value 乘以对应的注意力权重,然后求和,得到当前词的“新表示”。这个新表示融合了上下文中其他词的信息。
一句话总结: Self-Attention 让模型在处理每个词时,能够动态地“查阅”整个句子,并根据相关性分配权重,最终得到一个融合了上下文信息的词向量。
步骤 2:使用大模型辅助理解歧义句
现在我们用一个经典句子来测试大模型的理解能力,并通过它的解释来直观感受注意力的作用。
句子:“苹果发布了新手机,它很好吃。”
这个句子有两个可能的指代:
- “它”指代“苹果”(公司),但“很好吃”显然不适合公司,所以更可能指代“苹果”这个水果。
- 但是“苹果”这个词在同一句话中既可以是公司(苹果公司)也可以是水果。模型需要根据上下文来判断“它”指代什么。
我们编写一个 Python 脚本,让大模型解释这句话中“它”的指代,并解释它是如何根据上下文判断的。这将帮助我们理解模型如何利用注意力机制来消歧。
新建 self_attention_demo.py:
import os
from dotenv import load_dotenv
from openai import OpenAI
load_dotenv()
client = OpenAI(
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url="https://api.deepseek.com"
)
# 构造一个需要模型解释指代消解的 Prompt
prompt = """
请仔细分析下面这句话,并回答以下问题:
句子:“苹果发布了新手机,它很好吃。”
问题:
1. 句子中的“它”指代什么?
2. 你是如何根据上下文判断的?请描述你的思考过程。
3. 在这个判断过程中,你会重点关注句子中的哪些词?这些词之间的关系是什么?
"""
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "user", "content": prompt}
],
temperature=0.3, # 降低随机性,让回答更理性
max_tokens=500
)
print(response.choices[0].message.content)
运行脚本:
python self_attention_demo.py
你会看到模型给出类似这样的回答(示例):
1. 句子中的“它”指代“苹果”这个水果,而不是苹果公司。
2. 因为“很好吃”这个属性通常用于描述食物,而苹果公司是科技公司,不会用“好吃”来形容。所以“它”更可能指代作为水果的“苹果”。
3. 我会重点关注“苹果”、“发布了新手机”、“它”、“很好吃”这几个词。其中“发布了新手机”表明“苹果”是公司;而“很好吃”表明“它”需要指代一个食物。这两个约束结合起来,“它”只能指代前文中的水果“苹果”,尽管前文的“苹果”一词在“发布了新手机”的语境中已经倾向于被理解为公司,但后文的“很好吃”提供了新的证据,要求我们重新调整理解。
观察与思考:
模型实际上是在模仿 Self-Attention 的工作方式:它会同时看到句子中的所有词,并考虑它们之间的关系。例如,“很好吃”与“它”相关度高,而“发布了新手机”与“苹果”相关度高。模型需要在这些信息之间进行权衡,最终确定“它”的指代。
尽管我们无法直接看到模型的注意力权重,但通过这个 Prompt 我们让模型“说出”了它的推理过程,这有助于我们理解注意力机制的作用。
步骤 3:手动模拟一个简单的注意力计算(可选)
如果你对代码实现感兴趣,可以尝试一个极简的 Python 示例,展示点积注意力的计算过程。这不是为了让你实现完整的 Transformer,而是为了直观感受“相似度→权重→加权求和”的过程。
新建 simple_attention.py:
import numpy as np
# 假设我们有三个词:苹果、公司、好吃
# 每个词用一个简单的向量表示(在实际中这些是学习得到的词嵌入)
# 这里我们用随机向量,维度设为 4,只是为了演示
np.random.seed(42)
word_vectors = {
"苹果": np.array([0.8, 0.1, 0.3, 0.2]),
"公司": np.array([0.1, 0.9, 0.1, 0.1]),
"好吃": np.array([0.2, 0.1, 0.9, 0.8]),
}
# 假设我们正在处理“它”,它的 Query 向量是“它”的表示
# 这里简单假设“它”的 Query 向量与“好吃”接近(因为要寻找食物)
query_it = np.array([0.25, 0.1, 0.85, 0.75]) # 模拟“它”的 Query
# 为每个词生成 Key 向量(这里直接使用词向量作为 Key 简化)
keys = word_vectors
# 计算 Query 与每个 Key 的点积相似度
scores = {}
for word, key_vec in keys.items():
score = np.dot(query_it, key_vec)
scores[word] = score
print("相似度分数(点积):", scores)
# 应用 softmax 得到注意力权重
def softmax(x):
exp_x = np.exp(x - np.max(x)) # 减去最大值防止溢出
return exp_x / exp_x.sum()
score_values = np.array(list(scores.values()))
weights = softmax(score_values)
print("注意力权重:", dict(zip(keys.keys(), weights)))
# 加权求和得到“它”的新表示
# 这里 Value 也使用词向量
new_representation = sum(weight * word_vectors[word] for word, weight in zip(keys.keys(), weights))
print("“它”的新表示(融合了上下文):", new_representation)
运行脚本,观察输出。你会看到“它”对“好吃”的注意力权重最大,因为它们的点积相似度最高,这模拟了模型将“它”与“好吃”关联起来的过程。
注意: 这只是一个极其简化的玩具示例,真实的 Transformer 中有多头注意力、可学习的 Q/K/V 投影矩阵等。但核心思想是一样的:通过相似度计算分配注意力权重,然后加权融合信息。
三、常见问题与调试
Q1:阅读文章时感觉很抽象,看不懂怎么办?
→ 非常正常!第一遍读不懂没关系,先记住几个关键词:Query、Key、Value、权重、加权求和。然后回到文章中的图,跟着箭头走一遍流程。也可以搜索其他博主的通俗讲解视频(如 B 站上有很多 Transformer 讲解)。
Q2:为什么叫“自注意力”?
→ “自”指的是同一个句子内部,每个词对自己和其他词的注意力。区别于传统的编码器-解码器注意力(比如翻译任务中,目标语言的词会去关注源语言的词),Self-Attention 是在同一个序列内部进行的。
Q3:我运行 self_attention_demo.py 时,模型给出的答案和我预期不一样怎么办?
→ 可以调整 temperature 或修改 Prompt,要求模型更详细地分析。也可以尝试其他歧义句,比如“小明告诉小王他考试通过了。”中的“他”指谁。
Q4:手动模拟的注意力代码中,为什么权重加起来等于 1?
→ 因为使用了 softmax 函数,它将任意实数向量映射为概率分布,所以权重总和为 1。
四、今日总结与作业
今天你完成了:
- ✅ 阅读了《The Illustrated Transformer》前两章,理解了 Self-Attention 的核心思想。
- ✅ 通过大模型辅助分析了歧义句的指代消解,直观感受了模型如何利用上下文信息。
- ✅ 运行了一个极简的点积注意力计算示例,加深了对“相似度→权重→加权求和”流程的理解。
今日作业(必做):
- 用你自己的话(不要超过 200 字)解释 Self-Attention 的作用。
- 找一个新的歧义句(例如:“他背着妈妈和女朋友偷偷约会。”),用大模型让它解释其中可能的不同解读,并说明模型如何选择最可能的解读。
- (选做)修改
simple_attention.py中的query_it向量,让它更接近“公司”而不是“好吃”,观察注意力权重的变化,理解 Query 对注意力的影响。
明日预告: 我们将继续 Transformer 直觉(下),理解上下文窗口、温度(Temperature)等概念,并动手实验不同 Temperature 对生成结果的影响。
有任何问题欢迎随时提问!
更多推荐


所有评论(0)