首页 > 解决方案 > Transformer-XL:语言建模的输入和标签

问题描述

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

为了迭代我的数据集,我使用LMOrderedIterator文件tokenization_transfo_xl.py中的 ,它为每个批次(以及序列长度)产生一个带有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参数:

标签(:obj: torch.LongTensorof shape :obj: (batch_size, sequence_length), optional, 默认为 :obj: None):语言建模的标签。请注意,标签在模型内部移动,即您可以设置lm_labels = input_ids

那么参数是什么lm_labels?我只在方法中看到labels定义。forward

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

我还通读了这个错误和这个拉取请求中的修复,但我不太明白现在如何处理模型(修复之前与修复之后)

提前感谢您的帮助!

编辑链接到 Github 上的问题

标签: huggingface-transformerslanguage-model

解决方案


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

传递两次是在转换器中执行此操作的默认方式;在上述 PR 之前,TransfoXL没有在内部转移标签,您必须自己转移标签。PR 将其更改为与库和文档一致,您必须将相同的数据传递两次。


推荐阅读