BERT用于时间序列分类

4
我想在时间序列数据上训练一个变压器编码器(例如BERT),用于可以建模为分类的任务。在谈到我面临的问题之前,让我简要描述一下我正在使用的数据。
我正在使用90秒窗口,每秒有100个值(即大小为100的90个向量)。我的目标是预测二进制标签(0或1)对于每一秒钟(即生成长度为90的最终0和1向量)。
我的第一个想法是将其建模为多标签分类问题,在其中我将使用BERT生成大小为90的带有0和1之间数字的向量,并使用nn.BCELoss和groundtruth标签(y_true看起来像[0,0,0,1,1,1,0,0,1,1,1,0 ..., 0])进行回归。一个简单的类比是将每一秒钟视为“单词”,而我可以访问的100个值作为相应的“单词嵌入”。然后的目标是在这些100维嵌入的序列上从头开始训练BERT(所有序列长度都相同:90)。
问题:当处理文本输入时,我们只需将CLS和SEP标记添加到输入序列中,然后让令牌化程序和模型完成其余工作。当直接在嵌入上训练时,我们该怎么做才能考虑到CLS和SEP标记?
我想到的一个想法是在位置0添加一个100维嵌入,代表CLS标记,以及在位置90 + 1 = 91上添加一个100维嵌入,代表SEP标记。但我不知道我应该使用哪些嵌入来表示这两个标记。而且我也不确定这是一个好的解决方案。
有什么想法吗?
(我尝试在Huggingface论坛上问过这个问题,但没有得到任何回应。)

我投票关闭此问题,因为它与[帮助中]定义的编程不相关,而是涉及ML理论和/或方法 - 请参见machine-learning [标签信息](https://stackoverflow.com/tags/machine-learning/info)中的介绍和**注意事项**。 - desertnaut
1个回答

11
虽然HuggingFace非常适合NLP,但我不建议在任何时间序列问题上使用它。关于令牌,没有理由使用CLS或SEP,因为你不需要它们。最简单的方法是以(batch_size,seq_len,n_features)格式提供模型数据,然后让它预测(batch_size,seq_len),在这种情况下,它看起来像(batch_size,90,100),并返回一个形状为(batch_size,90)的张量,除非你认为窗口之间存在时间依赖性。在这种情况下,您可以使用滚动历史窗口。其次,我建议您查看一些论文,transformer for time series.讨论了这个问题。
如果您正在寻找包括变压器的时间序列库,请查看Flow Forecasttransformer time series prediction,了解使用变压器处理时间序列数据的实际示例。

太棒了,感谢详细的回答和参考资料!我同意你所说的,我真正想要/需要的是一个自注意力编码器(+ 如果我将来想尝试将此任务建模为序列预测任务,则可能需要一个自注意力解码器)。 - clems

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接