可通过四种方法可视化transformer注意力权重:一、用pytorch钩子捕获并热力图展示;二、集成bertviz实现交互式html可视化;三、修改源码注入绘图逻辑;四、用captum进行归因分析。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

如果您在调试Transformer模型时无法直观理解注意力权重的分布与流向,则可能是由于注意力机制内部计算过程缺乏可视化支持。以下是解决此问题的步骤:
一、使用PyTorch内置钩子捕获注意力权重
该方法通过在多头自注意力层的关键张量(如Q、K、V及注意力分数矩阵)上注册前向钩子,实时提取未归一化的注意力logits和Softmax后的权重分布,适用于任意基于torch.nn.Module构建的Transformer实现。
1、定位模型中nn.MultiheadAttention模块或自定义Attention类的实例,例如model.encoder.layers[0].self_attn。
2、定义钩子函数,将attn_output_weights张量(形状为[batch, num_heads, seq_len, seq_len])保存至全局列表或文件。
3、调用model.register_forward_hook()或对特定子模块注册钩子,并执行一次前向传播。
4、加载保存的权重张量,使用matplotlib.pyplot.imshow()绘制热力图,确保设置vmin=0、vmax=1以正确反映Softmax归一化后的概率值。
二、集成BertViz库进行交互式可视化
该方法依托BertViz开源工具,将模型输出的注意力矩阵映射为可点击、可缩放的HTML交互界面,支持逐层、逐头、逐token查看注意力聚焦区域,兼容Hugging Face Transformers生态。
1、安装依赖:pip install bertviz transformers.
2、加载预训练模型与分词器,例如from transformers import BertModel, BertTokenizer;tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")。
3、调用model.forward()并启用output_attentions=True参数,获取各层注意力张量元组。
4、构造model_config字典,传入attention_visualizer.show()函数,注意必须将输入ID序列通过tokenizer.convert_ids_to_tokens()还原为原始token字符串。
三、修改Transformer源码注入可视化逻辑
该方法直接在Transformer核心组件(如ScaledDotProductAttention类)内部插入绘图代码,适用于需深度定制或调试特定子模块行为的场景,可精确控制采样时机与数据粒度。
1、复制原始注意力计算函数,在torch.matmul(Q, K.transpose(-2, -1))之后插入print("Attention logits shape:", attn_logits.shape)语句。
2、在Softmax操作后添加if layer_idx == 2 and head_idx == 0: plt.figure(); sns.heatmap(attn_weights[0][0].cpu(), annot=True); plt.savefig("layer2_head0.png")。
3、确保所有绘图操作仅在调试模式下触发,通过环境变量DEBUG_VISUALIZE控制开关,避免干扰正式训练流程。
四、利用Captum库进行注意力归因分析
该方法将注意力权重视为特征重要性指标,结合积分梯度(Integrated Gradients)等可微归因算法,量化每个输入token对特定输出位置注意力响应的贡献度,揭示非线性叠加效应。
1、初始化Captum的LayerAttribution类,目标层设为model.decoder.layers[-1].self_attn。
2、构造输入张量input_ids与对应的位置编码position_ids,确保requires_grad=True。
3、调用attribute()方法,指定target为输出序列中某关键token的索引,必须设置internal_batch_size=1防止内存溢出。
4、对归因结果沿head维度取平均,生成归一化重要性热力图并与原始注意力图对比验证一致性。










