我心里有一个模型,但我很难弄清楚如何在 Pytorch 中实际实现它,特别是在训练模型时(例如如何定义小批量等)。首先我简单介绍一下事情的来龙去脉:
我正在研究VQA(视觉问答),其中的任务是回答有关图像的问题,例如:
因此,抛开许多细节,我只想重点关注模型的 NLP 方面/分支。为了处理自然语言问题,我想使用字符级嵌入(而不是传统的单词级嵌入),因为它们更稳健,可以轻松适应单词的形态变化(例如前缀、后缀、复数、动词变形、连字符等)。但同时我不想失去单词层面推理的归纳偏差。因此,我提出了以下设计:
正如您在上图中看到的,我想使用变压器(或者更好的是通用变压器),但有一点改变。我想使用 2 个变压器:第一个变压器将单独处理每个单词字符(字符级变压器),为问题中的每个单词生成初始单词级嵌入。一旦我们有了所有这些初始的单词级嵌入,第二个单词级转换器将细化这些嵌入,以丰富它们的上下文表示,从而获得上下文感知的单词级嵌入。
整个 VQA 任务的完整模型显然更复杂,但我只想在这里重点关注 NLP 部分。所以我的问题基本上是关于在实现这个时我应该注意哪些 Pytorch 函数。例如,由于我将使用字符级嵌入,所以我必须定义一个字符级嵌入矩阵,但随后我必须对此矩阵执行查找以生成字符级转换器的输入,对每个单词重复此操作问题中,然后将所有这些向量输入到字级转换器中。此外,单个问题中的单词可以有不同的长度,单个小批量中的问题也可以有不同的长度。因此,在我的代码中,我必须以某种方式在单个小批量(训练期间)中同时考虑单词和问题级别的不同长度,而且我不知道如何在 Pytorch 中做到这一点,也不知道是否可以在全部。
任何关于如何在 Pytorch 中实现这一点的提示,如果能够引导我走向正确的方向,我将不胜感激。
实现您在 pyTorch 中所说的方法需要调整 Transformer 编码器:
1) 定义一个自定义分词器,将单词拆分为字符嵌入(而不是单词或单词片段嵌入)
2)为每个单词定义一个掩码(类似于原始论文用于掩码解码器中未来标记的掩码),以强制模型约束于单词上下文(在第一阶段)
3)然后使用带有掩码的传统 Transformer(有效限制单词级上下文)。
4)然后丢弃掩码并再次应用Transformer(句子级上下文)。
。
需要注意的事项:
1) 请记住,Transformer 编码器的输出长度始终与输入的大小相同(解码器能够生成更长或更短的序列)。因此,在第一阶段,您不会有单词级嵌入(如图所示),而是字符级嵌入。如果要将它们合并到单词级嵌入中,则需要额外的中间解码器步骤或使用自定义策略合并嵌入(例如:学习的加权和或使用类似于 BERT 令牌的东西)。
2)您可能会面临效率问题。请记住,Transformer 的复杂度为 O(n^2),因此序列越长,计算成本就越高。在原始 Transformer 中,如果句子长度为 10 个单词,那么 Thansformer 将必须处理 10 个标记的序列。如果您使用单词片段嵌入,您的模型将在大约 15 个标记序列下工作。但是,如果您使用字符级嵌入,我估计您将处理大约 50 个标记序列,这对于长句子可能不可行,因此您可能需要截断您的输入(并且您将丢失所有长句子)注意模型的术语依赖力)。
3)你确定添加角色级Transformer会有代表性的贡献吗?Transformer 的目标是根据上下文(周围嵌入)丰富嵌入,这就是原始实现使用字级嵌入的原因。BERT 使用单词片段嵌入,以利用相关单词中的语言规律,而 GPT-2 使用 Byte-Pais-Embeddings (BPE),我不推荐在您的情况下使用它,因为它更适合下一个标记预测。就您而言,您认为在学习的字符嵌入中会捕获哪些信息,以便可以在单词的字符之间有效共享?您认为它会比对每个单词或单词片段使用学习嵌入更丰富吗?我的猜测是,这就是您想要找出的内容......对吧?
| 归档时间: |
|
| 查看次数: |
1310 次 |
| 最近记录: |