理解注意力机制:用 Python 简化版代码解析 Transformer 在 NLP 中的应用
·
理解注意力机制与Transformer在NLP中的应用
注意力机制的核心思想是让模型在处理输入序列时,能够动态地为不同位置分配不同的重要性权重。在自然语言处理中,这使模型能够聚焦于与当前任务最相关的词语。Transformer架构通过自注意力(Self-Attention)机制实现了这一思想。
数学原理
给定输入序列$X = [x_1, x_2, ..., x_n]$($x_i \in \mathbb{R}^d$),自注意力计算分为三步:
- 线性变换:
$$Q = XW^Q, \quad K = XW^K, \quad V = XW^V$$
其中$W^Q, W^K, W^V \in \mathbb{R}^{d \times d_k}$为可学习参数矩阵 - 注意力权重:
$$A = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)$$ - 加权输出:
$$Z = AV$$
缩放因子$\frac{1}{\sqrt{d_k}}$用于防止点积过大导致梯度消失。
Python简化版自注意力实现
以下代码展示自注意力机制的核心计算过程:
import numpy as np
def scaled_dot_product_attention(Q, K, V):
"""简化版自注意力计算"""
d_k = Q.shape[-1]
# 计算注意力分数
scores = np.matmul(Q, K.transpose(0,2,1)) / np.sqrt(d_k)
# Softmax归一化
attention_weights = np.exp(scores - np.max(scores, axis=-1, keepdims=True))
attention_weights = attention_weights / np.sum(attention_weights, axis=-1, keepdims=True)
# 加权输出
output = np.matmul(attention_weights, V)
return output, attention_weights
# 示例输入 (批大小=2, 序列长度=3, 嵌入维度=4)
X = np.array([
[[0.1, 0.2, 0.3, 0.4], [0.5, 0.6, 0.7, 0.8], [0.9, 1.0, 1.1, 1.2]],
[[1.1, 1.2, 1.3, 1.4], [1.5, 1.6, 1.7, 1.8], [1.9, 2.0, 2.1, 2.2]]
])
# 随机初始化权重矩阵 (嵌入维度4→注意力维度3)
WQ = np.random.randn(4, 3)
WK = np.random.randn(4, 3)
WV = np.random.randn(4, 3)
# 计算Q,K,V
Q = np.matmul(X, WQ)
K = np.matmul(X, WK)
V = np.matmul(X, WV)
# 执行注意力计算
output, attention_weights = scaled_dot_product_attention(Q, K, V)
print("输出形状:", output.shape) # (2,3,3)
print("注意力权重形状:", attention_weights.shape) # (2,3,3)
Transformer在NLP中的应用解析
-
编码器-解码器架构
Transformer通过堆叠的多头注意力层(Multi-Head Attention)同时捕捉不同层次的语义关系:- 编码器:处理输入序列生成上下文表示
- 解码器:使用编码器输出和已生成内容预测下一个词
-
位置编码
使用正弦函数注入位置信息:
$$PE_{(pos,2i)} = \sin\left(\frac{pos}{10000^{2i/d}}\right)$$
$$PE_{(pos,2i+1)} = \cos\left(\frac{pos}{10000^{2i/d}}\right)$$ -
实际应用场景
- 机器翻译(如"I love NLP" → "我热爱自然语言处理")
- 文本摘要(生成关键信息浓缩版)
- 问答系统(根据问题定位文本答案)
该简化实现省略了层归一化、残差连接等细节,但完整保留了注意力机制的核心计算逻辑。实际Transformer模型通过堆叠多个这样的注意力层,实现了对长距离依赖的高效建模。
更多推荐


所有评论(0)