一文搞懂Transformer注意力机制

Lisa Tan | 2026-08-08T09:36:00 | Python, AI

从零理解Transformer的Self-Attention机制,包含数学推导、手写代码实现和直觉解释

# 一文搞懂Transformer注意力机制 ## 前言 学深度学习绕不开Transformer,而Transformer的核心就是**Self-Attention(自注意力机制)**。网上的教程要么太数学要么太抽象,我试着用最直觉的方式讲清楚。 ## 直觉理解 想象你在读一句话:“小明喜欢踢足球,**他**每天都去练习。” **他**指的是谁?你的大脑会自动把“他”和“小明”关联起来。Self-Attention做的就是这件事。 ## 数学公式 ``` Attention(Q, K, V) = softmax(Q * K^T / sqrt(d_k)) * V ``` - **Q (Query)**:当前词的查询向量,“我要找什么?” - **K (Key)**:每个词的键向量,“我有什么?” - **V (Value)**:每个词的值向量,“我能提供什么?” ## 代码实现 ```python import numpy as np def self_attention(X, W_q, W_k, W_v): # 计算Q, K, V Q = X @ W_q # (seq_len, d_k) K = X @ W_k V = X @ W_v d_k = K.shape[-1] # 计算注意力分数 scores = Q @ K.T / np.sqrt(d_k) # softmax归一化 weights = np.exp(scores) / np.exp(scores).sum(axis=-1, keepdims=True) # 加权求和 output = weights @ V return output, weights # 示例 np.random.seed(42) seq_len, d_model, d_k = 4, 8, 4 X = np.random.randn(seq_len, d_model) W_q = np.random.randn(d_model, d_k) W_k = np.random.randn(d_model, d_k) W_v = np.random.randn(d_model, d_k) output, weights = self_attention(X, W_q, W_k, W_v) print(weights.round(3)) ``` ## 踩坑 > 第一次实现的时候忘了除以 `sqrt(d_k)`,结果softmax之后的值非常极端(接近one-hot),梯度几乎为0,训练不动。这个缩放因子很重要! ## 多头注意力 多头 = 多个注意力“头”并行计算,然后拼接: ```python # 伪代码 heads = [self_attention(X, W_q_i, W_k_i, W_v_i) for i in range(n_heads)] multi_head_output = concat(heads) @ W_o ``` ## 总结 - Self-Attention让每个位置都能关注全局信息 - 缩放因子 `sqrt(d_k)` 防止梯度消失 - 多头注意力提供了多个“视角” - 理解了注意力机制,Transformer的其他部分就容易多了

← Back to Blog