花书十二章+NLP
最近刚好轮到自己讲花书十二章,感觉goodfellow在NLP这块写的不是很全,所以就自己参考宗老师的《统计自然语言处理》来理了一下思路,现在整理一下。
一.NLP前言
1.主要研究领域
机器翻译、自动文摘、信息检索、文档分类、问答系统、信息过滤、信息抽取、文本挖掘、舆情分析、光字符识别、说话人识别/验证、语音识别、语音合成(语音这块实际上也可以是单独的一个大类,毕竟深度学习应用的最好最主流的领域一般都包括三个:CV+语音识别+NLP)
2.NLP基础研究内容
(1)词法层次:研究词的内部结构,包括汉语分词、命名实体识别(中文命名实体识别)、词性标注、词向量等
(2)句法层次:研究句子结构成分之间的相互关系和组成句子序列的规则,主要是句法分析
(3)语义学:根据句子的语法结构和句中每个词的含义推导能够反映这个句子意义的某种形式化表示,包括词义消歧、语义角色标注、知识图谱
(4)语用学:研究特定语境下的语义,主要是共指消解(包括中文共指消解)(什么是共指消解:人们为了避免重复习惯用代词、称谓或者缩略语等等来指代前面提到的实体名称,比如文章开始写“西南财经大学”,后面一般就是“西财”、“财大”这种,这就是共指现象,而共指消解就是将现实世界中同一实体的不同描述合并到一起)
3.NLP面临的主要困难
(1)歧义消解:比如词义消歧、共指消解、注音歧义、词汇形态歧义、语法结构歧义等
(2)未知语言现象的处理(比如网络语言等等)、病构(理论上不符合句法结构,但是实际中存在)
4.两种技术思路
(1)基于理性主义:基于知识的方法,采用非歧义的规则形式
(2)基于经验主义:以基于语料库的统计分析为基础
现在发展起来的也是第二种,然后逐渐过渡到深度学习模型
二.语言模型
既然是统计分析方法,那么必须要讲的就是语言模型,它们是NLP里面发展最早的,主要解决的就是一个句子出现概率的问题,包括两类:一类是传统语言模型,也就是n-gram语言模型;一类是神经网络语言模型
1.n-gram
给定一个句子,如何判断这个句子在整个语料库中出现的概率,很明显一个句子可以拆分为多个词,那么我们计算一个句子的出现概率实际上就可以转化为其中的每个词出现的概率然后再累乘,但是计算每个词出现的概率的时候是否还应该考虑这个词和它之前词的依赖关系,所以这就是n-gram的计算公式,包含了条件概率、极大似然和马尔可夫链的假设
马尔可夫链的思想就是当前的第n个词出现的概率取决于前n-1个词,此时,给定一个语料库,我们就可以基于上面的公式来计算一个句子出现的概率。
但是这样直接用前n-1个词会使得计算复杂度猛增,所以为了简化,往往采用k阶马尔可夫假设,即第n个词只与前k个词有关,k一般取3、4、5
比如,k=2时,为3-gram模型,计算公式为:
那么接下来,就只需要计算这个公式中的每一个条件概率即可,我们把条件概率公式写开,那么又会发现存在问题:
(1)分母为0怎么办?因为可能这个短句子并不会在语料库中出现
(2)分子为0怎么办?分子为0也会使得整个句子计算公式的负对数似然为∞
所以出现了两种建模时的解决方法:
(1)平滑
平滑的方法有很多,最简单就是加1平滑,具体的在宗成庆老师那本书上都有
(2)back-off(回退)
高阶n-gram模型的概率计算不了时,就回退到低阶
因此基于上面的论述,我们就可以对一个句子出现的概率进行建模。
那么n-gram模型具有怎样的缺点呢?
(1)维数灾难:词表大小为V的n-gram数目为V^n,n增大,那么要计算的n-gram数目会指数级的速率增加
(2)平滑或者back-off的方法都是人工设计规则,且比较繁杂,会适合哪种语料不清楚
(3)基于极大似然的n-gram缺少泛化,比较死板
所以在这种情况下,我们必须要找到更好的语言模型来建模
2.NLM(神经语言模型)
其模型还是计算条件概率,只是现在条件概率是在神经网络中计算,最后以softmax概率形式输出,当词表V很大时,采用分层的softmax(也就是将原本的1层softmax转化为多层O(logN)个逻辑回归,在每个逻辑回归处做二分类来预测当前词应当去到哪一个节点,这样计算的复杂度从O(N)降为O(logN))
三.词向量
NLP中最细粒度的是词,词组成句子,句子组成段落,所以处理NLP任务首先必须要对词进行学习,这里类似于图像中,我们很容易就会想到建立函数关系,比如x为词,y为词性,那么建立f(x)到y的映射就可以学习到词性这个信息。但是我们要明白的是不论是神经网络还是SVM或者隐马,都只接受数值型的输入,所以要把单词转化为数值,应该怎么处理?
首先引入一个概念,这里相当于是要把单词转化为数值型,或者,更严格的表述就是将单词嵌入到一个数值空间中,这种嵌入方式就称为词嵌入(word embedding),而Word2vec(Google,2013)就是处理词嵌入中最基础也是最常用的一种。
1.Word2Vec
在NLP中,x如果是一个词,y是上下文单词,那么f就是我们刚刚介绍的n-gram语言模型或者NLM,这个建模的目的就是来判断(x,y)这个样本点是否会出现(通俗的说,就是x和y放一起,是不是人话),所以word2vec就是这样一种想法,但它的最终目的不是要f训练的多么好,而是只关心模型训练完后的参数(也就是说,训练完成后不会用这个模型来处理新任务,真正需要的只是模型训练后的参数),得到这些参数之后,作为输入x的某种向量化表示,这个向量就称为词向量
word2vec是两种网络架构分别是skip-gram和CBOW,首先是用one-hot对x进行编码,转为为数值型,然后再用下面的两种网络架构来训练得到词向量
(1)skip-gram
一个词语作为输入,来预测它周围的上下文单词出现的概率就是skip-gram的任务,这个网络上的隐藏层的激活函数是线性的,相当于没做任何处理
对于第一个单词的one-hot向量,输入到隐藏层中只有1那个位置会被激活,其他0位置的神经元都是关闭状态,从而得到了一个V*1维向量,用来唯一表示x
skip-gram最后得到的词向量维度是远远小于句子中单词总数,所以实现了降维,最后一层输出层同样使用了分层的softmax来解决高维输出问题。
当然还有其他的方法来解决高维输出问题:
(1)使用短列表
(2)重要性采样
(3)噪声对比估计和排名损失