自然语言处理(NLP)发展历程(1),什么是自然语言处理?
一、什么是自然语言处理(NLP)首先先了解一下什么是自然语言,自然语言是人类社会发展过程中自然产生的语言,是最能体现人类智慧和文明的产物,也是大猩猩与人的区别(2019斯坦福cs224n,lesson1)。它是一种人与人交流的载体,像计算机网络一样,我们使用语言传递知识,人类语言产生是非常近的事情,大概是在10万年前,至于科学家怎么论证的,我也不清楚,但肯定不是敲着头盖骨化石问“爷爷,你当时会说话吗?”问出来的。据我猜测可能是根据书写文字的年代推断出来的,语言早于书写,书写出现在5000年前,例如大家所熟知的甲骨文距今约3600年(甲骨文发现于中国河南省安阳市殷墟,是商朝(约公元前17世纪-公元前11世纪)的文化产物,距今约3600多年的历史)。 语言是很神奇的东西,只需要短短几个符号,你就可以在脑海里重现一幅图,一个场景。语言是思维的载体,是人类交流思想、表达情感最自然、最直接、最方便的工具,人类历史上以语言文字形式记载和流传的知识占知识总量的80%以上。 而自然语言处理是一门计算机科学、人工智能、认知科学、信息论、数学及语言学的交叉学科。虽然语言只是人工智能的一部分(人工智能还包括机器学习、计算机视觉等),但它是非常独特的一部分。这个星球上许多生物都拥有超过人类的视觉系统,但只有人类才拥有这么高级的语言。图片来源–blog.wizeline.com
自然语言研究内容包括如下:•序列列标注:分词/POSTag/NER/语义标注这是最典型的NLP任务,比如中文分词,词性标注,命名实体识别,语义角色标注等都可以归入这一类问题,它的特点是句子中每个单词要求模型根据上下文都要给出一个分类类别。•分类任务:⽂文本分类/情感计算比如我们常见的文本分类,情感计算等都可以归入这一类。它的特点是不管文章有多长,总体给出一个分类类别即可。•句子关系判断:Entailment/QA/⾃自然语⾔言推理比如Entailment,QA,语义改写,自然语言推理等任务都是这个模式,它的特点是给定两个句子,模型判断出两个句子是否具备某种语义关系。•生成式任务:机器翻译/⽂文本摘要比如机器翻译,文本摘要,写诗造句,看图说话等都属于这一类。它的特点是输入文本内容后,需要自主生成另外一段文字。
自然语言处理的目标是让计算机处理或者说“理解”自然语言,用来完成有意义的任务,比如人工助手订购机票、机器翻译、情感分析、问答系统、智能客服QA等。完全理解和表达语言是极其困难的,完美的语言理解在一定意义上等效于实现了人工智能。
二、NLP的发展简史1950年前:图灵测试1950年前阿兰·图灵图灵测试:人和机器进行交流,如果人无法判断自己交流的对象是人还是机器,就说明这个机器具有智能。
1950-1970:主流:基于规则形式语言理论
乔姆斯基,根据数学中的公理化方法研究自然语言,采用代数和集合论把形式语言定义为符号的序列。他试图使用有限的规则描述无限的语言现象,发现人类普遍的语言机制,建立所谓的普遍语法。
1970-至今:主流:基于统计谷歌、微软、IBM,20世纪70年代,弗里德里克·贾里尼克及其领导的IBM华生实验室将语音识别率从70%提升到90%。1988年,IBM的彼得·布朗提出了基于统计的机器翻译方法。2005年,Google机器翻译打败基于规则的SysTran。
2010年以后:逆袭:机器学习,深度学习。
AlphaGo先后战胜李世石、柯洁等,掀起人工智能热潮。深度学习、人工神经网络成为热词。领域:语音识别、图像识别、机器翻译、自动驾驶、智能家居。
三、自然语言处理的技术挑战自然语言处理为什么难?人类语言是充满歧义的,不像编程语言那样明确。编程语言中有各种变量名,但人类语言中只有少数几个代词可以用,你得思考到底指代的是谁…… 人类语言的解读依赖于现实世界、常识以及上下文。由于说话速度书写速度阅读速度的限制,人类语言非常简练,省略了大量背景知识。大量存在的未知语言现象如:高山、高升;吉林、武夷山、桂林、温泉、温馨、时光;虎蝇,埃博拉,奥特,闷骚;BoW,word2vec;一带一路;厉害了word哥;吃瓜群众;
四字姓名,对中文实体识别带来了巨大的困扰。
无处不在的歧义词汇如:苹果、粉丝;bank,interest;那辆白色的车是黑车。臭豆腐真香啊!
复杂或歧义结构比比皆是喜欢乡下的孩子。上大学子烛光追思钱伟长。“动物保护警察”明年上岗。欢迎新老师生前来就餐。
普遍存在的隐喻表达在微信圈里潜水;打铁还要自身硬;你简直是个木头脑袋!雪域高原处处盛开民族团结之花;各族人民要像石榴籽一样紧紧拥抱在一起。帝国主义和一切反动派都是纸老虎。
对翻译而言,不同语言之间的概念不对等馒头:steamedbread句子1:Wedochickenright.(正确翻译:我们是烹鸡专家。)
句子2:vanillaTransformer(正确翻译:普通版Transformer)
以上展示的是NLP中文任务的主要难点(巨坑),各位初入NLP行当的兄弟现在跳坑还来得及。。。 下一篇讲讲述“如何用数学语言表示词”,敬请期待!~
reference:1、nlp中的词向量对比:word2vec/glove/fastText/elmo/GPT/bert
2、放弃幻想,全面拥抱Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较
3、《自然语言处理方法与应用》-宗成庆
4、《知识指导的自然语言处理》-刘知远
5、自然语言处理
6、NLP-LOVE/ML-NLP
深度学习在自然语言处理中的应用
原文:DivingIntoNaturalLanguageProcessing作者:AditDeshpande编译:KK4SBB欢迎人工智能领域技术投稿、约稿、给文章纠错,请发送邮件至heyc@csdn.net
自然语言处理是研究和实现人与计算机之间用自然语言进行有效通信的各种理论和方法。本文主要介绍深度学习在自然语言处理中的应用。
自然语言处理简介自然语言处理是研究和实现人与计算机之间用自然语言进行有效通信的各种理论和方法。具体的任务包括:
问答系统(如Siri、Alexa和Cortana的功能)情感分析(判断某个句子表达的是正面还是负面情绪)图像-文字映射(看图写话)机器翻译(语言之间相互翻译)语音识别句子成分分析命名实体识别传统的NLP方法需要借助大量语言学的领域知识。理解音素和词素等术语是基本功,有专门的语言培训课程。我们先来看看传统的NLP方法是如何理解下面这个词语:
假设我们的目标是从该词提取出一些信息(情感偏向、词意等等)。根据语言学知识,该词可以分割为下面三部分:
我们知道前缀”un”表示相反或是反面意思,后缀”ed”表明了词的时态(过去式)。再通过识别词干”interest”的意思,我们就很容易推导出这个单词的含义和情感偏向了。似乎很简单对吧?但是,当真正去梳理英语里的所有前缀和后缀时,你会发现所有前缀和后缀组合很多很多,只有非常资深的语言学家才能理解它们的含义。
深度学习的介入深度学习本质上还是一种表示学习的方法。例如,CNN模型就是用一系列滤波器的组合来将对象划分到不同类别。因此,作者认为我们也可以借用同样的方法来表示单词。
本文概述作者按照构建深度神经网络模型的基本顺序来撰写本文,然后结合近期的研究论文来讨论一些实际应用。也许,部分读者在读完全文之后还存在为啥要用RNN模型,或者为啥LSTM网络会有效等等问题。但是,作者的初衷是希望大家对深度学习在自然语言处理领域的应用能有一个感性的认识。
词向量既然深度学习方法喜欢用数学符号,那我们就把每个单词表示为一个d维的向量。假设d=6。
该用什么数值来表示这个向量呢?我们希望这个向量能够表示词语的含义或者语义。一种方法是创建共现矩阵。假设现在有一句话:
我们希望将句子中的每个单词都表示为一个向量:
共现矩阵的每个元素表示一个词与另一个词在整篇文档中相邻出现的次数。具体来说如下图所示:
我们可以将共现矩阵的每一行当做词向量的初始值:
读者们请注意,仅仅观察这个简单的矩阵,我们就能够获取很多有用的信息。例如,“love”和“like”两个单词与名词性的单词共现次数都是1(NLP和dogs),而且它们都与单词“I”共现一次。这就意味着这两个单词很有可能属于动词。若我们手中的数据集足够大,大家可以想象“like”与“love”的相似度会越来越高,同理其它近义词的词向量也会越来越相似,因为它们总是在相近的上下文中出现。
尽管我们找到了一个好的入手点,但是需要注意到这种向量表示方式的维度会随着语料集的增长而呈线性增长。假如我们有一百万个单词(在NLP问题中并不算太多),就会得到一个1000,000x1000,000的矩阵,而且这个矩阵非常的稀疏。从存储效率来说,这显然不是一种好的表示方法。目前已经有许多不错的词向量表示方法了,其中最著名的就是word2vec。
Word2Vec词向量方法的基本思想就是让向量尽可能完整地表示该词所包含的信息,同时让向量维度保持在一个可控的范围之内(合适的维度是25~1000维之间)。
Word2vec的思想是预测某个中心词附近其它词语出现的概率。还是以之前的句子“IloveNLPandIlikedogs.”为例。我们首先观察该句子的前三个单词。因此窗口的宽度就是m=3:
接着,我们的目标就是根据中心词“love”,预测它左右可能出现的词。怎么实现呢?当然先要定一个优化目标函数。假设确定了一个中心词,我们定的这个函数要使得周围词语出现的对数概率值最大:
这个函数很重要,作者强调一定要认真理解。还是以“love”作为中心词为例,目标函数的含义就是累加左侧“I”,“love”和右侧“NLP”,“love”四个单词的对数概率值。变量T表示训练语句的数量。下面的式子是对数函数的公式:
Vc是中心词的词向量。每个单词有两种表示向量(Uo和Uw)——一个用于此单词作为中心词的场景,另一个用于此单词不是中心词的场景。我们采用随机梯度下降方法训练词向量。这个过程是最令人费解的,如果读者对上述解释看得云里雾里,作者还向大家推荐了两篇拓展阅读文章,第一篇和第二篇。
一句话总结:在给出中心词的情况下,Word2vec的目标就是使得上下文词语的对数函数值最大,优化方法通常是SGD。
word2vec方法最吸引眼球的效果就是其能够发现词向量之间存在的线性关系。经过训练,词向量似乎可以捕捉到不同的语法和语义概念:
真是不可思议,如此简单的目标函数和优化方法就能够捕捉到这种线性关系。
循环神经网络(RecurrentNeuralNetworks)好了,现在我们已经得到了词向量,接下去就要把它们融入到循环神经网络模型中。RNN现在已经是NLP任务最常用的方法之一。RNN模型的优势之一就是可以有效利用之前传入网络的信息。下图就是RNN模型的简单示意图:
上图底部,输入的x是该词的词向量。每个向量x对应一个隐层的向量h。下图橙色框内的是一个输入单元:
每个单元的隐层向量是当前输入词向量和上一个隐层状态的函数,计算公式如下:
如果你仔细观察,会发现公式中有两个上标不同的权重矩阵Whx和Whh,分别与输入的词向量和上一次的隐藏状态相乘。这两个权重矩阵是网络的所有单元共享的。
这就是RNN模型的关键。仔细思考这个过程,它和传统的两层神经网络差别非常大。在传统的两层神经网络中,每层的权重矩阵各不相同(W1和W2),而在递归算机网络中,整个序列共享同一个权重矩阵。
具体到某个单元,它的输出值y是h和Ws的乘积,即另一个权值矩阵:
我们再来回顾一下RNN的优点。RNN与传统NN的最大区别在于RNN输入的是一个序列(这里就是一系列单词)。像CNN模型的输入也只是一张单一的图片,而RNN的输入既可以是一句简短的句子,也可以是一篇5个段落的文章。输入序列的顺序也会极大影响训练效果。理想情况下,隐藏状态有望捕捉过去的信息(历史输入内容)。
门控递归单元(GatedRecurrentUnits)我们再来介绍门控递归单元。这种门控单元的目的是为RNN模型在计算隐层状态时提供一种更复杂的方法。这种方法将使我们的模型能够保持更久远的信息。为什么保持长期依赖是传统循环神经网络存在的问题呢?因为在误差反向传播的过程中,梯度沿着RNN模型由近及远往回传播。如果初始梯度是一个很小的数值(例如训练文本预处理,构造分类器。(即对贝叶斯公式实现文本分类参数值的求解,暂时不理解没关系,下文详解)
-->构造预测分类函数
-->对测试数据预处理
-->使用分类器分类
对于一个新的训练文档d,究竟属于如上四个类别的哪个类别?我们可以根据贝叶斯公式,只是此刻变化成具体的对象。
>P(Category|Document):测试文档属于某类的概率
>P(Category)):从文档空间中随机抽取一个文档d,它属于类别c的概率。(某类文档数目/总文档数目)
>(P(Document|Category):文档d对于给定类c的概率(某类下文档中单词数/某类中总的单词数)
>P(Document):从文档空间中随机抽取一个文档d的概率(对于每个类别都一样,可以忽略不计算。此时为求最大似然概率)
> C(d)=argmax{P(C_i)*P(d|c_i)}:求出近似的贝叶斯每个类别的概率,比较获取最大的概率,此时文档归为最大概率的一类,分类成功。
综述
1. 事先收集处理数据集(涉及网络爬虫和中文切词,特征选取)
2. 预处理:(去掉停用词,移除频数过小的词汇【根据具体情况】)
3. 实验过程:
数据集分两部分(3:7):30%作为测试集,70%作为训练集
增加置信度:10-折交叉验证(整个数据集分为10等份,9份合并为训练集,余下1份作为测试集。一共运行10遍,取平均值作为分类结果)优缺点对比分析
4.评价标准:
宏评价&微评价
平滑因子
8.3生产模型与判别模型区别
1)生产式模型:直接对联合分布进行建模,如:隐马尔科夫模型、马尔科夫随机场等
2)判别式模型:对条件分布进行建模,如:条件随机场、支持向量机、逻辑回归等。
生成模型优点:1)由联合分布2)收敛速度比较快。3)能够应付隐变量。缺点:为了估算准确,样本量和计算量大,样本数目较多时候不建议使用。
判别模型优点:1)计算和样本数量少。2)准确率高。缺点:收敛慢,不能针对隐变量。
8.4
ROC曲线
ROC曲线又叫接受者操作特征曲线,比较学习器模型好坏可视化工具,横坐标参数假正例率,纵坐标参数是真正例率。曲线越靠近对角线(随机猜测线)模型越不好。
好的模型,真正比例比较多,曲线应是陡峭的从0开始上升,后来遇到真正比例越来越少,假正比例元组越来越多,曲线平缓变的更加水平。完全正确的模型面积为1
9统计学知识信息图形化(饼图,线形图等)
集中趋势度量(平均值中位数众数方差等)
概率
排列组合
分布(几何二项泊松正态卡方)
统计抽样
样本估计
假设检验
回归
10stanfordNLP句子理解、自动问答系统、机器翻译、句法分析、标注、情感分析、文本和视觉场景和模型,以及自然语言处理数字人文社会科学中的应用和计算。
11 APacheOpenNLPApache的OpenNLP库是自然语言文本的处理基于机器学习的工具包。它支持最常见的NLP任务,如断词,句子切分,部分词性标注,命名实体提取,分块,解析和指代消解。
句子探测器:句子检测器是用于检测句子边界
标记生成器:该OpenNLP断词段输入字符序列为标记。常是这是由空格分隔的单词,但也有例外。
名称搜索:名称查找器可检测文本命名实体和数字。
POS标注器:该OpenNLPPOS标注器使用的概率模型来预测正确的POS标记出了标签组。
细节化:文本分块由除以单词句法相关部分,如名词基,动词基的文字,但没有指定其内部结构,也没有其在主句作用。
分析器:尝试解析器最简单的方法是在命令行工具。该工具仅用于演示和测试。请从我们网站上的英文分块
12LuceneLucene是一个基于Java的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene目前是ApacheJakarta(雅加达)家族中的一个开源项目。也是目前最为流行的基于Java开源全文检索工具包。
目前已经有很多应用程序的搜索功能是基于Lucene,比如Eclipse帮助系统的搜索功能。Lucene能够为文本类型的数据建立索引,所以你只要把你要索引的数据格式转化的文本格式,Lucene就能对你的文档进行索引和搜索。
13ApacheSolrSolr它是一种开放源码的、基于LuceneJava的搜索服务器。Solr提供了层面搜索(就是统计)、命中醒目显示并且支持多种输出格式。它易于安装和配置,而且附带了一个基于HTTP的管理界面。可以使用Solr的表现优异的基本搜索功能,也可以对它进行扩展从而满足企业的需要。
Solr的特性包括:
•高级的全文搜索功能
•专为高通量的网络流量进行的优化
•基于开放接口(XML和HTTP)的标准
•综合的HTML管理界面
•可伸缩性-能够有效地复制到另外一个Solr搜索服务器
•使用XML配置达到灵活性和适配性
•可扩展的插件体系solr中文分词
14机器学习降维主要特征选取、随机森林、主成分分析、线性降维
15领域本体构建方法1确定领域本体的专业领域和范畴
2考虑复用现有的本体
3列出本体涉及领域中的重要术语
4定义分类概念和概念分类层次
5定义概念之间的关系
16构建领域本体的知识工程方法:主要特点:本体更强调共享、重用,可以为不同系统提供一种统一的语言,因此本体构建的工程性更为明显。
方法:目前为止,本体工程中比较有名的几种方法包括TOVE法、Methontology方法、骨架法、IDEF-5法和七步法等。(大多是手工构建领域本体)
现状:由于本体工程到目前为止仍处于相对不成熟的阶段,领域本体的建设还处于探索期,因此构建过程中还存在着很多问题。
方法成熟度:以上常用方法的依次为:七步法、Methontology方法、IDEF-5法、TOVE法、骨架法。
17特征工程 1特征工程是什么?数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。特征工程本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。通过总结和归纳,人们认为特征工程包括以下方面:
特征处理是特征工程的核心部分,特征处理方法包括数据预处理,特征选择,降维等。
2特征提取:特征提取是指将机器学习算法不能识别的原始数据转化为算法可以识别的特征的过程。
实例解析:文本是由一系列文字组成的,这些文字在经过分词后会形成一个词语集合,对于这些词语集合(原始数据),机器学习算法是不能直接使用的,我们需要将它们转化成机器学习算法可以识别的数值特征(固定长度的向量表示),然后再交给机器学习的算法进行操作。再比如说,图片是由一系列像素点构(原始数据)成的,这些像素点本身无法被机器学习算法直接使用,但是如果将这些像素点转化成矩阵的形式(数值特征),那么机器学习算法就可以使用了。特征提取实际上是把原始数据转化为机器学习算法可以识别的数值特征的过程,不存在降维的概念,特征提取不需要理会这些特征是否是有用的;而特征选择是在提取出来的特征中选择最优的一个特征子集。
文本分类特征提取步骤:
假设一个语料库里包含了很多文章,在对每篇文章作了分词之后,可以把每篇文章看作词语的集合。然后将每篇文章作为数据来训练分类模型,但是这些原始数据是一些词语并且每篇文章词语个数不一样,无法直接被机器学习算法所使用,机器学习算法需要的是定长的数值化的特征。因此,我们要做的就是把这些原始数据数值化,这就对应了特征提取。如何做呢?
对训练数据集的每篇文章,我们进行词语的统计,以形成一个词典向量。词典向量里包含了训练数据里的所有词语(假设停用词已去除),且每个词语代表词典向量中的一个元素。在经过第一步的处理后,每篇文章都可以用词典向量来表示。这样一来,每篇文章都可以被看作是元素相同且长度相同的向量,不同的文章具有不同的向量值。这也就是表示文本的词袋模型(bagofwords)。针对于特定的文章,如何给表示它的向量的每一个元素赋值呢?最简单直接的办法就是0-1法了。简单来说,对于每一篇文章,我们扫描它的词语集合,如果某一个词语出现在了词典中,那么该词语在词典向量中对应的元素置为1,否则为0。在经过上面三步之后,特征提取就完成了。对于每一篇文章,其中必然包含了大量无关的特征,而如何去除这些无关的特征,就是特征选择要做的事情了。
3数据预处理:未经处理的特征,这时的特征可能有以下问题:(标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布)
特征的规格不一样。无量纲化可以解决。信息冗余:对于某些定量特征,其包含的有效信息为区间划分,例如学习成绩,假若只关心“及格”或不“及格”,那么需要将定量的考分,转换成“1”和“0”表示及格和未及格。二值化可以解决这一问题。定性特征不能直接使用:某些机器学习算法和模型只能接受定量特征的输入,那么需要将定性特征转换为定量特征。假设有N种定性值,则将这一个特征扩展为N种特征,当原始特征值为第i种定性值时,第i个扩展特征赋值为1,其他扩展特征赋值为0。存在缺失值:缺失值需要补充。信息利用率低:不同的机器学习算法和模型对数据中信息的利用是不同的。使用sklearn中的preproccessing库来进行数据预处理,可以覆盖以上问题的解决方案。
4特征选择:当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。特征选择是指去掉无关特征,保留相关特征的过程,也可以认为是从所有的特征中选择一个最好的特征子集。特征选择本质上可以认为是降维的过程。
1)Filter(过滤法):按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。如:方差选择法、相关系数法、卡方检验法、互信息法
方差选择法:使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。相关系数法:使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。卡方检验法:经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量。互信息法: 经典的互信息也是评价定性自变量对定性因变量的相关性的。
2)Wrapper(包装法):根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。如:递归特征消除法
递归特征消除法:递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。
3)Embedded(嵌入法):先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。
基于惩罚项的特征选择法:使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用feature_selection库的SelectFromModel类结合带L1惩罚项的逻辑回归模型。如:基于惩罚项的特征选择法、基于树模型的特征选择法
基于树模型的特征选择法:树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型。
4)深度学习方法:从深度学习模型中选择某一神经层的特征后就可以用来进行最终目标模型的训练了。
5降维:当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法:L1惩罚项的模型、主成分分析法(PCA)、线性判别分析(LDA)。PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。1)主成分分析法(PCA):使用decomposition库的PCA类选择特征。2)线性判别分析法(LDA):使用lda库的LDA类选择特征。18模型评估之交叉验证k折交叉验证(k-foldcross-validation)用一部分数据来训练模型,然后用另一部分数据来测试模型的泛化误差。该算法的具体步骤如下:
随机将训练样本等分成k份。对于每一份验证数据Sj,算法在S1,…,SJ-1,SJ+1,…,Sk上进行特征选择,并且构造文本分类器。把得到的文本分类器在验证集Sj上求泛化误差。把k个泛化误差求平均,得到最后的泛化误差。19EM算法EM算法:当模型里含有隐变量的时候,直接求解参数的极大似然估计就会失效。这时就需要用到来对参数进行迭代求解。EM算法说白了也是求含有隐变量的参数的极大似然估计。常用于混合模型(高斯混合模型,伯努利混合模型),训练推理主题模型(topicmodel)时的pSLA等等。
EM算法步骤:给定可观测变量的集合为X,隐藏变量的集合为Z,模型参数用W的联合概率分布,即,p(X,Z|W),目标是要最大化似然函数p(X|W),也就是要求出W使得p(X|W)最大。
选择参数W的初始值,Wold即隐变量Z的后验概率,即p(Z|X,Wold)E步:利用初始值Wold计算隐变量Z的后验概率分布,p(Z|X,Wold),进而找出logp(X,Z|W)在Z的后验概率下的期望Q(W,Wold)。M步:极大化Q(W,Wold),以求出W。检查收敛条件,如果满足收敛条件则停止;否则,令Wold=Wnew,然后跳转到第2步,继续迭代执行。20、推荐算法推荐算法通常是在推荐模型中实现的,而推荐模型会负责收集诸如用户偏好、物品描述这些可用作推荐凭借的数据,据此预测特定用户组可能感兴趣的物品。
1、基于协同过滤算法:原理:用户行为中寻找特定模式,创建用户专属的推荐内容。例子:你的朋友喜欢电影哈利波特I,那么就会推荐给你,这是最简单的基于用户的协同过滤算法,还有一种是基于Item的协同过滤算法,这种方法训练过程比较长,但是训练完成后,推荐过程比较快。输入内容:只取决于使用数据(评价、购买、下载、用户偏好)类型:基于相似类型的协同过滤(比如基于兴趣类似的用户或者基于类似的物品)基于模型的协同过滤假设我们有一些用户已经表达了他们对某些书籍的偏好,他们越喜欢某本书,对这本书的评分也越高(评分范围是1分到5分)。我们可以在一个矩阵中重现他们的这种偏好,用行代表用户,用列代表书籍。在基于用户的协同过滤算法中,我们要做的第一件事就是根据用户对书籍的偏好,计算出他们彼此间的相似度。我们从某个单独用户的角度来看一下这个问题,以图一中第一行的用户为例。通常我们会将每个用户都作为向量(或者数组),其中包含了用户对物品的偏好。通过多种类似的指标对用户进行对比是相当直接的。在本例中,我们会使用余弦相似点。我们将第一位用户与其他五位相对比,可以发现第一位与其他用户的相似度有多少(第一位用户与其他用户的相似性。可以在一个单独的维度中绘制用户间的余弦相似性。)。就像大多相似度指标一样,向量之间的相似度越高,彼此也就越相似。在本例中,第一位用户与其中两位有两本相同的书籍,相似度较高;与另两位只有一本相同书籍,相似度较低;与最后一位没有相同书籍,相似度为零。更常见的情况下,我们可以计算出每名用户与所有用户的相似程度,并在相似性矩阵中表现出来(用户间的相似矩阵,每个用户的相似度是基于用户阅读书籍间的相似性。)。这是一个对称矩阵,也就是说其中一些有用的属性是可以执行数学函数运算的。单元格的背景色表明了用户彼此间的相似程度,红色越深则相似度越高。现在,我们准备使用基于用户的协同过滤来生成给用户的推荐。对于特定的用户来说,这代表着找出与其相似性最高的用户,并根据这些类似用户喜爱的物品进行推荐,具体要参照用户相似程度来加权。我们先以第一个用户为例,为其生成一些推荐。首先我们找到与这名用户相似程度最高的n名用户,删除这名用户已经喜欢过的书籍,再对最相似用户阅读过的书籍进行加权,之后将所有结果加在一起。在本例中,我们假设n=2,也就是说取两名与第一位用户最相似的用户,以生成推荐结果,这两名用户分别是用户2及用户3(图四)。由于第一名用户已经对书籍1和书籍5做出了评分,推荐结果生成书籍3(分数4.5)及书籍4(分数3)。基于用户的CF:1、分析各个用户对item的评价(通过浏览记录、购买记录等);2、依据用户对item的评价计算得出所有用户之间的相似度;3、选出与当前用户最相似的N个用户;4、将这N个用户评价最高并且当前用户又没有浏览过的item推荐给当前用户。最后,我们要为用户1推荐物品,则找出与用户1相似度最高的N名用户(设N=2)评价的物品,去掉用户1评价过的物品,则是推荐结果。
我们还是用同一组用户(图一)为例。在基于物品的协同过滤中,与基于用户的协同过滤类似,我们要做的第一件事就是计算相似度矩阵。但这一回,我们想要针对物品而非用户来看看它们之间的相似性。与之前类似,我们以书籍作为喜爱者的向量(或数组),将其与余弦相似度函数相对比,从而揭示出某本书籍与其他书籍之间的相似程度。由于同一组用户给出的评分大致类似,位于列1的第一本书与位于列5的第五本书相似度是最高的(图五)。其次是相似度排名第三的书籍,有两位相同的用户喜爱;排名第四和第二的书籍只有一位共同读者;而排名最后的书籍由于没有共同读者,相似度为零。我们还可以在相似矩阵中展示出所有书籍彼此间的相似程度(图六)。同样以背景颜色区分了两本书彼此间的相似程度,红色越深相似程度也越高。现在我们知道每本书彼此间的相似程度了,可以为用户生成推荐结果。在基于物品的协同过滤中,我们根据用户此前曾评过分的物品,推荐与其最为相似的物品。在案例中,第一位用户获得的推荐结果为第三本书籍,然后是第六本(图七)。同样地,我们只取与用户之前评论过的书籍最相似的两本书。根据上述描述,基于用户与基于物品的协同过滤似乎非常类似,因此能得出不同的结果这一点确实很有意思。即便在上例中,这两种方式都能为同一名用户得出不同的推荐结果,尽管两者的输入内容是相同的。在构建推荐时,这两种形式的协同过滤方式都是值得考虑的。尽管在向外行描述时,这两种方法看起来非常类似,但实际上它们能得出非常不同的推荐结果,从而为用户带来完全不同的体验。根据上述核心思想,可以有如下算法步骤:建立用户-物品的倒排表物品与物品之间的共现矩阵C[i][j],表示物品i与j共同被多少用户所喜欢。用户与用户之间的相似度矩阵W[i][j],根据余弦相似度计算公式计算。用上面的相似度矩阵来给用户推荐与他所喜欢的物品相似的其他物品。用户u对物品j的兴趣程度可以估计为
UserCF和ItemCF的区别和应用UserCF算法的特点是:
用户较少的场合,否则用户相似度矩阵计算代价很大适合时效性较强,用户个性化兴趣不太明显的领域对新用户不友好,对新物品友好,因为用户相似度矩阵不能实时计算很难提供令用户信服的推荐解释对应地,ItemCF算法的特点:
适用于物品数明显小于用户数的场合,否则物品相似度矩阵计算代价很大适合长尾物品丰富,用户个性化需求强的领域对新用户友好,对新物品不友好,因为物品相似度矩阵不需要很强的实时性(cosα=(A*B)/(||A||*||B||))利用用户历史行为做推荐解释,比较令用户信服因此,可以看出UserCF适用于物品增长很快,实时性较高的场合,比如新闻推荐。而在图书、电子商务和电影领域,比如京东、天猫、优酷中,ItemCF则能极大地发挥优势。在这些网站中,用户的兴趣是比较固定和持久的,而且这些网站的物品更新速度不会特别快,一天一更新是在忍受范围内的。
模型评价指标:准确率、召回率、覆盖率、新颖性、惊喜度、实时性
2、基于内容过滤的推荐算法原理:用户喜欢和自己关注过的Item在内容上类似的Item。例子:你看了哈利波特I,基于内容的推荐算法发现哈利波特II-VI,与你以前观看的在内容上面(共有很多关键词)有很大关联性,就把后者推荐给你,这种方法可以避免Item的冷启动问题(冷启动:如果一个Item从没有被关注过,其他推荐算法则很少会去推荐,但是基于内容的推荐算法可以分析Item之间的关系,实现推荐),缺点:①推荐的Item可能会重复,典型的就是新闻推荐,如果你看了一则关于MH370的新闻,很可能推荐的新闻和你浏览过的,内容一致;②对于一些多媒体的推荐(比如音乐、电影、图片等)由于很难提内容特征,则很难进行推荐,一种解决方式则是人工给这些Item打标签。输入内容:取决于物品及用户的内容/描述
3、混合型推荐算法原理:结合协同过滤和基于内容两种方式,以利用某个算法优点解决另一个的缺点输入内容:通过用户/物品内容特征及使用数据以借助两类数据的优势
4、流行度推荐算法原理:根据流行度来推荐物品的算法(比如下载、观看、影响度较高的)输入内容:通过使用数据与物品内容(比如分类)
数据挖掘十大算法详解
数据挖掘150道题目
数据挖掘基础知识
自然语言处理(NLP)语义分析
文章目录第一部分:文本分类一、文本预处理(解决特征空间高维性、语义相关性和特征分布稀疏)二、文本特征提取三、分类模型第二部分:情感分析一、概述二、基于情感词典的情感分类方法三、基于机器学习的情感分类方法第三部分:意图识别一、概述二、意图识别的基本方法三、意图识别的难点转载来源:https://blog.csdn.net/weixin_41657760/article/details/93163519
第一部分:文本分类
训练文本分类器过程见下图:文本分类问题:给定文档p(可能含有标题t),将文档分类为n个类别中的一个或多个文本分类应用:常见的有垃圾邮件识别,情感分析文本分类方向:主要有二分类,多分类,多标签分类文本分类方法:传统机器学习方法(贝叶斯,svm等),深度学习方法(fastText,TextCNN等)文本分类的处理大致分为文本预处理、文本特征提取、分类模型构建等。和英文文本处理分类相比,中文文本的预处理是关键技术。
一、文本预处理(解决特征空间高维性、语义相关性和特征分布稀疏)1、中文分词技术为什么分词处理?因为研究表明特征粒度为词粒度远远好于字粒度,其大部分分类算法不考虑词序信息,基于字粒度的损失了过多的n-gram信息。
中文分词主要分为两类方法:基于词典的中文分词和基于统计的中文分词。
基于词典的中文分词核心是首先建立统一的词典表,当需要对一个句子进行分词时,首先将句子拆分成多个部分,将每一个部分与字典一一对应,如果该词语在词典中,分词成功,否则继续拆分匹配直到成功。所以字典,切分规则和匹配顺序是核心。基于统计的中文分词方法统计学认为分词是一个概率最大化问题,即拆分句子,基于语料库,统计相邻的字组成的词语出现的概率,相邻的词出现的次数多,就出现的概率大,按照概率值进行分词,所以一个完整的语料库很重要。基于理解的分词方法基于理解的分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。2、去除停用词建立停用词字典,停用词主要包括一些副词、形容词及其一些连接词。通过维护一个停用词表,实际上是一个特征提取的过程,本质上是特征选择的一部分。
二、文本特征提取1、词袋模型
思想:建立一个词典库,该词典库包含训练语料库的所有词语,每个词语对应一个唯一识别的编号,利用one-hot文本表示。文档的词向量维度与单词向量的维度相同,每个位置的值是对应位置词语在文档中出现的次数,即词袋模型(BOW))
问题:
(1)容易引起维度灾难问题,语料库太大,字典的大小为每个词的维度,高维度导致计算困难,每个文档包含的词语数少于词典的总词语数,导致文档稀疏。(2)仅仅考虑词语出现的次数,没有考虑句子词语之间的顺序信息,即语义信息未考虑2、TF-IDF文本特征提取
利用TF和IDF两个参数来表示词语在文本中的重要程度。
TF是词频:指的是一个词语在一个文档中出现的频率,一般情况下,每一个文档中出现的词语的次数越多词语的重要性更大,例如BOW模型一样用出现次数来表示特征值,即出现文档中的词语次数越多,其权重就越大,问题就是在长文档中的词语次数普遍比短文档中的次数多,导致特征值偏向差异情况。
TF体现的是词语在文档内部的重要性。
IDF是体现词语在文档间的重要性
即如果某个词语出现在极少数的文档中,说明该词语对于文档的区别性强,对应的特征值高,IDF值高,IDFi=log(|D|/Ni),D指的是文档总数,Ni指的是出现词语i的文档个数,很明显Ni越小,IDF的值越大。最终TF-IDF的特征值的表达式为:TF-IDF(i,j)=TFij*IDFi
3、基于词向量的特征提取模型
想基于大量的文本语料库,通过类似神经网络模型训练,将每个词语映射成一个定维度的向量,维度在几十到化百维之间,每个向量就代表着这个词语,词语的语义和语法相似性和通过向量之间的相似度来判断。
常用的word2vec主要是CBOW和skip-gram两种模型,由于这两个模型实际上就是一个三层的深度神经网络,其实NNLM的升级,去掉了隐藏层,由输入层、投影层、输出层三层构成,简化了模型和提升了模型的训练速度,其在时间效率上、语法语义表达上效果明显都变好。word2vec通过训练大量的语料最终用定维度的向量来表示每个词语,词语之间语义和语法相似度都可以通过向量的相似度来表示。
三、分类模型1、传统机器学习方法:传统机器学习算法中能用来分类的模型都可以用,常见的有:NB模型,随机森林模型(RF),SVM分类模型,KNN分类模型模型。
2、深度学习文本分类模型
fastText模型原理:句子中所有的词向量进行平均(某种意义上可以理解为只有一个avgpooling特殊CNN),然后直接连接一个softmax层进行分类。
TextCNN:利用CNN来提取句子中类似n-gram的关键信息
模型结构[4]:改进:fastText中的网络结果是完全没有考虑词序信息的,而TextCNN提取句子中类似n-gram的关键信息。
TextRNN
模型:Bi-directionalRNN(实际使用的是双向LSTM)从某种意义上可以理解为可以捕获变长且双向的的“n-gram”信息。改进:CNN有个最大问题是固定filter_size的视野,一方面无法建模更长的序列信息,另一方面filter_size的超参调节也很繁琐。
TextRNN+Attention
模型结构:改进:注意力(Attention)机制是自然语言处理领域一个常用的建模长时间记忆机制,能够很直观的给出每个词对结果的贡献,基本成了Seq2Seq模型的标配了。实际上文本分类从某种意义上也可以理解为一种特殊的Seq2Seq,所以考虑把Attention机制引入近来。
TextRCNN(TextRNN+CNN)
模型结构:过程:利用前向和后向RNN得到每个词的前向和后向上下文的表示:词的表示变成词向量和前向后向上下文向量连接起来的形式:再接跟TextCNN相同卷积层,pooling层即可,唯一不同的是卷积层filter_size=1就可以了,不再需要更大filter_size获得更大视野。
第二部分:情感分析一、概述情感分析是自然语言处理中常见的场景,比如淘宝商品评价,饿了么外卖评价等,对于指导产品更新迭代具有关键性作用。通过情感分析,可以挖掘产品在各个维度的优劣,从而明确如何改进产品。比如对外卖评价,可以分析菜品口味、送达时间、送餐态度、菜品丰富度等多个维度的用户情感指数,从而从各个维度上改进外卖服务。
情感分析可以采用基于情感词典的传统方法,也可以采用基于机器学习的方法。
二、基于情感词典的情感分类方法1、基于词典的情感分类步骤
基于情感词典的方法,先对文本进行分词和停用词处理等预处理,再利用先构建好的情感词典,对文本进行字符串匹配,从而挖掘正面和负面信息。如图:2、情感词典情感词典包含正面词语词典、负面词语词典、否定词语词典、程度副词词典等四部分。一般词典包含两部分,词语和权重。情感词典在整个情感分析中至关重要,所幸现在有很多开源的情感词典,如BosonNLP情感词典,它是基于微博、新闻、论坛等数据来源构建的情感词典,以及知网情感词典等。当然也可以通过语料来自己训练情感词典。
3、情感词典文本匹配算法基于词典的文本匹配算法相对简单。逐个遍历分词后的语句中的词语,如果词语命中词典,则进行相应权重的处理。正面词权重为加法,负面词权重为减法,否定词权重取相反数,程度副词权重则和它修饰的词语权重相乘。如图:利用最终输出的权重值,就可以区分是正面、负面还是中性情感了。4、缺点基于词典的情感分类,简单易行,而且通用性也能够得到保障。但仍然有很多不足:
精度不高,语言是一个高度复杂的东西,采用简单的线性叠加显然会造成很大的精度损失。词语权重同样不是一成不变的,而且也难以做到准确。新词发现,对于新的情感词,比如给力,牛逼等等,词典不一定能够覆盖。词典构建难,基于词典的情感分类,核心在于情感词典。而情感词典的构建需要有较强的背景知识,需要对语言有较深刻的理解,在分析外语方面会有很大限制。三、基于机器学习的情感分类方法即为分类问题,文本分类中的各方法均可采用。
第三部分:意图识别一、概述意图识别是通过分类的办法将句子或者我们常说的query分到相应的意图种类。
举一个简单的例子,我想听周杰伦的歌,这个query的意图便是属于音乐意图,我想听郭德纲的相声便是属于电台意图。做好了意图识别以后对于很多nlp的应用都有很重要的提升,比如在搜索引擎领域使用意图识别来获取与用户输入的query最相关的信息。举个例子,用户在查询"生化危机"时,我们知道"生化危机"既有游戏还有电影,歌曲等等,如果我们通过意图识别发现该用户是想玩"生化危机"的游戏时,那我们直接将游戏的查询结果返回给用户,就会节省用户的搜索点击次数,缩短搜索时间,大幅提高用户的体验。
再举一个目前最火热的聊天机器人来说明一下意图识别的重要性。目前各式各样的聊天机器人,智能客服,智能音箱所能处理的问题种类都是有限制的。比如某聊天机器人目前只有30个技能,那么用户向聊天机器人发出一个指令,聊天机器人首先得根据意图识别将用户的query分到某一个或者某几个技能上去,然后再进行后续的处理。做好了意图识别以后,那种类似于电影场景里面人机交互就有了实现的可能,用户向机器发来的每一个query,机器都能准确的理解用户的意图,然后准确的给予回复。人与机器连续,多轮自然的对话就可以借此实现了。
二、意图识别的基本方法1、基于词典以及模版的规则方法:不同的意图会有的不同的领域词典,比如书名,歌曲名,商品名等等。当一个用户的意图来了以后我们根据意图和词典的匹配程度或者重合程度来进行判断,最简单一个规则是哪个domain的词典重合程度高,就将该query判别给这个领域。
2、基于查询点击日志:如果是搜索引擎等类型业务场景,那么我们可以通过点击日志得到用户的意图。
3、基于分类模型来对用户的意图进行判别:因为意图识别本身也是一个分类问题,其实方法和分类模型的方法大同小异。
三、意图识别的难点意图识别工作最大的难点其实是在于标注数据的获取。目前标注数据的获取主要来自两方面,一方面是专门的数据标注团队对数据进行标注,一方面是通过半监督的方式自动生成标注数据。
自然语言处理技术发展简史
当前,自然语言处理(NaturalLanguageProcessing,NLP)技术的发展可谓日新月异,尤其是近些年来层出不穷的预训练模型及其变体更是让人眼花缭乱。对于想要踏入这一领域并想深入了解的人——比如我——来说,可能会想要搞清楚这门技术是如何发展成现在这个样子的,这其中又经历了怎样的波折。前一段时间,我把NLP技术的发展史做了简略的梳理,并在内部做了分享,现将分享的内容以图文方式整理出来,希望可以帮助那些有困惑的同仁。本文所有的图片来自网络,主要参考文献为吴军的《数学之美》。
Page1语言:信息的载体谈论NLP,首先需要从「语言」入手。今天,世界上已查明的语言超过5000种,这些语言支撑着人们的日常交流与工作沟通。毫不夸张地说,正是语言的出现,才使得人类得以进化成比其他动物更高级的存在。本质上来说,语言主要作用就是承载信息。这是一卷现收藏于大英博物馆的名为《亚尼的死者之书》的长卷。根据考古结论,它距今约3300年,比中国目前发现的最早的甲骨文还略微早些。这轴长卷是绘制在纸莎草上的,长约20米,共有60多幅绘画故事和象形文字说明,用于记载当时古埃及人认为的人死之后的事情。所谓「死者之书」,可以简单理解为死者去往另一个世界的通行证。
Page2语言:信息的载体毫无疑问,古埃及的「死者之书」试图通过绘画和象形文字来记载人在死后的经历和行为,这与现代人使用语言的目的是毫无二致的。其核心模型可以简化成如图所示的内容,即:信息的发送人把想要发送的信息通过一种编码方式(绘画、文字、声音等)进行编码,被编码后的信息通过信道传给接收人,接收人对其进行解码从而获取信息的内容。
古埃及人用的编码方式是绘画和象形文字,得益于计算机技术的发展,今天我们已经可以使用数字来对文字进行编码,其传输效率自然高得多,但本质上与几千年前并没什么不同。
Page3NLP技术发展总览搞清楚语言的本质和目的,我们先宏观看一下NLP技术的发展历史。可以粗略的将NLP技术的发展分为四个阶段,我对应地使用了四个词来形容它们,分别是:缘起、探索、重生、飞跃。
缘起:人们一般认为,1950年,计算机科学之父阿兰图灵发表的《计算的及其与智能》文章,标志着NLP技术的开始。这篇文章最重要的价值之一,就是提出了一种后来被称为「图灵测试」的试验。通过图灵测试,人们可以判断一个机器是否具有了智能。
探索:从1950年开始一直到20世纪70年代,人们一直受直觉启发(现在来看,称之为「误导」或许更加准确),试图用电脑模拟人脑的方式来研究NLP技术,这种方法后来被称为“鸟飞派”,本意是指试图通过仿生学的研究来让人类飞上天空的那批人所采取的方法,后来延伸为受直觉影响,在惯性思维的误导下而采取的不正确的研发方法。
重生:1970年以后,以贾里尼克为首的IBM科学家们采用了统计的方法来解决语音识别的问题,最终使准确率有了质的提升。至此,人们才纷纷意识到原来的方法可能是行不通的,采用统计的方法才是一条准确的路。
飞跃:在确定了以统计学方法为解决NLP问题的“主武器”后,再加上计算能力的提升,有了深度学习技术加持的NLP也迎来的其飞速发展的阶段,在某些任务上的表现甚至已经超过人类。
Page4图灵测试所谓「图灵测试」,简而言之就是把一个人和一个机器关在两个房间了,另外一个人来对他(它)提问相同的问题。如果提问者通过得到的答案无法区分哪个是人哪个是机器的话,那么就可以认为机器通过了测试,具有了“智能”。
为什么说图灵测试的提出是NLP发展的起点呢?因为要想避免非智能决定因素的影响,提问者不能通过声音来提问,而是通过类似写纸条的方式;而且,得到的答案也必须是采用类似于写在打印纸上等方式来传递给提问者。这样,机器要想正确回答问题,首先就需要去“理解”提问者的问题。
Page5鸟飞派——惯性思维下的弯路探索在NLP出现后的前20年,人们一直在用惯性思维的方式去研究相关问题。举个例子,要翻译一篇文章,人会怎么做?公认的一个前提是,翻译者必须对两种语言都很熟悉才可以。于是,人们认为,机器要具备翻译的能力,也必须先理解两种语言才行。这就是典型的「鸟飞派」方法,即受惯性思维的影响而做出的决定。
从早期人们对NLP的理解的结构图中可以看出,这与人类在学习语言的路径几乎是一样的:先学很多单词,然后是句法结构,然后才能理解句子的含义,最后才能基于这些语言去完成相应的任务。
Page6鸟飞派——惯性思维下的弯路探索事实上,这种方法的第一步就遇到了一个不可克服的障碍。拿句法分析而言,机器想要记住自然语言的句法结构,需要语言学家首先将句子按照人类的理解进行句法拆分,然后处理成机器能够存储的格式。如果人类语言非常简单且数量不多,这种方法倒还可行,可惜,以上两个条件没有一个是满足的。
以图中的例子来看,如此简单的一个陈述句,还必须拆分成八条规则才能让机器进行处理,而且,这些规则中的绝大部分都是需要人工编写的。由此可知,要解决实际问题,所需要花费的人工成本就太高了。此外,一词多义、一义多词等现象,也会导致规则出现矛盾。
Page7从规则到统计传统的人工构建规则模板之路看样子是行不通了,于是,一些聪明人开始找寻其他的方向,并发现了统计学这一处理自然语言的利器。
提到统计自然语言处理,就不得不提一下贾里尼克。正是因为他和他的团队在上世纪70年代的工作,开拓了统计自然语言处理的先河。他不仅是世界著名的自然语言处理专家,而且还培养出了一大批世界一流的自然语言处理学者。值得一提的是,他真正地工作到了生命的最后一刻,最后是在实验室突发急病去世的。
现在,人们发现,基于统计的自然语言处理的方法,从模型上看,和语言的初衷——通信,是完全一致的。关于这一点,我们在后面介绍统计模型的时候来阐述。
Page8统计语言模型我们前面已经说过,自然语言的最显著的特性,就是其具有上下文相关性。传统的方法之所以效果不好,很大程度上是因为没有办法处理这种上下文相关性。而基于统计的自然语言处理,或者说,统计语言模型,就是利用统计学的方法,来建立自然语言模型。我们在小学语文考试的时候,经常会遇到一类题:给你一组乱序的词语,让你组成一句通顺的话。假设给定如图中所示的一组词语,那么大家能组成什么样的话呢?我这里给出两种组合的方法,相信大家比较这两个句子就能发现,s1s_1s1比s2s_2s2更好。这里说的「好」,意思就是通顺,那么如何用数学的方法来表示s1s_1s1比s2s_2s2更通顺呢?
回到「通顺」这个描述本身。我们为什么会觉得s1s_1s1比s2s_2s2通顺,其实就是因为s1s_1s1的表达方式更接近于我们的常识,也就是说,句子s1s_1s1体现的这种词语组合方式比包含s2s_2s2在内的其他的组合方式出现的概率更大。
至此,我们已经得到统计语言模型中最精髓的一句话。基于此,贾里尼克假设,一个句子是否合理,取决于其出现在自然语言中的可能性的大小。越常见的句子越合理,这是不争的事实。
Page9统计语言模型接下来,我们就会涉及一些简单的数学推导。只要是学过高等数学和概率统计的基本知识,理解起来都是没有任何问题的。假设SSS表示一个句子,本质上它就是由一定数量的词语按照特定顺序排列好的字符串而已。假定这个字符串用w1,w2,...,wnw_1,w_2,...,w_nw1,w2,...,wn表示,那么,判断SSS是否合理,就变成了判断字符串w1,w2,...,wnw_1,w_2,...,w_nw1,w2,...,wn出现的概率。
要想得到最真实的概率值,办法只有一个,那就是统计人类有文字以来的所有的句子,自然就可以得到SSS的概率。但实际上,这个办法只是理论上可行,实际上没人做得到。
于是,我们只能想办法来近似,即,牺牲一点精度,来换取一种切实可行的方法。只要精度损失不大,那么这种牺牲是可以接受的。这里用到的统计方法主要有条件概率公式和马尔科夫假设。通过这两步,我们就得到了以下近似:
P(w1,w2,...,wn)≈P(w1)P(w2∣w1)...P(wn∣wn−1))P(w_1,w_2,...,w_n)approxP(w_1)P(w_2|w_1)...P(w_n|w_{n-1}))P(w1,w2,...,wn)≈P(w1)P(w2∣w1)...P(wn∣wn−1))
这里得到的这个近似,被称为二元模型(bigrammodel),它假定每个词出现在特定位置的概率只和它的上一个词(按照目前大多数语言的书写习惯,就是指左侧那个词)有关。
于是,你可以猜到,一元模型(每个词出现的概率只与它本身有关,即完全不考虑上下文信息)、三元模型(每个词出现的概率与它前两个词有关)以及更多元的模型分别是什么样子的。
Page10统计语言模型按照二元模型的近似,求一个句子的概率变成了求有限个条件概率的乘积。根据条件概率的定义可知,计算一个条件概率,只需要计算一个联合概率以及一个边缘概率即可。在这个例子里,联合概率为两个词组成的词对在语料库中出现的概率,而边缘概率就更简单了,是一个词在语料库中的概率。
这里又可以利用大数定律来用频率近似代替概率,经过约分,最终,求一个条件概率简化成了一项数数的工作。
至此,我们通过一系列统计理论和假设,先把一个自然语言问题抽象成了一个求概率的问题,又把概率问题简化成一个数数的操作,从而使复杂的问题变得可解。
这就是数学的力量。
Page11模型的训练、零概率问题以及平滑方法上面我们已经找到了一条解决问题的道路,但这条路上仍然许多会让我们行走得磕磕绊绊的障碍必须被剔除,其中,最具有代表性的就是「零概率问题」。
在解决这个问题前,我们先看一下问题为什么会出现。通过前面的分析可知,模型的训练其实就是计算所有条件概率的过程——计算到了任意两个词的条件概率,那么就可以得到任意一个字符串(句子)出现的概率。
在我们采用了大数定律把求概率变成数数的时候,这里有一个潜在的问题:如果分子为0,即特定组合的词对在语料库中没有出现,这时候是否可以认为该条件概率为0,进而整个字符串(句子)出现的概率也为0?
直觉上,得到这样的结论肯定是不妥的,而不妥的原因,就是「统计不可靠」。关于统计不可靠,一个耳熟能详的例子就是抛硬币试验,假设你抛了三次,硬币都是正面朝上,那么你得出这枚硬币是不均匀的结论显然是不能让人信服的。因为你试验的次数太少了。
同理,特定组合的词对没有出现,不一定是因为这种组合不存在,而更可能是因为你的语料库太小了,导致没有涵盖所有的可能。
明白了上述原因,解决方案也自然出现了:增大数据量,这里就是语料库的规模。然而,通过简单的计算你就会发现,增大数据量在这个场景下所起到的作用,似乎并不是很大。
假设汉语的词汇共有20万个,如果我要构建一个三元模型,那么参数的总量就是2000003200000^32000003(参数即所有可能的条件概率,由于每个位置上可能出现的词的数量都是20万,三元模型的参数量就是20万的三次方),这个数字的量级是101510^{15}1015。再假设整个互联网上有100亿个网页,每个网页上平均有1000个词(这是一种很宽的假设,很多网站达不到这个标准),那么互联网上的词的总量也才101310^{13}1013个,考虑到三元模型用到的都是双词词对和三词词对,可利用的词对总量也才2∗10132*10^{13}2∗1013,远小于参数量。
Page12模型的训练、零概率问题以及平滑方法既然单纯的增大数据量的方式行不通,那么就要另谋出路。当一条路行不通时,就要思考一下问题出现的根本原因是什么。
在这个场景下,问题出现的根本原始是:由于语料库的限制,导致未出现的词(词对)的概率被认为是零。这里又有一个隐含的信息在里面:未出现的词,其概率一定是零吗?很显然不是这样。举一个极端一些的例子,假如你的语料库取自小学生语文课本,那么肯定不会出现高中生物中的一些词汇。
由于我们总是受到语料库规模的限制,因此,不应该把未出现的词的概率简单地视为0,而是要给它们一个概率值。这个概率值怎么给呢?前人已经给出了一种解决方案,即“古德-图灵”估计。
图灵就是前面提到的计算机科学之父,古德是他的学生。他们提出的这个方法的整体思路是:把看见的事件的概率总量分出一部分,给那些未看见的(即,未出现的)的事件。划分的原则就是,已看见的事件中概率越低的,调给未看见时间的概率越多。
这和我们想的可能不一样,我们总是认为应该“杀富济贫”,但在这个问题中,那些概率更低的事件意味着更高的不可靠性,因此,需要从这种不可靠中分出一部分给那些看不见的事件。
反正你本身就已经很不可靠了,总不介意更加不可靠一些。
Page13模型的训练、零概率问题以及平滑方法上一页讲了古德图灵估计的思想,事实上他们还给出了具体的实施方式,即,如何调低那些已观测到的事件的概率。
Page14深度学习与自然语言处理前面粗略地对统计语言模型的发展进行了简单的梳理,虽然这确实是NLP发展的一次飞跃,但细心的人肯定马上就发现问题:利用n元模型来处理自然语言,也只是处理邻接词的依赖关系,无法处理自然语言的长程依赖。
不过,得益于深度学习技术的发展,它在很大程度上密度了统计语言模型的上述短板。总结来说,前面提到的统计语言模型技术面临以下问题:
1、采用独热向量的方式来对句子进行编码,无法衡量各个词之间的语义相似度,且在面对大规模词表时还会出现数据稀疏的问题。
Page15深度学习与自然语言处理2、n元模型实际上也是一种提取句子特征的特征模板,因此它也具有所有依赖特征模板的机器学习方法的弊端:效果非常依赖人工设置的模板的好坏。
3、很多下游的NLP任务,如实体抽取、关系抽取等,是依赖于上游的任务——分词、词性标注——成果的,因此,如果前面没做好,后面会受到很大的影响。
为了解决上述问题,人们采用了深度学习技术。
Page16深度学习与自然语言处理词向量,或者叫词嵌入,就是一种用来进行词表示的技术,它克服了传统方法所面临的数据稀疏、语义特征丢失的问题。简而言之,这种方法把每个词表示成了一个特定长度(如50、300)的向量,这样做有两个显而易见的好处:1、向量的维度固定,不因词表的规模而变化;2、利用向量计算,可以近似代替词语间的语义相关性。
对于第2点,一个非常典型的例子如图所示:king的词向量减掉man的词向量再加上woman的词向量,近似等于queen的词向量。
Page17深度学习与自然语言处理词向量的发展过程,大概如图中所示。一开始词向量其实只是作为神经语言模型的副产品,而且受限于当时的硬件条件,效果并不是很好。
后来,专门针对词向量训练的模型与方法被不断提出,且计算能力的不断提升,这些都是词向量技术不断发展的催动力。
Page18深度学习与自然语言处理在对深度学习技术的利用上,相较于NLP,计算机视觉技术是走在前列的。由于卷积神经网络在计算机视觉领域取得了里程碑式的巨大成功,NLP领域的学者们首先想到的就是利用CNN来处理自然语言,也取得了一些不错的成果。但真正让深度学习技术在NLP领域大放光彩的,还要属下一页的模型。
Page19深度学习与自然语言处理我们前面说,统计语言模型无法捕获自然语言的长程依赖。事实上,卷积神经网络在这一点上做得也不够好。于是,人们提出了新的网络模型,循环神经网络——RNN。
Page20深度学习与自然语言处理实际上,有许多RNN的变种神经网络被提出,来解决各种问题。比较出名的,有GRU和LSTM。
Page21深度学习与自然语言处理目前,NLP中大量应用的模型多为seq2seq架构的,即,sequencetosequence。翻译为序列到序列。以中英翻译模型为例,输入为中文字符序列,输出为英文字符序列,因此,称之为序列到序列的模型。
此类模型借鉴了编码器-解码器的思想,即对输入的序列进行编码,获取序列本身所包含的语义信息,然后利用解码器根据输入的语义信息进行解码,获取目标结果。
Page22深度学习与自然语言处理了解计算机视觉的人应该会理解,如果不加任何干涉,计算机在处理图片数据时,会逐像素点进行计算,事实上这在某些情况下是一种浪费。我们人类在观察图片时,一定先被某些元素吸引,从而给与它们更多的关注多。
图中右侧的图片显示了人们在看到左侧的图片时,注意力所放的位置。颜色越浅,表明关注度越多。这种注意力机制对于人们去了解一个事务的概况,是有非常大的帮助的。受此启发,人们在NLP领域也研究出了各种各样的注意力机制。
它们的核心都是,试图想让模型在完成一项NLP任务时,更多地关注那些对完成这项任务有所帮助的信息,而非视全部字符为同等重要的。
Page23深度学习与自然语言处理我们前面说,注意力机制是一种思想,而基于这种思想所实现的具体计算模型,可以有很多种,其中,比较有代表性的,self-attention可以算一种。基于self-attention的Transformer,更是大名鼎鼎:它是BERT的基础。
RNN以及类RNN模型,由于引入了时间步的操作,因此,它们必须等待上一步的操作结果才能进行下一步的计算,这就导致了它们的并行化计算很难实现。而Transformer模型,试图仅用注意力机制来捕获输入和输出之间的关系,从而使得整个架构更加并行化。
Page24深度学习与自然语言处理接下来,我们要介绍预训练模型,这是目前NLP领域的效果最好的模型。
一词多义问题,是自然语言中一个非常常见的现象,也是NLP领域的难点之一。我们前面提到的词向量,由于一个词只映射到了一个固定的词向量,因此,假如这个词是多义词,那么上述方法很明显丢失了其他的语义。为了解决这个问题,ELMo模型提出了一种思想:事先利用模型得到一个单词的词向量,这时,一词只有一义;在具体要利用这个词向量的时候,就要根据这个词所在的上下文的语义来调整该词的向量表示。经过调整后的词向量,能够更加适应其所在的语义环境。
上述过程其实已经体现了预训练方法的核心思想:预先训练一个模型,然后根据具体的任务对模型进行微调。
Page25深度学习与自然语言处理熟悉预训练模型的人,一定不会对BERT感到陌生。实际上,GPT1比BERT还要早一些,但是提出GPT1的公司的宣传能力,显然相较于Google要逊色了许多,以致于人们“只知有BERT,无论GPT1”
Page26深度学习与自然语言处理最后,来看一张比较让人绝望的图:各模型的参数量对比。尽管不是严格的线性关系,但仍然可以看出,NLP模型的规模是随着其发展而不断增加的。GPT3的参数量甚至达到了恐怖的1750亿!训练一次的成本高达上百万美元!
这对于个人研究者来说,无疑是绝望的:很少有人或者小公司能够负担的其这么庞大的研究成本。NLP也越来越成为巨头公司的专享游戏了。