pc蛋蛋群

探索

当前位置: 首页 > 科技 > 探索 > 用可视化解构BERT,我们从上亿参数中提取出了6种直观模式

用可视化解构BERT,我们从上亿参数中提取出了6种直观模式

  深度神经网络的超强有效性一直让人疑惑。

  经典论文《可视化与理解CNN》(Visualizing and Understanding Convolutional Networks)解释了在图像领域中CNN从低层到高层不断学习出图像的边缘、转角、组合、局部、整体信息的过程,一定层面论证了深度学习的有效性。另一方面,传统的NLP神经网络却并不是那么深,而bert的出现直接将NLP的神经网络加到12层以上。

  那么如何理解各层学到了怎样的信息?

  本文作者Jesse Vig通过可视化工具对此进行了非常有意义的探究。文章分两部分,第一部分介绍bert中的6种模式,第二部分介绍其底层细节。

  可视化BERT之一

  在BERT错综复杂的注意力网络中,出现了一些直观的模式。

  2018年是自然语言处理领域的转折之年,一系列深度学习模型在智能问答、情感分类等多种NLP 任务上取得了最佳结果。特别是最近谷歌的BERT ,成为了一种“以一当十的模型”,在各种任务上都取得了的极佳的表现。

  BERT主要建立在两个核心思想上,这两个思想都包含了NLP 最新进展:(1)Transformer 的架构(2)无监督学习预训练。

  Transformer 是一种序列模型,它舍弃了 RNN 的顺序结构,转而采用了一种完全基于注意力的方法。这在经典论文 《Attention Is All You Need》中有具体介绍。

  BERT 同时也要经过预训练。它的权重预先通过两个无监督任务学习到。这两个任务是:遮蔽语言模型(masked language model,MLM)和下句一句预测(next sentence prediction)。

  因此,对于每个新任务,BERT 不需要从头开始训练。相反,只要在预训练的权重上进行微调(fine-tuning)就行。有关BERT的更多详细信息,可以参考文章《图解BERT》。

  BERT是一只多头怪

  Bert不像传统的注意力模型那样只使用一个平坦的注意力机制。相反,BERT 使用了多层次的注意力(12或24层,具体取决于模型),并在每一层中包含多个(12或16)注意力“头”。由于模型权重不在层之间共享,因此一个BERT 模型就能有效地包含多达24 x 16 = 384个不同的注意力机制。

  可视化BERT

  由于BERT 的复杂性,所以很难直观地了解其内部权重的含义。而且一般来说,深度学习模型也是饱受诟病的黑箱结构。所以大家开发了各种可视化工具来辅助理解。

  可我却没有找到一个工具能够解释BERT 的注意力模式,来告诉我们它到底在学什么。幸运的是,Tensor2Tensor有一个很好的工具,可用于可视化Transformer 模型中的注意力模式。因此我修改了一下,直接用在BERT的一个pytorch版本上。修改后的界面如下所示。你可以直接在这个Colab notebook (https://colab.research.google.com/drive/1vlOJ1lhdujVjfH857hvYKIdKPTD9Kid8)里运行,或在Github 上找到源码。(https://github.com/jessevig/bertviz)。

用可视化解构BERT,我们从上亿参数中提取出了6种直观模式

  这个工具将注意力看做不同的连线,它们用来连接被更新的位置(左半边)与被注意的位置(右半边)。(译注:可以想象为神经网络是从右向左正向传播的。)不同的颜色分别代表相应的注意头,而线条颜色的深浅代表被注意的强度。在这个小工具的顶部,用户可以选择观察模型的第几层,以及第几个注意力头(通过单击顶部的色块即可,它们分别代表着12个头)。

  BERT 到底学了什么?

  我使用该工具探索了预训练 BERT 模型各个层和各个头的注意力模式(用全小写(uncased)版本的BERT-Base 模型)。虽然我尝试了不同的输入句子,但为了方便演示,这里只采用以下例句:

  句子A:I went to the store.

  句子B:At the store, I bought fresh strawberries.

  BERT 用 WordPiece工具来进行分词,并插入特殊的分离符([CLS],用来分隔样本)和分隔符([SEP],用来分隔样本内的不同句子)。

  因此实际输入序列为: [CLS] i went to the store . [SEP] at the store , i bought fresh straw ##berries . [SEP]

  在探索中,我发现了一些特别显著的令人惊讶的注意力模式。下面是我确认的六种关键模式,将产生每一种模式的特定层和头都进行可视化展示。

  模式1:注意下一个词

  在这种模式中,每个位置主要注意序列中的下一个词(token)。下面将看到第2层0号头的一个例子。(所选头部由顶部颜色条中突出的显示色块表示。)

用可视化解构BERT,我们从上亿参数中提取出了6种直观模式

  模式1:注意下一个词。

  左:所有词的注意力。 右:所选词的注意力权重(“i”)

  左边显示了所有词的注意力,而右侧图显示一个特定词(“i”)的注意力。在这个例子中,“i”几乎所有的注意力都集中在“went”上,即序列中的下一个词。

  在左侧,可以看到 [SEP]符号不符合这种注意力模式,因为[SEP]的大多数注意力被引导到了[CLS]上,而不是下一个词。因此,这种模式似乎主要在每个句子内部出现。

  该模式与后向RNN 有关,其状态的更新是从右向左依次进行。模式1出现在模型的多个层中,在某种意义上模拟了RNN 的循环更新。

  模式2:注意前一个词

  在这种模式中,大部分注意力都集中在句子的前一个词上。例如,下图中“went”的大部分注意力都指向前一个词“i”。

  这个模式不像上一个那样显著。有一些注意力也分散到其他词上了,特别是[SEP]符号。与模式1一样,这与RNN 有些类似,只是这种情况下更像前向RNN。

用可视化解构BERT,我们从上亿参数中提取出了6种直观模式

  模式2:注意前一个词。

  左:所有词的注意力。 右:所选词的注意力权重(“went”)

  模式3:注意相同或相关的单词

  这种模式注意相同或相关的单词,包括其本身。在下面的例子中,第一次出现的“store”的大部分注意力都是针对自身和第二次出现的“store”。这种模式并不像其他一些模式那样显著,注意力会分散在许多不同的词上。

用可视化解构BERT,我们从上亿参数中提取出了6种直观模式

  模式3:注意相同/相关的词。

  左:所有词的注意力。 右:所选词的注意权重(“store”)

  模式4:注意“其他”句子中相同或相关词

相关信息: