我试图弄清楚嵌入层是如何为预先训练的伯特基模型工作的。我正在使用火把,并试图解剖以下模型:
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,)据我所知,模型接受[Batch, Indices]形式的输入,其中Batch是任意大小的(通常是32、64或其他的),Indices是标记化输入句中每个单词的对应索引。Indices的最大长度为512。一个输入示例可能如下所示:
[[101, 1996, 4248, 2829, 4419, 14523, 2058, 1996, 13971, 3899, 102]]这只包含一批,是“快棕狐跳过懒狗”这句话的标记形式。
第一个word_embeddings权重将把Indices中的每个数字转换为一个768维数(嵌入维数)中的向量。
现在,position_embeddings权重用于编码输入句子中每个单词的位置。在这里,我很困惑为什么要学习这个参数?从BERT模型的替代实施来看,位置嵌入是一个静态转换。这似乎也是在变压器模型中进行位置编码的传统方法。考虑到替代实现,它使用正弦和余弦函数在输入中编码交错对。我试着比较model.embeddings.position_embeddings.weight和pe,但是我看不到任何相似之处。在A.2培训前程序(第13页)下的最后一句中,纸声明
然后,对512序列的其余10%的步骤进行训练,以学习位置嵌入。
为什么位置嵌入权是学习而不是预定义的?
位置嵌入后的下一层是token_type_embeddings。在这里,我对如何通过模型推断片段标签感到困惑。如果我正确理解了这一点,那么每个输入语句都由[SEP]标记分隔。在上面的例子中,只有一个[SEP]令牌,对于这个句子,段标签必须是0。但最多可以有两个片段标签。如果是这样的话,这两个段是分开处理,还是被并行处理,就像一个“数组”?模型如何处理多个句子段?
最后,从这三个嵌入的输出被添加到更高的,并通过分层规范,我理解。但是,当将模型微调到下游任务时,这些嵌入层中的权重是否进行了调整?
发布于 2021-05-03 21:39:00
这个在原始实现的回购中被要求。没有答案。无论是在拥抱变压器回购中还是在交叉验证中,它都没有得到答案,也没有答案,也没有多少证据。
考虑到在原变压器纸中,正弦波嵌入是默认的,我理解在初步的超参数调优过程中,伯特的作者决定采用所学的嵌入,决定不重复这两种类型的嵌入的所有实验。
然而,我们可以在ICLR的21篇文章关于BERT中的位置嵌入中看到学习的位置嵌入和正弦的位置嵌入之间的一些比较,其中作者观察到:
完全可学习绝对PE在分类方面表现较好,而相对PEs在span预测方面表现较好.
这一点最好用BERT原始文件的数字来理解:

这两个句子被编码成三个长度相同的序列:
[SEP]标记将它们分开。这个序列嵌入了子字令牌嵌入表;您可以看到令牌这里。[CLS]令牌的初始位置到第二个[SEP]令牌的位置。这个序列嵌入到位置嵌入表中,该表有512个元素。EA标记(使用[CLS]和[SEP]),然后是与第二句的令牌长度相同的EB标记(带有[SEP])。该序列嵌入段嵌入表中,有两个元素。在将这三个序列嵌入各自的嵌入表后,我们得到了三个向量序列,它们被加到一起,作为自关注层的输入。
当将模型微调到下游任务时,
是的,他们是。一般情况下,所有参数都是微调的,当精细调谐时,基于伯特的模型.
然而,也可以简单地使用伯特的表示作为分类模型的输入,而根本不对伯特进行微调。
在这篇文章中,您可以看到这两种方法是如何比较的。一般来说,对伯特来说,通过对整个模型进行微调,你可以获得更好的结果。
https://datascience.stackexchange.com/questions/93931
复制相似问题