BERT可解释分析是一项十分有趣的工作,而借助可视化工具进行辅助分析更是一条有效路径。
本文主要介绍目前以注意力为核心的可解释可视化工具,包括 BertViz交互式可视化工具以及dodrio注意力可视化分析工具两种,前者聚焦于词之间的注意力分布,包括词间,句子间,后者则引入依存句法和语义显著性进行分析,具有较高的参考价值。
BertViz 是一种交互式工具,用于在Transformer语言模型(如 BERT、GPT2 或 T5)中可视化注意力网络。它可以通过支持大多数Huggingface 模型,可以简单地通过 Python API 在 Jupyter 或 Colab 笔记本中运行。
BertViz 扩展了 Llion Jones的Tensor2Tensor 可视化工具,添加了多个视图,每个视图都为注意力机制提供了独特的视角。
bertviz可视化页面分别包括bertviz_detail.ipynb、bertviz_map.ipynb 、bertviz_summary.ipynb页面。
pip install bertviz
from bertviz import head_view, model_view
from transformers import BertTokenizer, BertModel
model_version = 'bert-base-uncased'
model = BertModel.from_pretrained(model_version, output_attentions=True)
tokenizer = BertTokenizer.from_pretrained(model_version)
sentence_a = "nlp is not a good task"
sentence_b = "tell me the reason you left me"
inputs = tokenizer.encode_plus(sentence_a, sentence_b, return_tensors='pt')
input_ids = inputs['input_ids']
token_type_ids = inputs['token_type_ids']
attention = model(input_ids, token_type_ids=token_type_ids)[-1]
sentence_b_start = token_type_ids[0].tolist().index(1)
input_id_list = input_ids[0].tolist() # Batch index 0
tokens = tokenizer.convert_ids_to_tokens(input_id_list)
头部视图从单个变形金刚层可视化一个或多个头部的注意力。每行显示从一个令牌(左)到另一个令牌(右)的注意力。线条重量反映了注意力值(范围从0到1),而线条颜色标识注意力头
head_view(attention, tokens, sentence_b_start)
模型视图在整个模型中提供了鸟瞰图。每个单元格显示特定头部的注意力权重,按图层(行)和头部(列)索引。每个单元格中的行代表从一个令牌(左)到另一个令牌(右)的注意力,行重与注意值成正比(范围从0到1)。
model_view(attention, tokens, sentence_b_start)
神经元视图可视化用于计算注意力的中间表示(例如查询和键向量)。在折叠视图(初始状态)中,线条显示从每个令牌(左)到其他令牌(右)的注意力。在扩展视图中,该工具跟踪产生这些注意力权重的计算链。
- from bertviz.transformers_neuron_view import BertModel, BertTokenizer
- from bertviz.neuron_view import show
-
- model_type = 'bert'
- model_version = 'bert-base-uncased'
- model = BertModel.from_pretrained(model_version, output_attentions=True)
- tokenizer = BertTokenizer.from_pretrained(model_version, do_lower_case=True)
- show(model, model_type, tokenizer, sentence_a, sentence_b, layer=4, head=3)
地址:https://github.com/jessevig/bertviz
DODRIO是乔治亚理工提出的一种可交互的Attention可视化工具,从句法和寓意层面总结了不同注意力头的信息。
基于该工具,可以验证一些之前BERT可解释性文章的结论,BERT的中间层更关注句法信息,以及BERT最后1-2层是分类的关键等。
git clone git@github.com:poloclub/dodrio.git
degit poloclub/dodrio
给定一个句子:
it is depressing , ruthlessly pained and depraved , the movie equivalent of staring into an open wound .
经过BERT分词后,可以得到token序列以及对应的依存句法分析结果。
注意力权重可以被看作是模型对词之间依赖关系的预测。切换到句法依赖的可视化之后,鼠标移动到每个token都会高亮跟这个词有关的注意力连接。在展开的依赖关系图上还可以看到指定的关系在不同层的权重会如何变化。
通过对比模型捕捉到的句法依存重要性排序,与依存句法分析结果,可以发现BERT模型对句法和语义的刻画,如图中的movie和depressing两词。
点击每个概览中的注意力头即可展开在这个位置的注意力表示。颜色依然表示的是每个token的显著性得分。
在图中,我们可以看到不同层的不同注意力头都化身成了大小,深浅不一的圆点,包括三种:
1)语义得分:它是从注意力向量和显著性得分的cosine相似度得到,圆点颜色越红,表示这个注意力头对语义的贡献越大。
2)是句法得分n: 我们使用最被关注的源token作为依赖关系预测的目标,对于每个依赖关系,我们计算每个注意力头在所有样例上的平均准确性。最后,将每个头所有依赖关系中的最大值作为他的句法得分。圆点颜色越蓝,表示这个注意力头对句法的贡献越大。
3)重要性得分c,直接计算当前头的最大注意力权重在所有样例上的平均,圆点颜色越大表示注意力头对最终预测的贡献越高。
地址:https://poloclub.github.io/dodrio/