Skip to content

yuanzhongqiao/bertviz

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

伯特维兹

可视化 NLP 模型中的注意力

BertViz 是一种交互式工具,用于可视化Transformer语言模型(例如 BERT、GPT2 或 T5)中的注意力。它可以通过支持大多数Huggingface 模型的简单 Python API 在 Jupyter 或 Colab 笔记本中运行。 BertViz 扩展了 Llion JonesTensor2Tensor 可视化工具,提供了多个视图,每个视图都为注意力机制提供了独特的视角。

在Twitter 推特标志上获取此项目及相关项目的更新。

🚀 快速浏览

头部视图

头部视图可视化同一层中一个或多个注意力头的注意力。它基于Llion Jones出色的Tensor2Tensor 可视化工具

🕹 尝试交互式 Colab 教程中的头部视图(所有可视化效果均已预加载)。

模型视图

模型视图显示了所有层和头的注意力的鸟瞰图。

🕹 尝试交互式 Colab 教程中的模型视图(所有可视化均已预加载)。

模型视图

神经元视图

神经元视图可视化查询和关键向量中的各个神经元,并显示它们如何用于计算注意力。

🕹 尝试交互式 Colab 教程中的神经元视图(所有可视化均已预加载)。

神经元视图

⚡️ 开始使用

在 Jupyter Notebook 中运行 BertViz

从命令行:

pip install bertviz

您还必须安装 Jupyter Notebook 和 ipywidgets:

pip install jupyterlab
pip install ipywidgets

(如果您在安装 Jupyter 或 ipywidgets 时遇到任何问题,请参阅此处此处的文档。)

要创建新的 Jupyter 笔记本,只需运行:

jupyter notebook

然后如果出现提示,请单击New并选择Python 3 (ipykernel)

在 Colab 中运行 BertViz

要在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 warnings

model_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 的更多信息并试用该工具。注意:所有可视化均已预先加载,因此无需执行任何单元格。

教程

📖 文档

目录

自注意力模型(BERT、GPT-2等)

头部和模型视图

首先加载 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_viewmodel_view 函数显示注意力权重:

from bertviz import head_view
head_view(attention, tokens)

示例:DistilBERT(模型视图笔记本头部视图笔记本

完整的API请参考头部视图模型视图的源代码。

神经元视图

神经元视图的调用方式与头部视图或模型视图不同,因为需要访问模型的查询/键向量,而这些向量不是通过 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 show

model_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,请参阅源代码

编码器-解码器模型(BART、T5 等)

头部视图和模型视图都支持编码器-解码器模型。

首先,加载编码器-解码器模型:

from transformers import AutoTokenizer, AutoModel

tokenizer = 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_ids

outputs = 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
)

您可以从可视化左上角的下拉列表中选择EncoderDecoder或关注。Cross

示例:MarianMT(笔记本)• BART(笔记本

完整的API请参考头部视图模型视图的源代码。

从源安装

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_viewmodel_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_asentence_b参数即可neuron_view.show()

获取 HTML 表示

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_view

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])

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 show

model_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目录),仅对这三个模型进行了修改。

注意力作为“解释”?

🔬 纸

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 许可证获得许可 -有关详细信息,请参阅许可证文件

Releases

No releases published

Packages

No packages published

Languages

  • Python 86.2%
  • JavaScript 11.4%
  • Jupyter Notebook 2.4%