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 = 1
和 bptt = 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
有什么用呢?我只看到 labels
在 forward
方法中定义。
当模型内部的标签 "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 将其更改为与库和文档保持一致,您必须将相同的数据传递两次。
我正在尝试为语言建模任务微调预训练的 Transformer-XL 模型 transfo-xl-wt103
。因此,我使用模型 class TransfoXLLMHeadModel
.
为了遍历我的数据集,我使用文件 tokenization_transfo_xl.py 中的 LMOrderedIterator
,它为每个批次生成一个带有 data
及其 target
的张量(以及序列长度)。
让我们假设以下数据为 batch_size = 1
和 bptt = 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 setlm_labels = input_ids
那么参数lm_labels
有什么用呢?我只看到 labels
在 forward
方法中定义。
当模型内部的标签 "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 将其更改为与库和文档保持一致,您必须将相同的数据传递两次。