NLP模型应用之一:基础知识
NLP 模型应用之一:基础知识
#自然语言处理
引入
2018 年底发布的 BERT 模型和 2019 年初发布的 GPT-2 模型,开始挑战人类的语言处理能力。二者都基于之前介绍过的 Transformer 基础模型。
对模型的研究有几个层次:研究基础模型、扩展模型、应用模型
- 研究基础模型 我们熟知的卷积神经网络 CNN,循环神经网络 RNN,Transformer 模型,残差网络 ResNet 等等,都是底层模型,它们是神经网络应用的基础。
- 扩展模型 基础模型需要经过适配和扩展,才能应用到更多领域。如图像识别一开始主要支持图片分类,而后扩展到人脸识别、图像分割等等领域。在自然语言处理领域 Transformer 模型最初被用于解决翻译问题,而后扩展到解决问答、判断一致性、完型填空等问题之中,比如 BERT 通过 Mask 遮蔽技术优化了自然语言处理中的更多问题的解决方法。
- 应用模型 再上层是针对某一个领域的具体应用和细化,调用模型解决问题并调优模型。例如使用模型判断正常和病变细胞、预测股票趋势,使用预训练好的语言模型撰写某种类型的文章……这些大多是由工程师完成的工作。从算法角度看创新并不多,但是涉及一些领域相关知识,甚至包括怎么定义问题,描述问题,与模型结合,相对偏重应用,也是软件工程师比较擅长的领域。
有监督学习和无监督学习
传统的深度学习在解决某个问题时都需要大量数据反复训练,在数据量和算力足够的情况下,直接训练模型效果更好。但在很多实际应用中,却很难实现。比如:在医学诊断中使用机器视觉技术时,需要大量标注好的正例和反例,反复训练,实际情况是有问题的病例只占少数,评价函数将使模型偏向大多数正常;且标注起来非常困难,从一个 300M 的图像上标注出所有异常细胞的难度和人工成本可想而知。
人类解决此问题时,只需要了解正常细胞与异常细胞形状、大小等重要特征的差异即可判断。这是由于人的常识系统,可从图像中提取出形状、颜色等信息。于是人们致力于开发类似人类的常识系统,希望从相关的任务中学习,通过大量数据和训练形成机器的知识体系,在解决具体问题时,只需要少量训练,即可正常工作。
零样本学习
零样本学习 Zero-shot Learning 指的是之前没接触过某一类别的训练样本,但通过在实际目标和训练目标之间建立映射关系,实现识别该类别的功能。比如:之前没见过老虎,但是照猫画虎也能对老虎有大致了解,在判断过程中更容易把老虎和桌子、香蕉区分开来。
单样本学习 One-shot Learning,少量样本学习 Few-shot Learning 也与之类似,它们针对的都是只有少量正例或者单个正例的情况下的学习问题,实际上是一种普遍规则到特殊规则的映射。
ELMo、GPT、BERT 和 GTP-2 的目标都是使用大量无标签语料预训练模型,然后用有标签的小数据调优模型。GPT-2 主要针对零样本学习,挑战近似无监督学习的问题,后面可以看到,它通过对海量数据的训练生成了常识系统。
半监督学习
由于神经网络是一种有监督学习模型,必须有特征 x 和目标 y,才能使用误差函数比较实际目标 y 与预测值 y’的差异,反向传播误差来调整参数。接下来的问题是,如何使用无标签的语料来训练模型?
最基本的方法是利用前面的 N 个词预测后面的第 N+1 个词,比如:通过序列的前三个元素“白日依”,预测第四个元素“山”是最基本的处理方法,也是 GPT 模型使用的预训练方法。
进而,随机屏蔽序列中的某一元素,如“山”,然后通过它的前文和后文共同预测出该位置的元素。
自然语言处理问题中,一般先利用无标签数据按上述方法训练基础模型,然后再用针对具体问题的少量有标签数据进一步训练最终的模型。
迁移学习
迁移学习 Transfer learning 指把训练目标 A 的模型作为基础,通过进一步训练,实现对目标 B 的预测。迁移学习有两种方式:
- 使用模型提取特征 使用已有模型提取特征作为新模型的输入,这样不一定需要算力强大的 GPU,训练上百层的神经网络,也能实现很好的效果。在自然语言处理中,常用训练好的模型提取词向量(词义)或者网络某些层的输出作为特征,比如通过训练把词的索引号转换成一系列的属性值,从而比较两词的相互关系,如得到 Play 的近义词 playing, game, games, played, players 等等。
- 预训练和微调 预训练 Pretrain 加微调 Fine-tuning 是目前主流的解决方案,先用大量的普通数据训练模型获取一般性知识 Pretrain,再在小的目标数据集上调优 Fine-tuning。它既能使用别人训练好的成熟模型,又能有针对性的解决问题。Pretrain+Finetuning 的问题在于预训练与调优需要同样形式的数据,比如,解决感情色彩分类的问题,BERT 的方法是:前期使用大量的无标签文本训练时也在序列开头预留一个 CLS 位,用于可能处理的分类问题。
两种方式各有利弊,提取特征方法更加灵活,可以处理更多不可预知的问题类型,Pretain+Finetuning 能更好地利用模型中学到的知识。
自然语言评测
自然语言常使用 GLUE 和 SquAD 测试,来评价模型的效果。这些测试基本涵盖了自然语言处理领域的常见问题类型。
QLUE 全称是 General Language Understanding Evaluation,它涉及自然语言处理的各个子模块,QLUE 不公开测试集结果,开发者上传预测结果后,它给出评分。包括十一项测试,如:
- MNLI:判断两个句子间是继承,反驳,中间关系(双句,分类)
- QQP:两个问句的类似程度(双句,分类)
- QNLI:问答系统,区分问题的正确答案和同一段中的其它描述(双句,分类)
- SST-2:电影评论的感情色彩标注(单句,分类)
- CoLA:判断语法是否正确(单句,分类)
- STS-B:语义相似度打分(1-5 级)(双句,分类)
- MRPC:两句语义是否等价(双句,分类)
- RTE 识别继承关系,类似 MNLI,但数据集较小(双句,分类)
SquAD 全称 The Standford Question Answering Dataset,它是斯坦福大学于 2016 年推出的阅读理解数据集,给定一篇文章,准备相应问题,需要算法给出问题的答案。一共有 107,785 问题,以及配套的 536 篇文章。与 GLUE 的分类不同,它寻找的是一个答案在段落中的位置。
自然语言评测包含几种任务:判断句与句之间的关系,分类和标注,在后续的 BERT 部分将介绍具体的实现方法。