作者:__

编译: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 学习每个位置的向量表示来包含输入序列的顺序特征。这意味着 P