BERT 中的 TokenEmbeddings 是如何创建的?

问题描述 投票:0回答:2

在描述 BERT 的论文中,有一段关于 WordPiece Embeddings 的内容。

我们使用 WordPiece 嵌入(Wu 等人, 2016)拥有 30,000 个标记词汇。首先 每个序列的标记总是一个特殊的分类 令牌([CLS])。最终隐藏状态 对应该token作为聚合 用于分类的序列表示 任务。句子对被打包成一个 单一序列。我们区分以下句子 两种方式。首先,我们用特殊的方法将它们分开 令牌([SEP])。其次,我们添加学习嵌入 每个标记表明它是否属于 到句子A或句子B。如图1所示, 我们将输入嵌入表示为 E,即最终的隐藏层 特殊 [CLS] 标记的向量为 C 2 RH, 以及第 i 个输入标记的最终隐藏向量 作为Ti 2 RH。 对于给定的标记,其输入表示为 通过对相应的标记求和来构造, 段和位置嵌入。可视化 这种结构如图 2 所示。

据我了解,WordPiece 将单词分割成单词片段,例如#I #like #swim #ing,但它不会生成嵌入。但我在论文和其他来源中没有找到任何内容,这些令牌嵌入是如何生成的。他们在实际预训练之前接受过预训练吗?如何?或者它们是随机初始化的?

machine-learning nlp word-embedding
2个回答
14
投票

单词片段是单独训练的,因此最常见的单词保持在一起,而不太常见的单词最终会拆分为字符。

嵌入与 BERT 的其余部分联合训练。反向传播是通过所有层完成的,直到嵌入,就像网络中的任何其他参数一样更新。

请注意,只有训练批次中实际存在的标记嵌入才会更新,其余部分保持不变。这也是为什么您需要拥有相对较小的单词词汇量的原因,以便所有嵌入在训练期间得到足够频繁的更新。


1
投票

首先,token id 只是它们在词汇表中的索引。 (或者,专门的标记生成器可以进行更复杂的映射,例如包含一些特殊标记偏移量。)

其次,具有可训练权重的嵌入层将 ID 映射到 d_model 向量,形状:(batch, n_ids) -> (batch, n_embeddings, d_model)

一位回答者这里举了一个例子,但没有明确说明数字是词汇的索引:

BERT’s input is essentially subwords. 
For example, if I want to feed BERT the sentence 
“Welcome to HuggingFace Forums!”, what I actually gets fed in is:
['[CLS]', 'welcome', 'to', 'hugging', '##face', 'forums', '!', '[SEP]'].

Each of these tokens is mapped to an integer:
[101, 6160, 2000, 17662, 12172, 21415, 999, 102].

然后我搜索并下载了vocabulary(vocab.txt bert-base-uncased)并验证了上面的数字。

其他链接:
torch.nn.嵌入
nn.Embedding 是如何工作的? 嵌入层本质上只是一个线性层吗?

© www.soinside.com 2019 - 2024. All rights reserved.