BertViz 是一种交互式工具,用于可视化Transformer语言模型(例如 BERT、GPT2 或 T5)中的注意力。它可以通过支持大多数Huggingface 模型的简单 Python API 在 Jupyter 或 Colab 笔记本中运行。 BertViz 扩展了 Llion Jones 的Tensor2Tensor 可视化工具,提供了多个视图,每个视图都为注意力机制提供了独特的视角。
在Twitter 上获取此项目及相关项目的更新。
头部视图可视化同一层中一个或多个注意力头的注意力。它基于Llion Jones出色的Tensor2Tensor 可视化工具。
🕹 尝试交互式 Colab 教程中的头部视图(所有可视化效果均已预加载)。
模型视图显示了所有层和头的注意力的鸟瞰图。
🕹 尝试交互式 Colab 教程中的模型视图(所有可视化均已预加载)。
神经元视图可视化查询和关键向量中的各个神经元,并显示它们如何用于计算注意力。
🕹 尝试交互式 Colab 教程中的神经元视图(所有可视化均已预加载)。
从命令行:
pip install bertviz
您还必须安装 Jupyter Notebook 和 ipywidgets:
pip install jupyterlab pip install ipywidgets
(如果您在安装 Jupyter 或 ipywidgets 时遇到任何问题,请参阅此处和此处的文档。)
要创建新的 Jupyter 笔记本,只需运行:
jupyter notebook
然后如果出现提示,请单击New
并选择Python 3 (ipykernel)
。
要在Colab中运行,只需在 Colab 笔记本的开头添加以下单元格:
!pip install bertviz
运行以下代码加载xtremedistil-l12-h384-uncased
模型并将其显示在模型视图中:
from transformers import AutoTokenizer, AutoModel, utils from bertviz import model_view utils.logging.set_verbosity_error() # Suppress standard warningsmodel_name = "microsoft/xtremedistil-l12-h384-uncased" # Find popular HuggingFace models here: https://huggingface.co/models input_text = "The cat sat on the mat"
model = AutoModel.from_pretrained(model_name, output_attentions=True) # Configure model to return attention values tokenizer = AutoTokenizer.from_pretrained(model_name) inputs = tokenizer.encode(input_text, return_tensors='pt') # Tokenize input text outputs = model(inputs) # Run model attention = outputs[-1] # Retrieve attention from model outputs tokens = tokenizer.convert_ids_to_tokens(inputs[0]) # Convert input ids to token strings model_view(attention, tokens) # Display model view
可视化可能需要几秒钟的时间来加载。请随意尝试不同的输入文本和 模型。请参阅文档了解其他用例和示例,例如编码器-解码器模型。
您还可以运行BertViz 附带的任何示例笔记本:
git clone --depth 1 [email protected]:jessevig/bertviz.git cd bertviz/notebooks jupyter notebook
查看交互式 Colab 教程 ,了解有关 BertViz 的更多信息并试用该工具。注意:所有可视化均已预先加载,因此无需执行任何单元格。
首先加载 Huggingface 模型,可以是如下所示的预训练模型,也可以是您自己的微调模型。一定要设置output_attentions=True
.
from transformers import AutoTokenizer, AutoModel, utils utils.logging.set_verbosity_error() # Suppress standard warnings tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") model = AutoModel.from_pretrained("bert-base-uncased", output_attentions=True)
然后准备输入并计算注意力:
inputs = tokenizer.encode("The cat sat on the mat", return_tensors='pt') outputs = model(inputs) attention = outputs[-1] # Output includes attention weights when output_attentions=True tokens = tokenizer.convert_ids_to_tokens(inputs[0])
最后,使用head_view
或model_view
函数显示注意力权重:
from bertviz import head_view head_view(attention, tokens)
示例:DistilBERT(模型视图笔记本、头部视图笔记本)
神经元视图的调用方式与头部视图或模型视图不同,因为需要访问模型的查询/键向量,而这些向量不是通过 Huggingface API 返回的。目前仅限于 BertViz 中包含的 BERT、GPT-2 和 RoBERTa 的自定义版本。
# Import specialized versions of models (that return query/key vectors) from bertviz.transformers_neuron_view import BertModel, BertTokenizer from bertviz.neuron_view import showmodel_type = 'bert' model_version = 'bert-base-uncased' do_lower_case = True sentence_a = "The cat sat on the mat" sentence_b = "The cat lay on the rug" model = BertModel.from_pretrained(model_version, output_attentions=True) tokenizer = BertTokenizer.from_pretrained(model_version, do_lower_case=do_lower_case) show(model, model_type, tokenizer, sentence_a, sentence_b, layer=2, head=0)
示例:BERT(笔记本、 Colab) • GPT-2(笔记本、 Colab) • RoBERTa(笔记本)
如需完整 API,请参阅源代码。
头部视图和模型视图都支持编码器-解码器模型。
首先,加载编码器-解码器模型:
from transformers import AutoTokenizer, AutoModeltokenizer = AutoTokenizer.from_pretrained("Helsinki-NLP/opus-mt-en-de") model = AutoModel.from_pretrained("Helsinki-NLP/opus-mt-en-de", output_attentions=True)
然后准备输入并计算注意力:
encoder_input_ids = tokenizer("She sees the small elephant.", return_tensors="pt", add_special_tokens=True).input_ids with tokenizer.as_target_tokenizer(): decoder_input_ids = tokenizer("Sie sieht den kleinen Elefanten.", return_tensors="pt", add_special_tokens=True).input_idsoutputs = model(input_ids=encoder_input_ids, decoder_input_ids=decoder_input_ids)
encoder_text = tokenizer.convert_ids_to_tokens(encoder_input_ids[0]) decoder_text = tokenizer.convert_ids_to_tokens(decoder_input_ids[0])
最后,使用head_view
或显示可视化效果model_view
。
from bertviz import model_view model_view( encoder_attention=outputs.encoder_attentions, decoder_attention=outputs.decoder_attentions, cross_attention=outputs.cross_attentions, encoder_tokens= encoder_text, decoder_tokens = decoder_text )
您可以从可视化左上角的下拉列表中选择Encoder
、Decoder
或关注。Cross
git clone https://github.com/jessevig/bertviz.git
cd bertviz
python setup.py develop
模型视图和神经元视图支持暗(默认)和亮模式。您可以使用参数设置模式display_mode
:
model_view(attention, tokens, display_mode="light")
为了提高工具在可视化较大模型或输入时的响应能力,您可以设置参数include_layers
以将可视化限制为图层的子集(零索引)。此选项在头部视图和模型视图中可用。
示例:仅显示第 5 层和第 6 层的渲染模型视图
model_view(attention, tokens, include_layers=[5, 6])
对于模型视图,您还可以通过设置参数将可视化限制为注意力头的子集(零索引)
include_heads
。
在头部视图中,您可以选择特定的layer
集合heads
作为可视化首次呈现时的默认选择。注意:这与include_heads
/参数(上面)不同include_layers
,后者从可视化中完全删除图层和头部。
示例:渲染头部视图,其中第 2 层以及预选的头部 3 和头部 5
head_view(attention, tokens, layer=2, heads=[3,5])
您还可以为神经元视图预先选择特定的layer
单个head
神经元视图。
一些模型,例如 BERT,接受一对句子作为输入。 BertViz 可选地支持下拉菜单,允许用户根据标记所在的句子来过滤注意力,例如仅显示第一个句子中的标记和第二个句子中的标记之间的注意力。
要在调用head_view
或model_view
函数时启用此功能,请将sentence_b_start
参数设置为第二句的起始索引。请注意,计算该指数的方法取决于模型。
示例(BERT):
from bertviz import head_view from transformers import AutoTokenizer, AutoModel, utils utils.logging.set_verbosity_error() # Suppress standard warnings# NOTE: This code is model-specific model_version = 'bert-base-uncased' model = AutoModel.from_pretrained(model_version, output_attentions=True) tokenizer = AutoTokenizer.from_pretrained(model_version) sentence_a = "the rabbit quickly hopped" sentence_b = "The turtle slowly crawled" inputs = tokenizer.encode_plus(sentence_a, sentence_b, return_tensors='pt') input_ids = inputs['input_ids'] token_type_ids = inputs['token_type_ids'] # token type id is 0 for Sentence A and 1 for Sentence B attention = model(input_ids, token_type_ids=token_type_ids)[-1] sentence_b_start = token_type_ids[0].tolist().index(1) # Sentence B starts at first index of token type id 1 token_ids = input_ids[0].tolist() # Batch index 0 tokens = tokenizer.convert_ids_to_tokens(token_ids)
head_view(attention, tokens, sentence_b_start)
要在神经元视图中启用此选项,只需在 中设置sentence_a
和sentence_b
参数即可neuron_view.show()
。
head_view、model_view 和 Neuron_view 添加了对检索生成的 HTML 表示的支持。
将“html_action”参数设置为“return”将使函数调用返回可以进一步处理的单个 HTML Python 对象。请记住,您可以使用 Python HTML 对象的 data 属性访问 HTML 源。
“html_action”的默认行为是“view”,它将显示可视化但不会返回 HTML 对象。
如果您需要执行以下操作,则此功能非常有用:
- 将表示另存为可通过 Web 浏览器访问的独立 HTML 文件
- 使用 Databricks 中所需的自定义显示方法来可视化 HTML 对象
示例(头部和模型视图):
from transformers import AutoTokenizer, AutoModel, utils from bertviz import head_viewutils.logging.set_verbosity_error() # Suppress standard warnings tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") model = AutoModel.from_pretrained("bert-base-uncased", output_attentions=True)
inputs = tokenizer.encode("The cat sat on the mat", return_tensors='pt') outputs = model(inputs) attention = outputs[-1] # Output includes attention weights when output_attentions=True tokens = tokenizer.convert_ids_to_tokens(inputs[0])
html_head_view = head_view(attention, tokens, html_action='return')
with open("PATH_TO_YOUR_FILE/head_view.html", 'w') as file: file.write(html_head_view.data)
示例(神经元视图):
# Import specialized versions of models (that return query/key vectors) from bertviz.transformers_neuron_view import BertModel, BertTokenizer from bertviz.neuron_view import showmodel_type = 'bert' model_version = 'bert-base-uncased' do_lower_case = True sentence_a = "The cat sat on the mat" sentence_b = "The cat lay on the rug" model = BertModel.from_pretrained(model_version, output_attentions=True) tokenizer = BertTokenizer.from_pretrained(model_version, do_lower_case=do_lower_case) html_neuron_view = show(model, model_type, tokenizer, sentence_a, sentence_b, layer=2, head=0, html_action='return')
with open("PATH_TO_YOUR_FILE/neuron_view.html", 'w') as file: file.write(html_neuron_view.data)
头部视图和模型视图可用于可视化任何标准 Transformer 模型的自注意力,只要注意力权重可用并遵循head_view
和
中指定的格式model_view
(这是从 Huggingface 模型返回的格式)。在某些情况下,Tensorflow 检查点可能会作为 Huggingface 模型加载,如
Huggingface 文档中所述。
- 该工具专为较短的输入而设计,如果输入文本很长和/或模型很大,则可能会运行缓慢。为了缓解这种情况,您可能希望通过设置参数来过滤显示的图层
include_layers
,如上所述。 - 在 Colab 上运行时,当输入文本较长时,某些可视化将失败(运行时断开连接)。为了缓解这种情况,您可能希望通过设置参数来过滤显示的图层
include_layers
,如上所述。 - 神经元视图仅支持该工具附带的自定义 BERT、GPT-2 和 RoBERTa 模型。该视图需要访问查询和键向量,这需要修改模型代码(参见
transformers_neuron_view
目录),仅对这三个模型进行了修改。
- 可视化注意力权重阐明了模型内的一种架构,但不一定为预测提供直接解释[ 1,2,3 ]。
- 如果您希望了解输入文本如何更直接地影响输出预测,请考虑Language Interpretability Toolkit或Ecco等工具提供的显着性方法。
Transformer 模型中注意力的多尺度可视化(ACL 系统演示 2019)。
@inproceedings{vig-2019-multiscale, title = "A Multiscale Visualization of Attention in the Transformer Model", author = "Vig, Jesse", booktitle = "Proceedings of the 57th Annual Meeting of the Association for Computational Linguistics: System Demonstrations", month = jul, year = "2019", address = "Florence, Italy", publisher = "Association for Computational Linguistics", url = "https://www.aclweb.org/anthology/P19-3007", doi = "10.18653/v1/P19-3007", pages = "37--42", }
我们感谢以下项目的作者,这些项目已纳入此存储库:
该项目根据 Apache 2.0 许可证获得许可 -有关详细信息,请参阅许可证文件