Transformer-XL:语言建模的输入和标签

Transformer-XL: Input and labels for Language Modeling

我正在尝试为语言建模任务微调预训练的 Transformer-XL 模型 transfo-xl-wt103。因此,我使用模型 class TransfoXLLMHeadModel.

为了遍历我的数据集,我使用文件 tokenization_transfo_xl.py 中的 LMOrderedIterator,它为每个批次生成一个带有 data 及其 target 的张量(以及序列长度)。

让我们假设以下数据为 batch_size = 1bptt = 8

data = tensor([[1,2,3,4,5,6,7,8]])
target = tensor([[2,3,4,5,6,7,8,9]])
mems # from the previous output

我的问题是:我目前将这些数据传递到模型中是这样的:

output = model(input_ids=data, labels=target, mems=mems)

这是正确的吗?

我想知道,因为文档对 labels 参数说:

labels (:obj:torch.LongTensor of shape :obj:(batch_size, sequence_length), optional, defaults to :obj:None): Labels for language modeling. Note that the labels are shifted inside the model, i.e. you can set lm_labels = input_ids

那么参数lm_labels有什么用呢?我只看到 labelsforward 方法中定义。

当模型内部的标签 "are shifted" 时,这是否意味着我必须通过 data 两次(另外而不是 targets),因为它在内部移动了?但是模型如何知道下一个要预测的标记?

我也通读了 this bug and the fix in this pull request 但我不太明白现在如何处理模型(修复前与修复后)

在此先感谢您的帮助!

编辑Link 于 Github

发布

这听起来像是另一个模型约定中的错字。您必须将数据传递两次,一次传递给 input_ids,一次传递给 labels(在您的情况下,两者都是 [1, ... , 8])。然后该模型将尝试从 [1, ... , 7] 预测 [2, ... , 8])。我不确定在目标张量的开头添加一些东西是否有效,因为这可能会导致稍后的大小不匹配。

传递两次是在变形金刚中执行此操作的默认方式;在前面提到的 PR 之前,TransfoXL 没有在内部移动标签,你必须自己移动标签。 PR 将其更改为与库和文档保持一致,您必须将相同的数据传递两次。