尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

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

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),仅供参考
返回列表