BERT 的嵌入层是如何实现的?看完你就明白了

作者:__
编译:ronghuaiyang

导读: 非常简单直白的语言解释了 BERT 中的嵌入层的组成以及实现的方式。

介绍

在本文中,我将解释 BERT 中嵌入层的实现细节,即 token 嵌入、Segment 嵌入和 Position 嵌入。

简介

这是一张来自论文的图,它恰当地描述了 BERT 中每一个嵌入层的功能:

与大多数旨在解决 nlp 相关任务的深度学习模型一样,BERT 将每个输入 token(输入文本中的单词)通过 token 嵌入层传递,以便将每个 token 转换为向量表示。与其他深度学习模型不同,BERT 有额外的嵌入层,以 Segment 嵌入和 Position 嵌入的形式。这些附加的嵌入层的原因会在本文的最后变得清楚。

Token 嵌入

目的

如前一节所述,token 嵌入层的作用是将单词转换为固定维的向量表示形式。在 BERT 的例子中,每个单词都表示为一个 768 维的向量。

实现

假设输入文本是“I like strawberries”。下图描述了 token 嵌入层的作用:

在将输入文本传递到 token 嵌入层之前,首先对其进行 token 化。另外,在 tokens 的开始([CLS])和结束([SEP])处添加额外的 tokens。这些 tokens 的目的是作为分类任务的输入表示,并分别分隔一对输入文本(更多细节将在下一节中介绍)。

tokens 化是使用一种叫做 WordPiece token 化的方法来完成的。这是一种数据驱动的 token 化方法,旨在实现词汇量和非词汇量之间的平衡。这就是“strawberries”被分成“straw”和“berries”的方式。对这种方法的详细描述超出了本文的范围。感兴趣的读者可以参考 Wu et al. (2016)和 Schuster & Nakajima (2012)中的第 4.1 节。单词 token 化的使用使得 BERT 只能在其词汇表中存储 30522 个“词”,而且在对英语文本进行 token 化时,很少会遇到词汇表以外的单词。



token 嵌入层将每个 wordpiece token 转换为 768 维向量表示形式。这将使得我们的 6 个输入 token 被转换成一个形状为(6,768)的矩阵,或者一个形状为(1,6,768)的张量,如果我们包括批处理维度的话。

Segment 嵌入

目的

BERT 能够解决包含文本分类的 NLP 任务。这类问题的一个例子是对两个文本在语义上是否相似进行分类。这对输入文本被简单地连接并输入到模型中。那么 BERT 是如何区分输入的呢?答案是 Segment 嵌入。

实现

假设我们的输入文本对是(“I like cats”, “I like dogs”)。下面是 Segment 嵌入如何帮助 BERT 区分这个输入对中的 tokens :

Segment 嵌入层只有两个向量表示。第一个向量(索引 0)分配给属于输入 1 的所有 tokens,而最后一个向量(索引 1)分配给属于输入 2 的所有 tokens。如果一个输入只有一个输入语句,那么它的 Segment 嵌入就是对应于 Segment 嵌入表的索引为 0 的向量。

Position 嵌入

目的

BERT 由一堆 Transformers 组成的,广义地说,Transformers 不编码其输入的顺序特征。在这个博客文章:https://medium.com/@init/how-self-attention-with-relatedposition-representations-works-28173b8c245a 的动机部分更详细地解释了我的意思。总之,有 Position 嵌入将允许 BERT 理解给定的输入文本,比如:

I think, therefore I am

第一个“I”不应该与第二个“I”具有相同的向量表示。

实现

BERT 被设计用来处理长度为 512 的输入序列。作者通过让 BERT 学习每个位置的向量表示来包含输入序列的顺序特征。这意味着 Position 嵌入层是一个大小为(512,768)的查找表,其中第一行是第一个位置上的任意单词的向量表示,第二行是第二个位置上的任意单词的向量表示,等等。因此,如果我们输入“Hello world”和“Hi there”,“Hello”和“Hi”将具有相同的 Position 嵌入,因为它们是输入序列中的第一个单词。同样,“world”和“there”的 Position 嵌入是相同的。

合并表示

我们已经看到,长度为 n 的 token 化输入序列将有三种不同的表示,即:

  • token嵌入,形状(1,n, 768),这只是词的向量表示
  • Segment嵌入,形状(1,n, 768),这是向量表示,以帮助BERT区分成对的输入序列。
  • Position嵌入,形状(1,n, 768),让BERT知道其输入具有时间属性。

对这些表示进行元素求和,生成一个形状为(1,n, 768)的单一表示。这是传递给 BERT 的编码器层的输入表示。

总结

在本文中,我描述了 BERT 的每个嵌入层的用途及其实现。如果你有任何问题,请在评论中告诉我。


本文地址:https://www.6aiq.com/article/1582912523500
知乎专栏 点击关注
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出