趋近智
了解 Transformer 模型内部运作方式最直接的途径之一是检查其注意力机制 (attention mechanism)。自注意力 (self-attention)作为 Transformer 架构的主要组成部分,让模型在计算特定标记 (token)的表示时,能够衡量输入序列中不同标记的重要性。这些注意力权重 (weight),为每一层中的每个头计算,构成图谱,显示信息如何在模型中传递。可视化这些图谱可以提供模型在标记之间学习到的联系的线索。
自注意力的核心思想涉及计算一个标记的查询向量 (vector)()与序列中所有标记(包括其自身)的键向量()之间的分数。这些分数经过缩放,并使用 softmax 归一化 (normalization),然后用于计算值向量()的加权和。注意力权重是缩放点积后应用 softmax 的结果:
这里,是键向量的维度。这些权重表示每个查询标记对所有键标记的注意力分布。权重越高表示模型认为对应的键标记在生成查询标记的表示时更重要。
大多数现代深度学习 (deep learning)框架,包括 PyTorch,都提供机制来在前向传播过程中访问这些注意力权重。当使用 PyTorch 的 nn.MultiheadAttention 层时,你可以在前向调用中指定need_weights=True。这个参数 (parameter)指示层除了输出之外,还返回所有头的平均注意力权重。对于更细致的、特定于头的权重,你可能需要稍微修改层的实现,或使用钩子在权重平均之前捕获它们。
这里是一个简化示例,展示如何在 PyTorch 中从 nn.MultiheadAttention 层获取注意力权重:
import torch
import torch.nn as nn
# 示例设置
seq_len = 5
embed_dim = 8
num_heads = 2
batch_size = 1
# 确保 embed_dim 可以被 num_heads 整除
assert embed_dim % num_heads == 0
mha_layer = nn.MultiheadAttention(embed_dim, num_heads, batch_first=True)
# 虚拟输入 (批量大小, 序列长度, 嵌入维度)
query = torch.randn(batch_size, seq_len, embed_dim)
key = torch.randn(batch_size, seq_len, embed_dim)
value = torch.randn(batch_size, seq_len, embed_dim)
# 请求注意力权重的前向传播
# attn_output: (批量大小, 序列长度, 嵌入维度)
# attn_output_weights: (批量大小, 序列长度, 序列长度) -> 各头平均
attn_output, attn_output_weights = mha_layer(
query, value,
need_weights=True,
average_attn_weights=True
) # 对于每个头的权重设置为 False (如果层支持/已修改)
print("平均注意力权重的形状:", attn_output_weights.shape)
# 如果 average_attn_weights=False (且层已修改/钩子):
# 形状将是 (批量大小, 头数, 序列长度, 序列长度)
# 示例: 访问第一个批量项目的权重
first_batch_weights = attn_output_weights[0] # 形状: (序列长度, 序列长度)
# first_batch_weights[i, j] 是查询标记 i 对标记 j 的注意力
# 获取每个头的权重 (通常需要修改或钩子)
# _, attn_output_weights_per_head = mha_layer(
# query, value,
# need_weights=True,
# average_attn_weights=False
# )
# print("每个头的注意力权重形状:",
# attn_output_weights_per_head.shape)
# first_batch_head_0_weights = attn_output_weights_per_head[0, 0] # 第0个头
请注意,标准的 nn.MultiheadAttention 在 average_attn_weights 为 True(如果 need_weights 为 True 时的默认值)时,返回在各头之间平均后的权重。访问单个头的权重通常需要修改前向方法,或者更简洁地,在注意力机制 (attention mechanism)的内部 softmax 或矩阵乘法操作上注册一个前向钩子,以便在平均之前捕获权重。
一旦提取,注意力权重 (weight)(通常是每个头/层的 (序列长度, 序列长度) 大小的矩阵)可以通过几种方式可视化:
(i, j) 的颜色强度表示标记 i 对标记 j 的注意力权重。颜色越浅通常表示注意力越高。分析这些热力图可以显示出一些模式,例如强对角线(标记关注自身)、对前置标记的注意力,或者特定标记(如标点符号或特殊标记)充当信息接收器或源。单个头的注意力权重。请注意表示自注意力 (self-attention)的强对角线,以及“sat”如何强烈关注“cat”。特殊标记
[CLS]主要关注自身,而[SEP]也显示出高自注意力。
多头可视化: 由于每个层包含多个注意力头,将它们全部可视化很重要。常用方法包括:
基于图的可视化: 注意力权重可以表示为有向图,其中标记是节点,如果注意力权重 超过某个阈值,则存在从标记 i 到标记 j 的有向边。边的粗细或颜色可以表示权重的量级。这对于可视化较短序列中的连接或突出特定的强联系可能有效。
简化图,显示强注意力链接。“sat”强烈关注“cat”,而“cat”对“the”也有明显关注。
分析注意力模式有时可以显示出语言学上合理的行为:
[CLS] 或 [SEP] 这样的标记可能汇总整个序列的信息,这表现为源自或指向它们的广泛注意力模式。虽然注意力可视化是一种有用的工具,但了解其局限性很重要:
注意力图可视化提供了一个窗口(尽管有时模糊),用于了解 Transformer 内部的信息流。这是一种有用的诊断技术,用于对模型行为生成假设并找出潜在的关注点,但应谨慎得出结论,最好与本章后面讨论的其他分析方法相互印证,例如探查内部表示或分析神经元激活。
这部分内容有帮助吗?
nn.MultiheadAttention的官方文档,代码示例中用于提取注意力权重。© 2026 ApX Machine Learning用心打造