BERT 嵌入层

数据挖掘 nlp 伯特
2022-02-17 02:38:23

我试图弄清楚嵌入层如何用于预训练的基于 BERT 的模型。我正在使用 pytorch 并尝试剖析以下模型:

import torch
model = torch.hub.load('huggingface/pytorch-transformers', 'model', 'bert-base-uncased')
model.embeddings

这个BERT模型有199个不同的命名参数,其中前5个属于嵌入层(第一层)

==== Embedding Layer ====

embeddings.word_embeddings.weight                       (30522, 768)
embeddings.position_embeddings.weight                     (512, 768)
embeddings.token_type_embeddings.weight                     (2, 768)
embeddings.LayerNorm.weight                                   (768,)
embeddings.LayerNorm.bias                                     (768,)

据我了解,该模型接受任意大小(通常为 32、64 或其他)形状的输入,并且[Batch, Indices]标记化输入句子中每个单词的相应索引。最大长度为512一个输入样本可能如下所示:BatchIndicesIndices

[[101, 1996, 4248, 2829, 4419, 14523, 2058, 1996, 13971, 3899, 102]]

这仅包含 1 个批次,是句子“The quick brown fox jumps over the lazy dog”的标记化形式。

第一个word_embeddings权重会将每个数字转换Indices为跨768维度(嵌入维度)的向量。

现在,position_embeddings权重用于编码输入句子中每个单词的位置。在这里我很困惑为什么要学习这个参数?看看 BERT 模型的另一种实现,位置嵌入是一种静态转换。这似乎也是在变压器模型中进行位置编码的传统方式。查看替代实现,它使用正弦和余弦函数对输入中的交错对进行编码。我尝试比较model.embeddings.position_embeddings.weightpe,但我看不到任何相似之处。在 A.2 预训练程序(第 13 页)下的最后一句中,该论文指出

然后,我们训练 512 序列的其余 10% 的步骤来学习位置嵌入。

为什么位置嵌入权重是学习的而不是预定义的?

位置嵌入之后的下一层是token_type_embeddings. 在这里,我对模型如何推断段标签感到困惑。如果我理解正确,每个输入句子都由[SEP]标记分隔。在上面的示例中,只有 1 个[SEP]标记,并且段标签必须0用于该句子。但最多可以有 2 个段标签。如果是这样,这两个段是分开处理还是并行处理都与一个“数组”相同?模型如何处理多个句段?

最后,这 3 个嵌入的输出被添加在一起并通过我理解的 layernorm。但是,在将模型微调到下游任务时,这些嵌入层中的权重是否会调整?

1个回答

为什么要学习位置嵌入?

是在原始实现的回购中提出的,没有答案。它在HuggingFace Transformers repocross-validated中都没有得到答案,也没有答案,或者没有太多证据。

鉴于在最初的 Transformer 论文中,正弦嵌入是默认的,我知道在初步超参数调整期间,BERT 的作者决定使用学习嵌入,并决定不重复使用这两种嵌入的所有实验。

然而,我们可以在 ICLR'21 文章On Position Embeddings in BERT中看到学习和正弦位置嵌入之间的一些比较,其中作者观察到:

完全可学习的绝对 PE 在分类中表现更好,而相对 PE 在跨度预测中表现更好。

模型如何处理多个句段?

最好通过原始 BERT 论文的图来理解这一点:

在此处输入图像描述

这两个句子被编码成三个相同长度的序列:

  • 子词标记序列:句子标记连接成单个序列,用[SEP]标记分隔它们。该序列嵌入了子词令牌嵌入表;你可以在这里看到令牌
  • 位置嵌入序列:顺序增加的位置从令牌的初始位置[CLS]到第二个[SEP]令牌的位置。这个序列嵌入了位置嵌入表,它有 512 个元素。
  • 段嵌入序列:与EA第一个句子的标记长度一样多的标记(带有[CLS][SEP]),后跟EB与第二个句子的标记长度一样多的标记(带有[SEP])。这个序列嵌入了段嵌入表,有 2 个元素。

在将这三个序列与各自的嵌入表嵌入后,我们得到了 3 个向量序列,它们相加并用作自注意力层的输入。

在将模型微调到下游任务时,这些嵌入层中的权重是否会调整?

是的,他们是。通常,在微调基于 BERT 的模型时会微调所有参数。

尽管如此,也可以简单地使用 BERT 的表示作为分类模型的输入,而不需要对 BERT 进行微调。

本文中,您可以看到这两种方法的比较。一般来说,对于 BERT,你可以通过微调整个模型来获得更好的结果。