Rasa实战:构建开源对话机器人
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2.1 现代自然语言处理发展简史

在2013年之前,自然语言处理(Natural Language Processing, NLP)方法基于下述两个问题一直无法统一。

第一个问题是如何在计算机中表示文本信息。在计算机中,语音等时序数据可以表示为波形,图像可以用像素位置和像素值来表示,而文本并没有一个直观的量化表示方法。用独热编码(one-hot encoding)表示每一个词或字,以及使用词袋模型(bag-of-words)表示句子或段落的方法很原始,缺点很明显。独热编码中的向量维度大小是整个词库的大小,但仅在词对应的位置其值为1,而其他位置的值全为0,这样的稀疏向量既浪费了大量空间,又没有直观的表现能力。而且每两个词之间永远是正交关系(也就是相互独立),丧失了词语本身的语义信息(语义相近的词语在表示形式上也应该接近)。词袋模型则简单统计文本中出现的词频,完全忽略了词语之间的依赖和顺序关系,从而无法准确地表示文本语义。例如,词袋模型无法区分“李雷的儿子是谁”和“谁的儿子是李雷”,但这两句话的语义差异明显。

第二个问题是如何为文本建模。传统的方法大多依赖于人工特征工程,如用TF-IDF(Term Frequency-Inverse Document Frequency)以词频的方法来表征词语的重要性,用主题模型(topic modeling)来根据统计的信息判断文档主题和每个主题的比例,以及用很多语言学信息人工建造特征。以一个关系提取的工具包IEPY(Information Extraction in Python)为例,下面是该工具包的构造特征的列表。

● number_of_tokens.

● symbols_in_between.

● in_same_sentence.

● verbs_count.

● verbs_count_in_between.

● total_number_of_entities.

● other_entities_in_between.

● entity_distance.

● entity_order.

● bag_of_wordpos_bigrams_in_between.

● bag_of_wordpos_in_between.

● bag_of_word_bigrams_in_between.

● bag_of_pos_in_between.

● bag_of_words_in_between.

● bag_of_wordpos_bigrams.

● bag_of_wordpos.

● bag_of_word_bigrams.

● bag_of_pos.

● bag_of_words.

在得到这些特征之后,传统的方法会使用一些传统机器学习模型建模。IEPY提供了以下几种分类模型。

● Stochastic Gradient Descent.

● Nearest Neighbors.

● Support Vector Classification.

● Random Forest.

● AdaBoost.

传统的NLP应用,往往就是使用以上的方法来解决实际问题的。我们稍后会看到Rasa对意图识别问题的解决方法是类似的。这种方法的好处是训练速度快、对标注数据量要求少、对简单问题的解决效果不错,缺点是需要大量人工特征处理和模型调参,对一些复杂多变的语境束手无策。

2013年,Tomas Mikolov发表了2篇论文,一篇提出了CBOW(Continues Bag of Words)和skip-gram模型,另一篇提出了集中优化训练的方法。之后word2vec工具被开源了。

word2vec优美地解决了第一个问题,用一个浅层神经网络,在大规模语料上进行训练,通过每个词语上下文的联系,将文本的语义嵌入一个强大又神秘的稠密向量,即词向量之中。这种方法被称为词嵌入(word embedding)。词向量的强大在于词向量蕴含了词语本身的语义信息,可以进行king-man+woman=queen这样的操作;词向量的神秘在于人们并不知道词向量的每一维究竟是什么含义,因此这种语义被称为隐语义(latent semantic)。

这基本开创了一个新的时代。word2vec之后,文本处理的第一步都是将词语转为词向量;近年在计算机图像领域大放异彩的深度学习模型很自然地被引入文本处理的建模过程中,替代传统机器学习模型成为解决第二个问题的利器。海量语料训练的词向量作为输入,深度学习作为模型,成了解决大量NLP问题的标配方案。

word2vec和词向量的发明使得原来只能独热编码的词语变成了稠密、神秘、优美且表现力丰富的向量,NLP从烦琐的语言学特征中跳出来,一举推动了深度学习在NLP领域中大展身手。这种表示学习(representation learning)的风潮,现在已经刮到了知识图谱(使用graph embedding技术)和推荐系统(使用user/item embedding技术)等领域。

虽然word2vec在NLP任务上的效果有明显提升。但很快,NLP研究人员发现了word2vec的缺点:实际上,同一个词在不同的上下文中具有不同的含义(例如,“植物从土壤中吸收水分”和“他的话里有很大的水分”中的“水分”一词的语义显然是不同的),但无论上下文如何,word2vec给出的向量表示都是唯一的、静态的。那么为什么我们不根据当前上下文给出一个词的向量呢?这种新技术就是上下文词嵌入。引入上下文词嵌入的早期模型有著名的ELMo(Embeddings from Language Model)。ELMo不对每个词使用固定的词向量,而在为每个词分配向量之前查看整个句子,使用在特定任务上训练的双向LSTM(Long Short-Term Memory)来创建这些词向量。LSTM是一种特殊的RNN(Recurrent Neural Network),可以学习长程依赖(long term dependency,存在依赖关系的点之间距离过大)。ELMo在各种问题上表现良好,成为基于深度学习的NLP算法的核心组件。

transformer模型于2017年发布,在机器翻译任务上取得了惊人的成绩。transformer在架构中没有使用LSTM,而使用了很多注意力(attention)机制。注意力机制是一种将查询(query)和一组键值对(key/value)映射到输出的函数。注意力机制输出的值是加权和,其中每个值的权重由查询的函数和值的相应键计算。一些NLP研究人员认为,transformer使用的注意力机制是LSTM的更好替代方案。他们认为注意力机制比LSTM更好地处理了长程依赖,具有非常广阔的应用前景。transformer在架构上采用编码器-解码器(encoder-decoder)结构。编码器和解码器在结构上高度相似,但在功能上不尽相同。编码器由N个相同的编码器层组成。解码器由N个相同的解码器层组成。编码器层和解码器层都使用注意力机制作为核心组件。

transformer的巨大成功吸引了众多NLP科学家的兴趣。他们在transformer的基础上开发了更多优秀的模型。在这些模型中,有2个非常著名和重要的模型:GPT(Generative Pre-trained Transformer)和BERT(Bidirectional Encoder Representations from Transformers)。GPT完全由transformer的解码器层组成,而BERT完全由transformer的编码器层组成。GPT的目标是生成类似人类的文本。到目前为止,GPT已经开发了3个版本,分别是GPT-1、GPT-2和GPT-3。GPT-3生成的文本质量非常高,非常接近人类水平。BERT的目标是提供更好的语言表示方法,帮助广泛的下游任务(sentence pair classification任务、single sentence classification任务、question answering tasks、single sentence tagging任务)取得更好的结果。当时,BERT模型在各种NLP任务上达到了先进的水平,并且在许多任务上大大提升了现有行业的最佳水平。现在BERT衍生出了一个庞大的家族,其中比较知名的有XL-Net、RoBERTa、ALBERT、ELECTRA、ERNIE、BERT-WWM、DistillBERT等。