huggingface-transformers - 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.LongTensor
of shape :obj:(batch_size, sequence_length)
,optional
, 默认为 :obj:None
):语言建模的标签。请注意,标签在模型内部移动,即您可以设置lm_labels = input_ids
那么参数是什么lm_labels
?我只在方法中看到labels
定义。forward
当模型内部的标签“移动”时,这是否意味着我必须通过data
两次(另外而不是targets
),因为它在内部移动了?但是模型如何知道下一个要预测的标记呢?
我还通读了这个错误和这个拉取请求中的修复,但我不太明白现在如何处理模型(修复之前与修复之后)
提前感谢您的帮助!
编辑:链接到 Github 上的问题
解决方案
这听起来确实像是另一个模型约定的错字。您确实必须将数据传递两次,一次传递一次,一次传递input_ids
一次labels
(在您的情况下,[1, ... , 8]
两者都传递)。然后模型将尝试[2, ... , 8]
从[1, ... , 7]
) 进行预测。我不确定在目标张量的开头添加一些东西会起作用,因为这可能会导致以后的大小不匹配。
传递两次是在转换器中执行此操作的默认方式;在上述 PR 之前,TransfoXL
没有在内部转移标签,您必须自己转移标签。PR 将其更改为与库和文档一致,您必须将相同的数据传递两次。
推荐阅读
- c - 在 mac os x 上是否有 clang 识别的常量?
- android - 移动网络提供商阻止对 api 的 volley 请求
- reactjs - 如何在“react app 2”中设置 SCSS 文件(ViewEncapsulated 方式),如 Angular 组件特定的 SCSS?
- vue.js - 是否可以在 vueJS 中将数据从插槽组件传递到父级?
- python-3.x - 使用 GTK3 和 pycairo 的 Python3 动画
- react-native - undefined 不是评估 'this.props.dispatch 的函数
- python - 如何在没有 Pub/Sub 的情况下使用 Dataflow 将 Google Cloud Storage 存储桶流式传输到 Big Query
- excel - 无法从 url 中提取 id
- java - 将 jnetpcap 添加到 maven 失败
- google-apps-script - 使用 setValues 函数的问题