这也许很傻,但是我想知道是否应该执行传统的文本预处理步骤来训练一种变压器模型?
我记得为了训练一个Word2Vec或手套,我们需要执行广泛的文本清理,比如:标记、删除停止词、删除标点符号、词干或词尾化等等。然而,在过去的几天里,我快速地跳到了转换器模型(顺便说一下),并且我注意到这些模型中的大多数都有内置的令牌器(酷),但是没有一个演示、示例或教程正在执行这些文本预处理步骤。例如,您可以以快-伯特为例,演示不涉及文本预处理(可能只是一个演示),但在推理,所有的句子都是在不进行任何清理的情况下通过的:
texts = ['I really love the Netflix original movies',
'this movie is not worth watching']
predictions = learner.predict_batch(texts)原变压器 by HuggingFace的情况也是如此。或者我看过的许多教程(比如这或另一个)。我可以想象,根据任务的不同,这可能是不需要的,例如下一个工作预测或机器翻译等等。更重要的是,我认为这是这些模型提供的基于上下文的方法的一部分(可以说,这是一种创新),目的是保留大部分文本,我们可以获得每个标记的最小但仍然很好的表示(在词汇之外)。借自中篇的HuggingFace:
基础,未加修饰使用30522个单词的词汇表。标记化的过程包括将输入文本拆分为词汇表中可用的标记列表。为了处理词汇表中不可用的单词,BERT使用了一种称为基于BPE的WordPiece标记化技术。在这种方法中,一个词汇外的单词被逐步地分成子词,然后这个词由一组子词表示。由于子词是词汇的一部分,我们已经学习到表示这些子词的上下文,而单词的上下文只是子词上下文的组合。
但是,对于像多标签文本分类这样的任务,这是正确的吗?在我的用例中,文本充满了无用的句号、标点符号、字符和缩写,正如前面提到的那样,它是多标签文本分类。而实际上,预测精度并不高(经过几轮快-伯特训练后)。我在这里错过了什么?
发布于 2020-06-20 13:30:44
您可以做的一个快速实验是,一次执行通常所做的预处理步骤,然后将其提供给模型并获得结果。并将数据集按原来的方式提供给模型,以比较差异。
根据我的经验,做预处理不会有任何不同,根据数据集,它给了我大约1%的精度差异(不是很大的变化)。
当这些模型被训练时,不进行预处理,因为他们想要学习各种句子的上下文。
您的结果不够好的原因可能是因为您的标签分布。大多数情况下,数据集只填充一个或两个标签,而其他标签只占数据集的一小部分。如果是这样的话,您可能需要研究过采样的解决方案。
发布于 2021-09-04 00:31:43
正如我所理解的,您不需要进行预处理,原因是转换器对不相同的单词进行内部“动态”嵌入;相反,由于位置编码,坐标会根据被标记的句子而变化。
注意与Word2Vec、GloVe或Fastext方法的区别,其中嵌入矩阵沿整个字典固定。
话虽如此,举个例子:
当建造嵌入物时,
在我看来,那是变压器的真正力量。
在任何情况下,做两个实验并根据结果做出决定不会有什么害处,现在转移学习已经存在了!
https://datascience.stackexchange.com/questions/62862
复制相似问题