随着深度学习的发展,递归神经网络(RNN和LSTM)和卷积神经网络(CNN)等神经网络结构已经完成了自然语言处理(NLP)的大部分任务,它在文本分类、语言建模、机器翻译等性能上都有了很大的提高。
然而,与计算机视觉(Computer Vision)中的深度学习性能相比,自然语言处理的深度学习模型的性能就差强人意了。
原因之一在于缺少大型带标记的文本数据集。目前,大多数带标记的文本数据集对于自然语言处理的深度学习模型来说都不够“大”,不足以训练深度神经网络,因为深度神经网络的参数量很大,如果在小数据集上训练这样的网络会导致过拟合。
- (对于过拟合的概念解释有很多,小编这里摘来《数据挖掘-概念与技术》中的解释便于大家理解,“即在机器学习期间,它可能并入了训练数据中的某些特殊的异常点,这些异常不在一般数据集中出现。”)
- (overfittingt是这样一种现象:一个假设在训练数据上能够获得比其他假设更好的拟合,但是在训练数据外的数据集上却不能很好的拟合数据。此时我们就叫这个假设出现了overfitting的现象。出现这种现象的主要原因是训练数据中存在噪音或者训练数据太少。)
除此之外,自然语言处理落后于计算机视觉发展的另一个重要原因是它缺乏迁移学习(transfer learning)。要知道,迁移学习在计算机视觉深度学习中发挥了重要作用。借助Imagenet等大型标记数据集的强可用性,基于CNN的深度模型训练成为可能——目前,这些大型标记数据集已经被广泛用作于计算机视觉任务的预训练模型了。
而在自然语言处理的深度学习上,直到2018年谷歌提出Transformer模型,NLP深度学习才算有了新的飞跃。
本文将通过实际演示来解释如何调整BERT来进行文本分类(Text Classification),包括以下几个部分:
- 自然语言处理中的迁移学习
- 模型微调(Model Fine-Tuning)是什么意思?
- BERT简介
- 【实际演示】微调BERT来对垃圾邮件进行分类
1.自然语言处理中的迁移学习
迁移学习是一种将深度学习模型在大数据集里训练,然后在另一个数据集上执行类似任务的技术。我们称这种深度学习模型为预训练模型(Pre-trained Models)。
预训练模型最著名的例子是在ImageNet数据集里训练的计算机视觉(Computer Vision)深度学习模型。解决问题的最好方式是使用一个预先训练好的模型,而不是从头开始构建一个模型。拿日常工作和生活举例,想必大家为了顺利甚至完美地提案,一定会提前不断地进行准备和模拟吧?迁移学习是一个道理。
随着近年来自然语言处理的发展,迁移学习成为了一种可行的选择。
NLP中的大部分任务,如文本分类、语言建模、机器翻译等,都是序列建模任务(Sequence Modeling tasks)。这种传统的机器学习模型和神经网络无法捕捉文本中出现的顺序信息(sequential information)。因此,人们开始使用递归神经网络(RNN和LSTM),这些结构可以建模文本中出现的顺序信息。
然而,递归神经网络也有局限,其中的主要问题是RNNs不能并行化(parallelized),它们一次只能接受一个输入。对于文本序列,RNN或LSTM每次输入只能接受一次切分(Token),即逐个地传递序列。如果在一个大数据集里训练这样一个模型会花费很多时间。
水涨船高的时间成本使在NLP里使用迁移学习的呼声不断,终于,在2018年,谷歌在《Attention is All You Need》一文中介绍了Transformer模型,这个模型成为了NLP深度学习的里程碑。
很快,基于Transformer的NLP任务模型又多又快地发展起来。
使用Transformer的模型有很多优点,其中最重要的以下两点——
- 这些模型不是单个切分地处理输入的序列,而是将整个序列作为一次输入——这对于基于RNN的模型来说是一次速度的飞跃,因为这意味着现在模型可以靠GPUs加速了!
- 我们不需要标记数据来预训练这些模型了——我们只需要提供大量未标记的文本数据来训练基于Transformer的模型。然后我们可以将这个训练模型套用在其他NLP任务中,如文本分类(Text Classification)、命名实体识别(Named Entity Recognition)、文本生成(Text Generation)等。这就是在自然语言处理中迁移学习的工作方式。
BERT和GPT-2是当下最流行的基于Transformer的模型,
而在本文中,我们将重点关注BERT并学习如何使用预先训练好的BERT模型来执行文本分类。
2. 模型微调(Model Fine-Tuning)是什么意思?
BERT(Bidirectional Encoder Representations from Transformers)是一个具有大量参数的大型神经网络架构,其参数量可以从1亿到3亿多个。所以,在一个小数据集上从零开始训练BERT模型会导致过拟合。
所以训练BERT模型需要从大型数据集开始,然后使用相对小的数据集上进行再训练模型,这个过程被称为模型微调(Model Fine-Tuning)。
模型微调的几种方法:
- 训练整个架构:我们可以在(相对较小的)训练数据集上的进一步训练整个预训练模型,并输出到softmax层。这种方法会让误差在整个架构中反向传播,并且模型的预训练权重会根据新的数据集进行更新。
- 训练部分层,同时冻结其他层:另一种使用预训练模型的方法是部分训练。我们保持保持模型初始层的权重不变,而只对更高层进行再训练。这种方法需要我们自己尝试需要冻结多少层,训练多少层。