Transformer 是 NLP 最重要的技术发展,也是最近DeepSeek等大模型的基础,然而它们的过程仍然不透明,缺乏可解释性。这是一个一直存在的问题,因为随着机器学习的重大进步,我们并不总是能够解释黑箱模型的内部。

注意力可视化 

Transformer 本质上是不可解释的,但已经有许多为基于注意力的模型提供事后可解释性的工具。

如一些早期的工作论文,尝试可解释Attention内部

Seq2Seq-Vis:用于序列到序列模型的可视化调试工具》都打包好了

常用注意力矩阵热图和二分图表示注意力,这也是今天仍在使用的方法。但这些方法也有一些局限性。

Transformer可解释工具 

这里介绍一个模型:BertViz 

该方法在多个局部尺度上可视化注意力机制:神经元级别、多头注意力级别和模型级别。 

 神经元级别 

在下面的 GIF 中,正值为蓝色,负值为橙色,颜色强度反映了值的大小。连接线根据各个单词之间的注意力得分进行加权。 

神经元视图是最精细的结果,但为了更深入地研究,我们可以使用此视图将神经元链接到特定的注意力模式。

需要注意的是,注意力权重和模型输出之间存在什么关系尚不完全清楚。有些人,如 Jain 等人在attention-is-not-explanation中声称(https://paperswithcode.com/paper/attention-is-not-explanation),不应将标准注意力模块视为为预测提供有意义的解释。然而我们也没有其他选择,BertViz 仍然是当今最流行的注意力可视化工具之一。

多头注意力视图 

attention-head 视图通过揭示 attention heads之间的模式,显示 attention 如何在同一 transformer 层内的 tokens 之间流动。在此视图中,左侧的标记正在关注右侧的标记,并且注意力表示为连接每个标记对的线。颜色对应于注意力头,线条粗细表示注意力权重。

注意力头不共享参数,因此每个头都会学习独特的注意力机制。在下图中,给定一个 input,在同一模型的各层中检查注意力头。我们可以看到,不同的注意力头似乎集中在非常独特的模式上。

在左上角,相同单词之间的注意力最强。在右上角和左下角,注意力头专注于每个分隔符(分别为 [SEP] 和 [CLS])。

模型视图 

模型视图是所有图层和头部的注意力的概略图,可能会注意到跨层的注意力模式,说明了注意力模式从输入到输出的演变。每行数字代表一个注意力层,每列代表单独的注意力头。 

在 Jupyter Notebook 中运行 BertViz 

从命令行: 

pip install bertviz

您还必须安装 Jupyter Notebook 和 ipywidgets:

pip install jupyterlab
pip install ipywidgets

然后在出现提示时单击并选择。New``Python 3 (ipykernel) 

示例代码 

 运行以下代码以加载模型并将其显示在模型视图中: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

可视化效果可能需要几秒钟才能加载。随意尝试不同的输入文本和模型。


Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐