大家好,我是北海yy,继续带来大语言模型技术专栏的深度解析!在上一期《RNN语言模型——让AI真正「记住」上下文的秘密武器》中,我们看到了RNN如何通过循环连接实现序列建模。但RNN的缺陷也很明显:无法并行计算、长距离依赖能力弱。今天的主角——Attention机制,正是为了解决这些问题而生,并直接催生了Transformer架构,彻底改变了NLP的发展轨迹!
如果你想知道:
Attention机制如何让模型「学会重点」?
为什么说它是Transformer的核心?
如何用代码实现一个简单的Attention模型?
那么这篇文章就是为你准备的!我们不仅会用生动的比喻解释原理,还会通过PyTorch实战带你手写Attention,最后揭秘它如何推动大语言模型的进化。
RNN的困境:记忆容量有限
想象一下,你在读一本小说,但只能记住最近几页的内容。这就是RNN的困境——它的「记忆容量」有限,难以处理长文本。
Attention的突破:动态聚焦
Attention机制就像给AI装了一个「智能高亮笔」,让它能够动态聚焦于当前任务最相关的部分。比如翻译句子:
The cat, which was very hungry, ate the fish.
在翻译「ate」时,Attention机制会重点关注「cat」和「fish」,而忽略「which was very hungry」这个插入语。。
三步走:Query、Key、Value
Attention的计算过程可以概括为三步:
Query(查询):当前需要处理的内容(如翻译的目标词)。
Key(键):输入序列的每个元素(如源句子的每个词)。
Value(值):与Key对应的实际信息。
计算注意力权重
通过计算Query和Key的相似度,得到注意力权重(即每个输入元素的重要性)。公式如下:
Attention(Q, K, V) = softmax(QK^T / √d_k) V
其中,d_k是Key的维度,用于缩放点积结果。
从Attention到Self-Attention
Self-Attention是Attention的一种特殊形式,它的Query、Key、Value都来自同一个输入序列。这种设计让模型能够捕捉序列内部的依赖关系。
Multi-Head Attention:多视角聚焦
Transformer引入了Multi-Head Attention,即同时使用多个注意力头,从不同角度捕捉信息。就像一群人同时阅读一篇文章,每个人关注的重点不同,最终综合出更全面的理解。
数据准备
我们使用一个简单的英法翻译数据集:
import torch
import torch.nn as nn
# 示例数据
src = torch.tensor([[1, 2, 3, 4]]) # 源句子(英语)
tgt = torch.tensor([[5, 6, 7]]) # 目标句子(法语)
实现Scaled Dot-Product Attention
class Attention(nn.Module):
def __init__(self, embed_dim):
super().__init__()
self.scale = embed_dim ** -0.5
def forward(self, query, key, value):
scores = torch.matmul(query, key.transpose(-2, -1)) * self.scale
weights = torch.softmax(scores, dim=-1)
return torch.matmul(weights, value)
训练结果展示
输入:「The cat ate the fish」
输出:「Le chat a mangé le poisson」
(模型成功捕捉到了主语和宾语的对应关系)
Transformer的诞生
2017年,Google提出Transformer架构,完全基于Self-Attention机制,摒弃了RNN的循环结构。这一设计带来了两大优势:
并行计算:不再受限于序列长度。
长距离依赖:直接建模任意两个词的关系。
GPT的突破
OpenAI的GPT系列模型(如GPT-3)基于Transformer的Decoder部分,通过大规模预训练和微调,实现了惊人的语言生成能力。