Nlp Pytorch:如何实现嵌套转换器:单词的字符级转换器和句子的单词级转换器?

Nlp Pytorch:如何实现嵌套转换器:单词的字符级转换器和句子的单词级转换器?,nlp,pytorch,Nlp,Pytorch,我心中有一个模型,但我很难弄清楚如何在Pytorch中实际实现它,尤其是在培训模型时(例如,如何定义小批量等)。首先,让我简单介绍一下上下文: 我正在研究VQA(视觉问答),其中的任务是回答有关图像的问题,例如: 所以,撇开许多细节不谈,我只想在这里集中讨论模型的NLP方面/分支。为了处理自然语言问题,我想使用字符级嵌入(而不是传统的单词级嵌入),因为它们更健壮,可以轻松适应单词的形态变化(例如前缀、后缀、复数、动词变位、连字符等)。但与此同时,我不想在词汇层面上失去推理的归纳偏见。因此,我提

我心中有一个模型,但我很难弄清楚如何在Pytorch中实际实现它,尤其是在培训模型时(例如,如何定义小批量等)。首先,让我简单介绍一下上下文:

我正在研究VQA(视觉问答),其中的任务是回答有关图像的问题,例如:

所以,撇开许多细节不谈,我只想在这里集中讨论模型的NLP方面/分支。为了处理自然语言问题,我想使用字符级嵌入(而不是传统的单词级嵌入),因为它们更健壮,可以轻松适应单词的形态变化(例如前缀、后缀、复数、动词变位、连字符等)。但与此同时,我不想在词汇层面上失去推理的归纳偏见。因此,我提出了以下设计:

正如你在上面的图片中看到的,我想使用(甚至更好),但有点扭曲。我想使用两个转换器:第一个将单独处理每个单词字符(字符级转换器),为问题中的每个单词生成初始单词级嵌入。一旦我们有了所有这些初始单词级嵌入,第二个单词级转换器将细化这些嵌入,以丰富它们的上下文表示,从而获得上下文感知的单词级嵌入

整个VQA任务的完整模型显然更复杂,但我只想在这里集中讨论NLP部分。所以我的问题基本上是关于在实现这个时应该注意哪些Pytorch函数。例如,由于我将使用字符级嵌入,我必须定义一个字符级嵌入矩阵,但我必须对该矩阵执行查找以生成字符级转换器的输入,对问题中的每个单词重复此操作,然后将所有这些向量输入到字级转换器。此外,单个问题中的单词可以有不同的长度,单个小批量中的问题也可以有不同的长度。因此,在我的代码中,我必须以某种方式在单个小批量(在培训期间)中同时考虑单词和问题级别的不同长度,我不知道如何在Pytorch中实现这一点,也不知道这是否可能


任何关于如何在Pytork中实现这一点的建议都将使我朝着正确的方向前进,我们将不胜感激。

要实现您在Pytork中所说的内容,需要调整变压器编码器:

1) 定义将单词拆分为字符嵌入(而不是单词或单词片段嵌入)的自定义标记器

2) 为每个单词定义一个掩码(类似于原始纸张在解码器中用于屏蔽未来标记的掩码),以便强制将模型约束到单词上下文(在第一阶段)

3) 然后使用带掩码的传统转换器(有效地限制字级上下文)

4) 然后丢弃掩码并再次应用Transformer(句子级上下文)

注意事项:

1) 请记住,Transformer编码器的输出长度始终与输入长度相同(解码器能够产生更长或更短的序列)。因此,在第一阶段中,您将没有单词级嵌入(如图所示),而是字符级嵌入。如果要将它们合并到字级嵌入中,则需要额外的中间解码器步骤,或使用自定义策略(例如:学习的加权和或使用类似于BERT标记的东西)合并嵌入

2) 你可能会面临效率问题。记住,Transformer是O(n^2),因此序列越长,计算成本就越高。在最初的Transformer中,如果您有一个长度为10个单词的句子,那么Thansformer必须处理10个标记序列。如果您使用词块嵌入,您的模型将在大约15个标记序列下工作。但是如果你使用字符级嵌入,我估计你将处理大约50个标记序列,这对于长句可能不可行,因此你可能需要截断你的输入(并且你将失去注意力模型的所有长期依赖能力)

3) 您确定通过添加角色级别转换器将有代表性贡献吗?Transformer旨在基于上下文(围绕嵌入)丰富嵌入,这就是原始实现使用单词级嵌入的原因。BERT使用单词块嵌入,以利用相关单词中的语言规则,GPT-2使用字节Pais嵌入(BPE),我不建议在您的案例中使用,因为它更适合于下一个标记预测。在您的情况下,您认为学习的字符嵌入将捕获哪些信息,以便在单词的字符之间有效地共享?你认为它会比为每个单词或词条使用一个学习过的嵌入更丰富吗?我猜这就是你想知道的。。。对吧?