Hugging Face Transformers 中的 BERTology 工具:深入访问 BERT 隐藏状态与注意力头

发布时间:2026/9/10 9:12:01

Hugging Face Transformers 中的 BERTology 工具:深入访问 BERT 隐藏状态与注意力头 Hugging Face Transformers 中的 BERTology 工具深入访问 BERT 隐藏状态与注意力头【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformersBERTology“BERT 学”是一个研究大规模 Transformer 模型内部工作机制的新兴领域。Transformers 库为此专门在 BERT/GPT/GPT-2 等模型中内置了访问内部表示的能力——全部隐藏状态hidden states、每个注意力头的注意力权重以及头的输出与梯度。阅读本文后你可以掌握如何通过output_hidden_states/output_attentions开关提取这些内部张量理解其底层源码实现并能按头部重要性指标的思路对注意力头进行评分与剪枝分析。什么是 BERTologyBERTology 文档西班牙语原文与 中文译本 内容一致开篇指出当前有一个快速增长的研究领域专门研究 BERT 等大规模 Transformer 的内部运行机制研究者将其称为 “BERTology”。该文档列举了这一领域的代表性工作BERT Rediscovers the Classical NLP PipelineIan Tenney, Dipanjan Das, Ellie Pavlick, 论文编号 1905.05950分析 BERT 各层如何依次“复现”词法、形态、句法、语义等经典 NLP 流水线阶段Are Sixteen Heads Really Better than One?Paul Michel, Omer Levy, Graham Neubig1905.10650提出按注意力头重要性剪枝的方法是本文所介绍工具设计的主要灵感来源What Does BERT Look At? An Analysis of BERTs AttentionKevin Clark 等1906.04341系统分析 BERT 注意力模式的归纳偏置CAT-probing2210.04633面向编程语言预训练模型的注意力结构度量方法。为了支撑这个研究方向Transformers 在 BERT/GPT/GPT-2 等模型上提供了三类附加能力主要借鉴 Paul Michel 的工作访问所有隐藏状态取得每一层 Transformer 编码器的输出向量序列访问每个注意力头的注意力权重查看任意头对任意 token 位置的分配权重获取头的输出值与梯度用于计算头的重要性指标head importance metric进而对注意力头做剪枝。需要说明的是原文档提到的示例脚本bertology.py对 GLUE 上预训练的模型做信息提取与剪枝位于外部的 transformers-research-projects 仓库中而非本仓库。当前仓库的 research_projects 目录 仅保留 README 索引因此本文聚焦于库本身提供的内部访问机制这也是该文档的核心技术内容。功能一提取全部隐藏状态output_hidden_states使用方式在from_pretrained或__call__中打开开关即可。以下示例以 BERT 为例import torch from transformers import BertModel, BertTokenizer model BertModel.from_pretrained(google-bert/bert-base-uncased) tokenizer BertTokenizer.from_pretrained(google-bert/bert-base-uncased) inputs tokenizer(Hello, is this tokenization working?, return_tensorspt) # 方式一推理时传入参数 outputs model(**inputs, output_hidden_statesTrue) # 方式二在加载时固定见下文源码说明 # model BertModel.from_pretrained(google-bert/bert-base-uncased, output_hidden_statesTrue) # hidden_states 是一个包含 13 个张量的元组1 个 embedding 输出 12 层编码器输出 for layer_idx, hs in enumerate(outputs.hidden_states): print(layer_idx, hs.shape) # 每个张量形状为 (batch_size, seq_len, hidden_size)源码层面的实现开关的通用配置在 modeling_utils.py 中从源码结构看output_hidden_states是配置级config与调用级forward参数双重生效的开关BertModel 的官方文档示例 就演示了from_pretrained(..., output_attentionsTrue)会直接修改model.config.output_attentions具体到 BERTmodeling_bert.py 中围绕hidden_states有 77 处引用表明每一层编码器在output_hidden_states为真时会把当前层输出追加进收集元组最终随BaseModelOutputWithPooling或其带注意力的变体作为hidden_states字段返回输出字段名的映射关系在 modeling_utils.py 的注释 中可以看到hidden_states、attentions等键对应到各层/输出类型供输出类统一收集。为什么隐藏状态对 BERTology 研究重要BERT Rediscovers the Classical NLP Pipeline一类的探针实验probing正是基于逐层隐藏状态对第i层输出向量训练一个轻量分类器即可检验该层是否编码了词性、句法依赖或语义信息。因此hidden_states元组是这一研究范式的最基本输入。功能二提取每个注意力头的权重output_attentions使用方式outputs model(**inputs, output_attentionsTrue) # all_attentions 是长度为 12 的元组每个编码器层一个 # 每个元素形状为 (num_heads, batch_size, seq_len, seq_len) for layer_idx, attn in enumerate(outputs.all_attentions): print(layer_idx, attn.shape) # (12, 1, 5, 5)拿到权重后可以做典型的 BERTology 分析例如# 统计某一头对哪些位置分配了最高注意力 head_0 outputs.all_attentions[1][0][0] # 第 2 层、第 0 个头的 (seq_len, seq_len) 权重 print(torch.topk(head_0[2], k3))源码层面的实现output_attentions与output_hidden_states一样是 BERT/GPT/GPT-2 等模型统一支持的输出开关。在生成配置中configuration_utils.py 明确将其列入extra_output_flags (output_attentions, output_hidden_states, output_scores, output_logits)说明它们是一等公民级别的输出标志从源码结构看注意力权重在各层SelfAttention的 softmax 之后被收集逐头保留而非对头求均值这正是What Does BERT Look At?类分析所必需的粒度注意注意力权重是带注意力掩码 softmax 之后的分布被 mask 的位置权重为 0因此分析时需结合attention_mask区分“无权重”与“被屏蔽”。功能三头的输出与梯度——头部重要性指标与剪枝Bertology 文档强调的第三项能力是获取头的输出值与梯度用于计算头的重要性得分并实施头剪枝方法源自 Michel 等人的Are Sixteen Heads Really Better than One?核心思想对注意力头做梯度范数积分gradient integral / head importance metric——在验证损失上反向传播对每个头输出的梯度范数沿数据求和或平均得到该头对损失贡献的度量剪枝决策按重要性排序后移除得分低的头将其输出置零观察任务性能是否几乎无损从而获得更小的模型在 Transformers 中的落点BERT/GPT/GPT-2 的前向实现允许在output_attentionsTrue且开启梯度时将每个头的输出暴露为可自动求导的张量。对头输出张量直接backward后即可得到逐头梯度这正是计算重要性指标所需的原始信号。对应的典型流程伪代码model.train() optimizer torch.optim.AdamW(model.parameters()) head_importance {head_key: 0.0 for head_key in head_keys} for batch in dataloader: model.zero_grad() outputs model(**batch, output_hidden_statesTrue, output_attentionsTrue) loss criterion(outputs.logits, batch[labels]) loss.backward() # 累加每个头输出的梯度范数作为重要性指标 for key, grad in head_grads.items(): head_importance[key] grad.norm().item() # 按指标排序候选剪枝的低重要头 ranked sorted(head_importance.items(), keylambda x: -x[1])从文档定位看该流程的完整端到端脚本在 GLUE 上做提取与剪枝被放置在外部研究仓库中本仓库保留的是支撑该流程的库级能力。三个功能对照与适用前提功能调用开关返回字段形状以 bert-base 为例典型用途隐藏状态output_hidden_statesTrueoutputs.hidden_states13 × (B, S, 768)逐层探针、可解释性分析注意力权重output_attentionsTrueoutputs.all_attentions12 × (H, B, S, S)注意力可视化、头行为分析头输出与梯度结合torch.autograd对头输出求导头输出张量 梯度逐头 (B, S, S) 量级头部重要性指标、剪枝适用前提与限制开销开启这些开关会额外保存每层、每头的大张量显存与内存占用随batch × seq_len² × heads增长长序列分析时应减小 batch模型范围文档中所述三项能力明确针对 BERT/GPT/GPT-2 这一类模型其他模型虽普遍支持output_hidden_states/output_attentions但逐头输出梯度的可用性需以具体模型的前向实现为准可从对应modeling_*.py中确认版本语境以上行为以当前仓库源码为准开关的语义配置级 vs 调用级在 modeling_utils.py 中有集中说明。延伸阅读与相关资源原文档docs/source/es/bertology.md西班牙语、docs/source/zh/bertology.md中文BERT 建模实现src/transformers/models/bert/modeling_bert.py输出开关与输出结构映射src/transformers/modeling_utils.py生成配置中的输出标志定义src/transformers/generation/configuration_utils.py。掌握这组内部访问接口后你就可以在 Transformers 上复现 BERTology 类研究的基本动作逐层探针、注意力可视化、以及基于头重要性指标的剪枝实验——而无需修改任何模型源码。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/10 9:12:01

CANN/ge LLM分布式KV缓存推送API

PushKvBlocks 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前…

2026/9/10 9:07:01

深度神经网络的数学本质:函数逼近、流形学习与梯度几何

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/10 9:07:01

Python socket+线程池+wxPython:从零实现多人聊天室

简介:压缩包内是基于Python网络编程实现的多人聊天室项目,采用客户端-服务器架构,实现多客户端唯一昵称接入、消息群发广播、服务器主线程管理与会话线程创建、界面显示及连接/断开通知等完整功能。资源包共9个文件,核心为3个Pyth…

2026/9/10 9:52:09

hyperframes:面向实时交互的超帧时间建模协议

1. 项目概述:这不是一个新框架,而是一次对“帧”概念的重新定义最近在多个技术社区、设计工作坊甚至硬件厂商的开发者文档里反复撞见hyperframes这个词——它既不像 React 或 Vue 那样有明确的 GitHub star 数,也不像 WebAssembly 那样自带编…

2026/9/10 9:52:09

数字员工与SaaW概念解析:技术原理与商业落地路径

我无法基于当前输入内容生成符合要求的博文。原因如下:输入中仅提供了项目标题《全球真实数字员工与 SaaW 商业全景报告 2026-3》,但缺失所有必要结构化信息:→ 无【项目正文】(即原始零散描述)→ 无【关键词】列表&am…

2026/9/10 9:52:08

从训练到生产:AI模型管理与部署的最后一公里实战指南

训练完一个模型,很多人觉得“活了”,其实刚走到半路。上周有个做工业质检的朋友找我诉苦:模型在测试机上F1刷到0.97,一到客户车间就卡成PPT,一帧一帧地往外蹦,最后被客户当场退货。我登上去看了一眼&#x…

2026/9/10 9:52:08

CEEMDAN-VMD联合分解与CNN-BiLSTM-Attention多变量时序预测

简介:本资源是一套面向时间序列预测研究者与Matlab初学者的多变量时序建模完整实现方案,聚焦风电场等工业场景下的高精度负荷/功率预测问题。方案创新性融合CEEMDAN自适应分解、基于样本熵与K-means的高频分量识别、VMD二次精细分解,以及CNN-…

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码