一段时间以来,使用机器学习的 NLP 任务借助 BERT(Bidirectional Encoder Representations from Transformers)模型被认为是当前的黄金标准。这些模型通常用于我们日常的许多语言处理任务,比如谷歌搜索自动补全等。然而,我们会怀疑 BERT 模型是否是所有语言处理任务的最佳选择?
我们使用 imdb 电影评论数据集并执行情感分析以确定电影评论的相应评级。我们对不同模型可实现的精度进行了探索性估计,并尝试探索在模型大小、训练时间及其相应精度之间进行适当权衡的想法。目的是用不太复杂的模型以更快的速度完成更简单的任务,从而获得可比较的结果。
本文所有代码已上传至 我的GitHub,可自行下载。
目前最流行的以 NLP 为目的的方法,它可以为句子预测、情感分析、聊天机器人回复、文本摘要等不同的任务实现一些真正令人难以置信的准确度。BERT 的核心是一个具有可变数量的转换器语言模型编码器层和自注意力头。这使模型能够执行上下文化的单词嵌入,从而在嵌入中保留更多含义。两种主要的 BERT 模型是 B E R T b a s e BERT_{base} BERTbase 和 B E R T L a r g e BERT_{Large} BERTLarge,它们的架构如下图所示:
从上图可以看到,即便是基本模型,可训练参数的数量也非常大。尽管该模型可能具有很高的准确性,但仍会占用大量资源。因此,我们使用 BERT small 处理任务,该模型与其他模型之间更具可比性,其训练时间和我们希望与之进行比较的其他模型相似。
我们选择模型的目标准确度是 85%,这是通过一个相对较小的 BERT 模型实现的,该模型具有 4 个 transformer blocks、隐藏层大小为 512 和 8 个 attention heads。
测试集的评估精度为 85.5%,训练时间大约 30 分钟。我们尝试使用几种不同的模型和方法来达到与该值相当的精度。需要注意的是,其他模型不使用上下文嵌入,这对特定用例来说并不重要,因为决定电影质量的关键词对上下文的依赖性很小。
简单的模型可以节省时间和计算资源,这取决于实际的项目。因此,我们首先用朴素贝叶斯模型进行比较,我们使用该模型将文本分类为正面或负面评论。朴素贝叶斯是最直接、最快速的分类算法之一,已成功用于各种 NLP 任务,尤其是垃圾邮件过滤和文本分类。它是一种监督学习算法,使用贝叶斯定理来预测未知类别。它是 朴素的,因为它假设每对特征(在我们的例子中是单词)之间的条件是独立的。
在人类自然语言中,单词的集合、频率,尤其是单词的顺序传达了上下文信息(例如,“好” 和 “不好” 之间的含义差异)。尽管有条件独立性的假设,朴素贝叶斯通常有很高的准确性。在我们的例子中,电影评论的正面或负面影响往往依赖于几个关键词(惊人的、糟糕的、优秀的等)的语义内容,而不是上下文词序,这使它成为朴素贝叶斯模型的合适任务。
由于文本预处理对 NLP 结果有很大影响,我们按照标准进行文本清洗(使结果仅包含单词)、使用 NLTK 进行单词标记化、删除停用词(包括特定于数据集的自定义停用词,如 “电影” 和 “电影”),以及名词和动词的词形还原。在这里,我们使用了词袋(BOW)向量化方法,将文本转换为词频。在创建了整个语料库中最常用词的列表后,我们为每条评论创建特征集,用以表明每个最常用词是否出现在评论中。这些特征集被输入到 NLTK 朴素贝叶斯分类器(训练时间 < 5 < 5 <5 秒)。使用该输入,我们模型的执行准确度为 83 % 83\% 83%,正分类和负分类的准确度分别为 87 % 87\% 87% 和 90 % 90\% 90%。 NLTK 朴素贝叶斯分类器还提供了一种方法来查看模型中信息量最大的词,对于本任务来说,这些词分别是 “低估”、“荒谬” 和 “无趣”。
虽然这些结果相当不错,但这种方法受到训练语料库中单词的限制。然而,对于文本的基本二元分类,NLTK 朴素贝叶斯分类器可能是一个很好的起点。
Word2Vec 算法使用神经网络模型从大量文本中学习单词关联。一旦经过训练,模型可用于检测同义词、为句子建议补全的词。 Word2Vec 用特定数字列表来表示每个不同的单词。这些向量是经过仔细选择的,比如一个简单的数学函数(向量之间的余弦相似度)就可以指示这些向量表示的单词之间的语义相似度水平。
Word2Vec 预训练模型与双向递归神经网络一起使用,以便为我们的深度学习模型训练提供词嵌入。Gensim 提供对 Word2Vec 的支持,具有不同的可用嵌入长度,并根据使用的训练数据集进行区分。对于我们的用例,我们使用嵌入长度为 100 的维基百科预训练模型(glove-wiki-gigaword-100
)。
在矢量化之前,同朴素贝叶斯方法执行的预处理一样,使用 NLTK 对数据集进行预处理(删除停用词、词形还原等),然后填充到 200 个单词的长度,这足以分析影评的整个要点。神经网络由双向 LSTM 层和一些密集层(Dense)组成,使用 Adam 优化器,并测试了几个学习率,获得了大约 80 % 80\% 80% 的准确率。可以对模型进行进一步的改进,但我们选择尝试 CNN 作为更直接的比较。
这是先前模型的变体,它使用一维卷积神经网络(CNN)和相同的预训练 Word2Vec 模型。选择的嵌入长度和填充长度相同,分别为 100 100 100 和 200 200 200。与 RNN 模型相比,Conv1d 模型的训练参数更少,因此训练速度更快。然而,该模型在训练期间容易过拟合,通过调整学习率和添加 d r o p o u t dropout dropout 层来进行优化。此外,正则化项(regularisers)也用于 CNN 以防止过拟合。该模型能够达到与 BERT 模型相似的 85.6 % 85.6\% 85.6% 的准确度,但训练时间大幅减少。
为了尝试进一步提高速度,利用基于标记器(tokenizer)的嵌入来代替以前使用的 Word2Vec 模型。 Tokenizer 同样是将文本语料向量化,通过将每个文本转换为整数序列(每个整数是字典中标记的索引)或转换为向量,其中每个标记的系数可以是二进制的(One-Hot),基于词频(BOW)等。标记化序列同样填充到长度为 200 个单词,以使结果与之前的模型具有可比性。 CNN 模型本身与我们之前的模型相同,带有正则化项和 d r o p o u t dropout dropout 层。
这种方法在测试集上的准确率为 86 % 86\% 86%,而且该模型也是训练速度最快的。这表明,如果我们的模型非常适合任务,那么最简单和最快的模型能以与复杂的预训练模型相当的精度完成相同的任务。
在 LSTM 模型上实施 C L R CLR CLR(Cyclical Learning Rates for Training Neural Networks, Leslie N. Smith 2017)发现了一个有趣的改进。 Adam 优化器是一种相当复杂的算法,但与许多其他自适应优化器一样,它仍然存在一些弱点。在训练过程中,当 Adam 遇到鞍点(saddle point)时,学习变得更加困难,因为梯度损失趋于零,降低了模型参数的更新速度。 CLR 为这个问题提供了解决方案:循环增加鞍点附近的学习率,产生有益的学习过程加速,在自适应优化器确定的方向上跳离鞍点很远。在使用 RMSprop 和 SGD Nesterov 测试了 CLR 性能后,Adam 表现出了更好的性能。
使用前面提到的相同 LSTM 模型,使用 C L R CLR CLR,我们实现了 87 % 87\% 87% 的准确率。由于训练速度更快,我们能够在不到一分钟的时间内在整个数据集上达到这种准确度。
由前文的比较可知,虽然复杂的模型确实为我们在特定任务上提供了较高的准确性,但这样做并不总是符合我们的最佳利益。必须为任务仔细选择机器学习模型,以在资源使用和准确性之间提供最佳权衡,寻求最佳准确性并不总是理想的选择。
后续我将结合代码对每一种方法进行详细地介绍,敬请关注!