Transformer-XL:语言建模的输入和标签
Posted
技术标签:
【中文标题】Transformer-XL:语言建模的输入和标签【英文标题】:Transformer-XL: Input and labels for Language Modeling 【发布时间】:2020-09-16 01:01:33 【问题描述】:我正在尝试为语言建模任务微调预训练的 Transformer-XL 模型transfo-xl-wt103
。因此,我使用模型类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
参数:
标签(:obj:
torch.LongTensor
形状为 :obj:(batch_size, sequence_length)
,optional
,默认为 :obj:None
): 语言建模的标签。 请注意,模型内部的标签移动,即您可以设置lm_labels = input_ids
那么参数lm_labels
是怎么回事?我只看到在forward
方法中定义的labels
。
当标签在模型内部“移动”时,这是否意味着我必须通过 data
两次(另外而不是 targets
),因为它在内部移动了?但是模型如何知道下一个要预测的标记呢?
我还阅读了this bug 和this pull request 中的修复,但我不太明白现在如何处理模型(修复之前与修复之后)
提前感谢您的帮助!
编辑:Link 在 Github 上发布
【问题讨论】:
【参考方案1】:这听起来确实像是另一个模型约定的错字。您确实必须将数据传递两次,一次传递给input_ids
,一次传递给labels
(在你的情况下,两者都传递[1, ... , 8]
)。然后模型将尝试从[1, ... , 7]
预测[2, ... , 8]
)。我不确定在目标张量的开头添加一些东西会起作用,因为这可能会导致以后的大小不匹配。
通过两次是在转换器中执行此操作的默认方式;在上述 PR 之前,TransfoXL
没有在内部转移标签,您必须自己转移标签。 PR 将其更改为与库和文档一致,您必须将相同的数据传递两次。
【讨论】:
以上是关于Transformer-XL:语言建模的输入和标签的主要内容,如果未能解决你的问题,请参考以下文章