我正试图为语言建模任务完善经过预先训练的Transformer模型transfo-xl-wt103。因此,我使用模型类TransfoXLLMHeadModel。
为了迭代我的数据集,我使用来自文件LMOrderedIterator的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 for :obj:(batch_size, sequence_length),optional,默认为:obj:None):语言建模标签。注意,标签在模型中移动了,即您可以设置lm_labels = input_ids
那么参数lm_labels是什么呢?我只看到在labels方法中定义的forward。
当标签在模型中“被移动”时,这是否意味着我必须通过data两次(另外而不是targets),因为它在内部移动了?但是,这个模型是如何知道下一个要预测的令牌的呢?
我还阅读了这只虫子和此拉请求中的修复,但我不太明白现在该如何对待模型(在修复之前还是之后)
提前感谢您的帮助!
编辑:链接发布在Github上
发布于 2020-06-01 22:07:43
这听起来确实像是另一位模特的惯例中的错误。您确实需要两次传递数据,一次是input_ids,一次是labels (在您的例子中,两者都是[1, ... , 8] )。然后,该模型将尝试从[2, ... , 8]中预测[1, ... , 7])。我不确定在目标张量开始时添加一些东西是否有效,因为这很可能会导致后面的尺寸不匹配。
在变压器中传递两次是默认的方法;在前面提到的PR之前,TransfoXL没有在内部移动标签,您必须自己移动标签。PR将其更改为与库和文档一致,在库和文档中,您必须两次传递相同的数据。
https://stackoverflow.com/questions/62069350
复制相似问题