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 = 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 参数:

标签(: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:语言建模的输入和标签的主要内容,如果未能解决你的问题,请参考以下文章

Transformer-XL论文解读

xlent

xlent

NLP-16Transformer-XL

如何在使用 ONNX 推理会话时通过传递“标签”来获得语言建模损失?

Verilog门级建模