在描述BERT的论文中,有一段关于WordPiece嵌入的段落。
我们使用WordPiece嵌入(Wu等人,2016年),词汇量为30,000个标记。每条序列的第一个标记始终是一个特殊的分类标记([CLS])。对应于此标记的最终隐藏状态被用作分类任务的聚合序列表示。句子对被打包成单一序列。我们通过两种方式区分这些句子。首先,我们用一个特殊标记([SEP])将它们分开。其次,我们为每个标记添加一个学习到的嵌入,以指示它属于句子A还是句子B。如图1所示,我们将输入嵌入表示为E,将特殊[CLS]标记的最终隐藏向量表示为C 2 RH,并将第i个输入标记的最终隐藏向量表示为Ti 2 RH。对于给定的标记,其输入表示是由相应的标记、段和位置嵌入的总和构建的。这种构建的可视化可以在图2中看到。
据我所知,WordPiece将单词分割成像#I #like #swim #ing这样的词片,但它并不生成嵌入。然而,我在论文和其他来源中都没有找到关于这些Token Embeddings是如何生成的信息。它们是在实际预训练之前预训练的吗?如何做的?还是它们是随机初始化的?
回答:
词片是单独训练的,最常见的词会保持在一起,而不太常见的词最终会被分割成字符。
嵌入是与BERT的其余部分一起训练的。反向传播通过所有层一直到嵌入,这些嵌入就像网络中的其他参数一样被更新。
请注意,只有在训练批次中实际存在的标记的嵌入会被更新,其余的保持不变。这也是为什么你需要一个相对较小的词片词汇量的原因,这样所有嵌入在训练过程中都能频繁更新。