Transformer 模型中文本分类的预处理(BERT 变体)

数据挖掘 Python nlp 预处理 伯特 变压器
2021-10-06 07:37:54

问这个问题可能很愚蠢,但我想知道是否应该执行传统的文本预处理步骤来训练其中一个转换器模型?

我记得在训练 Word2Vec 或 Glove 时,我们需要执行广泛的文本清理,例如:标记化、删除停用词、删除标点符号、词干或词形还原等等。然而,在过去的几天里,我快速进入了 Transformer 模型(顺便说一句很着迷),我注意到这些模型中的大多数都有一个内置的标记器(很酷),但是没有演示、示例或教程正在执行任何这些文本预处理步骤。例如,您可能会采用fast-bert,演示中不涉及文本预处理(也许它只是一个演示),但在推断时,整个句子在没有任何清理的情况下通过:

texts = ['I really love the Netflix original movies',
         'this movie is not worth watching']
predictions = learner.predict_batch(texts)

HuggingFace原始变压器也是如此。或者我看过的许多教程(拿这个另一个)。我可以想象,根据任务的不同,这可能不是必需的,例如下一个工作预测或机器翻译等等。更重要的是,我认为这是这些模型提供的基于上下文的方法的一部分(可以说是创新),旨在保留大部分文本,我们可以获得每个标记的最小但仍然很好的表示(词汇表中的单词)。借自HuggingFace 的中篇文章:

Tokenisation BERT-Base, uncased 使用 30,522 个单词的词汇表。标记化过程涉及将输入文本拆分为词汇表中可用的标记列表。为了处理词汇表中不可用的单词,BERT 使用了一种称为 BPE based WordPiece tokenisation 的技术。在这种方法中,词汇表外的单词被逐步拆分为子词,然后该词由一组子词表示。由于子词是词汇表的一部分,我们已经学习了这些子词的上下文表示,而单词的上下文只是子词上下文的组合。

但这适用于多标签文本分类等任务吗?在我的用例中,文本充满了无用的停用词、标点符号、字符和缩写词,它是前面提到的多标签文本分类。而且实际上预测准确率并不好(经过几轮训练后使用fast-bert)。我在这里想念什么?

2个回答

您可以做的一个快速实验是执行您通常执行的预处理步骤,然后将其提供给模型并获得结果。并且一旦将数据集按原样提供给模型以比较差异。

根据我的经验,预处理不会产生任何影响,根据数据集,它给了我或多或少 1% 的准确性差异(不是很大的变化)。

当这些模型被训练时,没有进行任何预处理,因为它们想要学习各种句子的上下文。

您的结果不够好的一个原因可能是您的标签分布。大多数情况下,数据集仅填充一个或两个标签,而其他标签只是数据集的一小部分。如果是这种情况,您可能需要研究过采样解决方案。

据我了解,您不需要进行预处理,原因是 Transformer 对每个单词都不相同的单词进行了内部“动态”嵌入;取而代之的是,坐标会根据被标记的句子进行更改,因为它进行了位置编码。

请注意与 Word2Vec、GloVe 或 Fastext 方法的区别,其中嵌入矩阵沿整个字典固定。

话虽如此,举个例子:

  • 这个客厅很无聊。

  • 房间里的这只熊很无聊。

在构建嵌入时,

嵌入(这个,第一句话)嵌入(这个,第二句)

在我看来,这就是变压器的真正力量。

无论如何,进行两个实验并根据结果做出决定不会有什么坏处,因为迁移学习已经出现了!