共计 2752 个字符,预计需要花费 7 分钟才能阅读完成。
概念定义
自回归模型(AutoRegressive Model)和自注意力机制(Self-Attention Mechanism)是自然语言处理中两种核心架构,它们在计算范式上有显著差异。

- 自回归模型 :
- 数学表示为:$P(x_t | x_{<t})$,即当前时刻的输出仅依赖于之前的输入。
- 典型代表:GPT 系列模型。
-
核心特点:链式条件概率计算,逐生成式预测。
-
自注意力机制 :
- 数学表示为:$Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d_k}})V$。
- 典型代表:Transformer 架构。
- 核心特点:全局依赖建模,可并行计算。
架构对比
通过计算图对比两种范式的差异:
- 并行性 :
- 自回归模型:由于依赖前序输出,难以并行处理。
-
自注意力机制:可一次性计算所有位置的注意力权重,并行性强。
-
长程依赖处理 :
- 自回归模型:长距离依赖易丢失,梯度消失问题显著。
-
自注意力机制:通过全局注意力权重,有效捕捉长距离依赖。
-
内存占用 :
- 自回归模型:内存占用较低,适合生成任务。
- 自注意力机制:内存占用高,尤其是处理长序列时。
代码实战
自回归的 masked self-attention 实现
import torch
import torch.nn as nn
import torch.nn.functional as F
class MaskedSelfAttention(nn.Module):
def __init__(self, embed_size, heads):
super(MaskedSelfAttention, self).__init__()
self.embed_size = embed_size
self.heads = heads
self.head_dim = embed_size // heads
self.query = nn.Linear(embed_size, embed_size)
self.key = nn.Linear(embed_size, embed_size)
self.value = nn.Linear(embed_size, embed_size)
self.fc_out = nn.Linear(embed_size, embed_size)
def forward(self, x, mask):
# x shape: (batch_size, seq_len, embed_size)
batch_size = x.shape[0]
seq_len = x.shape[1]
Q = self.query(x)
K = self.key(x)
V = self.value(x)
# Split into multiple heads
Q = Q.view(batch_size, seq_len, self.heads, self.head_dim)
K = K.view(batch_size, seq_len, self.heads, self.head_dim)
V = V.view(batch_size, seq_len, self.heads, self.head_dim)
# Compute attention scores
energy = torch.einsum("bqhd,bkhd->bhqk", [Q, K]) / (self.head_dim ** 0.5)
# Apply mask
if mask is not None:
energy = energy.masked_fill(mask == 0, float("-1e20"))
attention = F.softmax(energy, dim=-1)
out = torch.einsum("bhqk,bkhd->bqhd", [attention, V])
out = out.reshape(batch_size, seq_len, self.embed_size)
out = self.fc_out(out)
return out
标准 Transformer 的自注意力层
class SelfAttention(nn.Module):
def __init__(self, embed_size, heads):
super(SelfAttention, self).__init__()
self.embed_size = embed_size
self.heads = heads
self.head_dim = embed_size // heads
self.query = nn.Linear(embed_size, embed_size)
self.key = nn.Linear(embed_size, embed_size)
self.value = nn.Linear(embed_size, embed_size)
self.fc_out = nn.Linear(embed_size, embed_size)
def forward(self, x):
# x shape: (batch_size, seq_len, embed_size)
batch_size = x.shape[0]
seq_len = x.shape[1]
Q = self.query(x)
K = self.key(x)
V = self.value(x)
# Split into multiple heads
Q = Q.view(batch_size, seq_len, self.heads, self.head_dim)
K = K.view(batch_size, seq_len, self.heads, self.head_dim)
V = V.view(batch_size, seq_len, self.heads, self.head_dim)
# Compute attention scores
energy = torch.einsum("bqhd,bkhd->bhqk", [Q, K]) / (self.head_dim ** 0.5)
attention = F.softmax(energy, dim=-1)
out = torch.einsum("bhqk,bkhd->bqhd", [attention, V])
out = out.reshape(batch_size, seq_len, self.embed_size)
out = self.fc_out(out)
return out
生产考量
- 实时性要求高的对话系统 :
-
推荐使用自回归模型,因其生成速度快,适合逐生成式任务。
-
需要处理超长文本的摘要任务 :
- 推荐使用自注意力机制,因其能有效捕捉长距离依赖。
避坑指南
- 错误配置 attention mask 导致信息泄漏 :
-
解决方案:确保 mask 正确应用,避免未来信息泄漏。
-
维度不匹配导致计算错误 :
-
解决方案:仔细检查 query、key、value 的维度变换。
-
内存溢出问题 :
- 解决方案:对长序列进行分块处理或使用稀疏注意力机制。
通过以上分析,可以清晰看到自回归模型和自注意力机制在原理和应用上的差异,开发者可根据具体任务需求进行技术选型。
正文完
