NLP基础教程

语言和数学的产生都是为了同一个目的---记录和传播信息。直到半个多世纪前香农博士提出信息论,人们才开始把数学和信息系统自觉地联系起来。

1. 文字和语言 vs 数字和信息

我们的祖先迅速学习新事物,语言也就越来越丰富,越来越抽象。语言描述的共同要素,比如物体、数量和动作便抽象出来,形成了今天的词汇。当语言和词汇多到一定程度,人类仅用大脑已经记不住所有词汇了,于是,高效记录信息的需求就产生了,这便是文字的起源。

image.png

数字是计数系统的基础。当然早期数字并没有书写的形式,而是掰手指,这就是我们今天使用十进制的原因。

描述数字最有效的是古印度人,他们发明了包括0在内的10个阿拉伯数字,就是今天全世界通用的数字。阿拉伯数字或者说印度数字的革命性不仅在于它的简洁有效,而且标志着数字和文字的分离。这在客观上放自然语言的研究和数学在几千年里没有重合的轨迹,而且越走越远。

2. 从规则到统计

任何一种语言都是一种编码方式,而语言的语法规则是编解码的算法。利用语言来传递信息是人的特质。

当时科学家头脑里的自然语言处理基础层是句法分析语义分析

image.png

对于语义来说举例:
"The pen is in the box."和"The box is in the pen."中两个pen的区别。第一句比较好理解,第二句需要靠常识了,翻译成中文是“盒子在围栏里”。这是一个简单的例子,但清晰地说明了当时自然语言处理研究方法上存在的问题。

可以说,利用计算机处理自然语言的努力直到10世纪70年代初是相当失败的。1970年以后统计语言学的出现使得自然语言处理重获新生,并取得了今天的非凡成就。

推动这个技术路线转变的关键人物是弗里德里克·贾里尼克和他领导的IBM华生实验室。最初,他们也没有想解决整个自然语言处理的各种问题,而只是希望解决语音识别的问题。李开复修过他的课,算是他的学生,也是卡内基-梅隆大学最早从传统自然语言处理方法转到基于统计方法的研究者。李开复和洪小文出色的工作,帮助他的导师拉杰·雷迪获得了图领奖

基于统计的方法的核心模型就是通信系统加隐含马尔科夫模型。这个系统的输入和输出都是一维的符号序列,而且保持原有的次序。最早获得成功的语音识别就是这样的,接下来第二个获得成功的是词性分析也是如此。而在句法分析中,输入的是一维的句子,而输出的是二维的分析树;在机器翻译中,虽然输出的依然是一维句子(另一种语言),但是次序会有很大的变化,所以上述方法就不太管用了。2005年以后,随着Google基于统计方法的翻译系统全面超过了基于规则方法的SysTran翻译系统,基于规则方法学派固守的最后一个堡垒被拔掉了。

今天,几乎不再有科学家自称是传统的基于规则方法的捍卫者。而自然语言处理的研究也从单纯的句法分析和语义理解,变成了非常贴近实际应用的机器翻译、语音识别、文本到数据库自动生成、数据挖掘和知识的获取,等等。

3. 统计语言模型

自然语言从它产生开始,逐渐演变成一种上下文相关的信息表达和传递的方式,因此让计算机处理自然语言,一种基本的问题就是为自然语言这种上下文相关的特性建立数学模型。这个数学模型就是在自然语言处理中常说的统计语言模型

统计语言模型产生的初衷是为了解决语音识别问题。假定表示某一个有意义的句子,由一连串特定的顺序排列的词组成,这里是句子长度。现在,我们想知道在文本中出现的可能性,也就是数学上所说的的概率。因此,需要有个模型来估算。既然,那么不妨把展开表示:

利用条件概率公式,这个序列出现的概率等于每一个词出现的条件概率相乘,于是可展开为:

其中表示第一个词出现的概率;是在已知第一个词的前提下,第二个词出现的概率;依次类推。不难看出,词的出现概率取决于它前面的所有词。到了最后一个词,条件概率的可能性太多,无法估算。怎么办?于是一种偷懒的方法,成为马尔科夫假设。现在,出现的概率就变得简单了:

公式(3.3)对应的统计语言模型是二元模型。当然,也可以假设一个词由前面个词决定,对应的模型稍微复杂些,被称为N元模型

接下来的问题就是如何估算条件概率。根据它的定义:

只要数一数这对词在统计的文本中前后相邻出现了多少次,以及本身在同样的文本中出现了多少次,然后两数分别除以语料库的大小,即可得到这些词或者二元组的相对频度:

根据大数定理,只要统计量足够,相对频度就等于概率,即

因此:

数学的精彩之处就在于简单的模型可以干大事。

4. 谈谈分词

对于西方拼音语言来讲,词之间有明确的分界符,统计和使用语言模型非常直接。而对于一些亚洲语言(如中、日、韩、泰等),词之间没有明确的的分界符。

分词的输入是一串汉字,例如一个句子:“中国航天官员应邀到美国与太空总署官员开会”,而分词的输出则是用分界符,比如用斜线或者竖线分割的一串词:中国/航天/官员/应邀/到/美国/与/太空/总署/官员/开会。

最容易想到的分词方法,就是字典:

  1. 查字典法---北京航天航空大学的梁南元教授提出的;
  2. 最少词数的分词理论---哈尔滨工业大学的王晓龙博士;
  3. 统计语言模型---清华大学电子工程系的郭进博士;
  4. 没有词典的分词方法---清华大学孙茂松教授和香港科技大学吴德凯教授;

利用统计语言模型分词的方法,假定一个句子可以有几种分词方法,为了简单起见,假定有以下三种:


其中,等都是汉语的词,上述各种分词结果可能产生不同数量的词串。那么最好的一种分词方法应该保证分完词后这个句子出现的概率最大。也就是满足:

并且

需要指出的是任何方法都有它的局限性。在工业界,只要采用基本的统计语言模型,加上一些业界熟知的技巧就能得到很好的分词结果,不值得再去花大精力去做研究,因为即使能够进一步提高准确率,提升空间也很有限。

5. 隐马尔科夫模型(HMM)

隐马尔科夫模型成功地解决了复杂语音识别、机器翻译等问题。

人类信息的交流贯穿了人类的进化和文明的全过程,而自然语言是人类交流信息的工具,语言和通信的联系是天然的。通信的本质就是编解码和传输的过程。但是自然语言处理早期的努力都集中在语法、语义和知识表述上,离通信的原理越走越远,而这样离答案也就越来越远。当自然语言处理的问题回归到通信系统中的解码问题时,很多难题都迎刃而解了。

通信模型

在通信中,如何根据接收端的观测信号来推测信号源发送的信息呢?只需要从所有的源信息中找到最可能产生出观测信号的那一个信息。用概率论的语言来描述,就是已知的情况下,求得令条件概率
达到最大值的那个信息串,即

当然,上面的概率不容易直接求出,利用贝叶斯公式可以把上述公式等价变换成

其中表示信息在传输后变成接收的信号的可能性;而表示本身是一个在接收端合乎情理的信息的可能性;最后表示在发送端产生信息的可能性。

首先,一旦信息产生了,它就不会改变了,这时就是一个可以忽略的常熟。因此,上面的公式可以等价成

这个公式完全可以用隐含马尔可夫模型(Hidden Markov Model)来估计。

隐马尔可夫模型是马尔科夫链的一个扩展:每一个状态只和前一个状态有关,任一时刻的状态是不可见的。所以观察者没法通过观察到一个状态序列来推测转移概率等参数。但是,隐马尔科夫模型在每个时刻会输出一个符号,而且跟相关且仅跟相关。这个被称为独立输出假设。隐含马尔可夫模型的结构如下:其中隐含的状态是一个典型的马尔科夫链。鲍姆把这种模型称为“隐含”马尔科夫模型。

隐含马尔可夫模型

基于马尔科夫假设和独立输出假设,我们可以计算出某个特定的状态序列产生出输出符号的概率。

公式(5.4)在形态上和公式(5.3)非常相似,即把

代入(5.3),这时正好得到(5.4)。这样通信的解码问题就可以用隐含马尔可夫模型来解决了。

至于如何找出上面式子的最大值,进而找出要识别句子,可以利用维特比算法(Viterbi Algorithm)。在公式(5.3)中,是语言模型。

针对不同的应用,的名称也各不相同,在语音识别中它被称为“声学模型”(Acoustic Model),在机器翻译中是“翻译模型”(Translation Model),而在拼写校正中是“纠错模型”(Correction Model)。

围绕着隐含马尔可夫模型有三个基本问题:

  1. 给定一个模型,如何计算某个特定的输出序列的概率;(Forward-Backword算法)
  2. 给定一个模型和某个特定序列,如何找到最可能产生这个输出的状态序列;(维特比算法)
  3. 给定足够量的观测数据,如何估计隐含马尔可夫模型的参数;(模型训练问题)

在利用隐含马尔可夫模型解决实际问题中,需要事先知道从前一个状态进入当前状态的概率,也被称为转移概率,和每个状态产生相应输出符号的概率,也称为发射概率。这些概率被称为隐含马尔可夫模型的参数,而计算或者估计这些参数的过程称为模型的训练

我们从条件概率的定义出发,知道:(如果有足够多的人工标注数据/大数定律)

有监督的训练的前提是需要大量人工标注的数据。比如在语言识别中的声学模型训练。人是无法确定产生某个语音的状态序列的,因此也就无法标注训练模型的数据。而在另外一些应用中,虽然标注数据是可行的,但是成本非常高。比如训练中英机器翻译的模型,需要大量中英对照的语料,还要把中英文的词一一对应起来,这个成本非常高。因此,训练隐含马尔可夫模型更实用方式仅仅通过大量观测到的信号就能推算模型参数的和的方法,这类方法称为无监督的训练方法(鲍姆·韦尔奇算法)。

鲍姆·韦尔奇算法的每一次迭代都是不断地估计新的模型参数,使得输出的概率达到最大化,因此这个过程被称为期望最大化,简称EM过程。EM过程保证算法一定能收敛到一个局部最优点,很遗憾它一般不能保证找到全局最优点。因此,有一些自然语言处理的应用,比如词性标注中,这种无监督的鲍姆·韦尔奇算法训练出的模型比有监督的训练得到的模型效果略差,因为前者未必能收敛到全局最优点。但是如果目标函数是凸函数,则只有一个最优点,在这种情况下EM过程可以找到最佳值。

隐含马尔可夫模型和几乎所有的机器学习的模型工具一样,它需要一个训练算法(鲍姆·韦尔奇算法)和使用时的解码算法(维特比算法)。

6. 信息的度量和互信息

直到1948年,香农在他的著名的论文“通信的数学原理”中提出了“信息熵”的概念,才解决了信息的度量问题,并且量化出信息的作用。

那么如何量化信息量的度量呢?举例,2014年举行了世界杯足球赛,大家都很关心谁会是冠军。假如我错过了看世界杯,赛后我问一个知道比赛结果的观众“哪支球队是冠军?”他不愿告诉我,而是让我猜。并且每猜一次,他就要收一元钱才告诉我是否猜对了,那么我要掏多少钱才知道谁是冠军呢?我可以把球队编上号,从1到32,然后提问:“冠军球队在1-16号中吗?”假如他告诉我猜对了,我会接着问“冠军在1-8号中吗?”假如他说我猜错了,我自然知道冠军队在9-16号中。这样只需五次,我就知道哪支球队是冠军。所以,谁是冠军这条消息的信息量只值5块钱。

当然,香农不是用钱,而是用“比特”这个概念来度量信息量。信息量的比特数和所有可能情况的对数函数log有关。()

对于任意一个随机变量,它的信息熵定义如下:

变量的不确定性越大,熵也就越大,要把它搞清楚,所需要信息量也就越大。几乎所有的自然语言处理、信息与信号的处理的应用都是一个消除不确定性的过程。

自然语言的统计模型,其中的一元模型就是通过某个词本身的概率分布,来消除不确定因素;而二元及更高阶的语言模型则还使用了上下文的信息,那就能准确预测一个句子中当前的词汇了。在数学上可以严格证明为什么这些“相关的”信息也能够消除不确定性。

假定和是两个随机变量,是我们需要了解的。假定我们现在知道了的随机分布,那么也就知道了的熵:

定义在的条件下的条件熵为:

可以证明,也就是说多了的信息之后,关于的不确定性下降了!

用一句话概括来说:信息的作用在于消除不确定性,自然语言处理大量问题就是寻找相关的信息。

关于“相关性”香农提出了“互信息”的概念作为两个随机事件“相关性”的量化度量:


互信息是一个取值在0到之间的函数,当和完全相关时,它们的取值是,同时;当二者无关时,它的取值是0。(可以解决词义的二义性)。

“相对熵”,在有些文献里也被称为“交叉熵”,相对熵也用来衡量相关性,但和互信息不同,它用来衡量两个取值为正数的函数的相似性,它的定义如下:
KL(f(x)||g(x))=\sum_{x\in X}f(x)\log\frac{f(x)}{g(x)}\tag{6.6} \\ =\sum_{x\in X}f(x)[\log f(x)-\log g(x)] \\ =\sum_{x\in X}[f(x)\log f(x)-f(x)\log g(x)] \\ =\sum_{x\in X}f(x)\log f(x) - \sum_{x\in X}f(x)\log g(x) \\ = H(X)-\sum_{x\in X}f(x)\log g(x)

同样,大家不必关心公式本身,只要记住下面三条结论就好:

1. 对于两个完全相同的函数,它们的相对熵等于零;
2. 相对熵越大,两个函数差异越大;反之,相对熵越小,两个函数差异越小;
3. 对于概率分布或者概率密度函数,如果取值均大于零,相对熵可以度量两个随机分布的差异性。

需要指出的是,相对熵是不对称的,即

这样使用起来不方便,为了让它对称,詹森和香农提出一种新的相对熵的计算方法,将上式的不等式两边取平均,即:

相对熵最早使用在信号处理上。如果两个随机信号,它们的相对熵越小,说明这两个信号越接近,否则信号的差异越大。后来研究信息处理的学者们也用它来衡量两段信息的相似程度,比如说如果一篇文章是照抄或者改写另一篇,那么这两篇文章中词频分布的相对熵就非常小,接近于零。在Google的自动问答系统中,我们采用了上面詹森-香农度量来衡量两个答案的相似性。

7. 表示学习:One-hot表示法、词袋模型、分布式表示、共现矩阵

One-hot表示法先提取语料的词汇表,比如“保险/费用/的/计算/方法/需要/参考/标准”,得到词汇表。
{
"保险": 1,
"费用": 2,
"计算": 3,
"方法": 4,
"需要": 5,
"参考": 6,
"标准": 7
}
词汇表的构建通常基于对文本分词和去停用词后进行的,可以不考虑单词的先后顺序,每个单词都用唯一的id表示。将上面的词用One-hot表示。
{
"保险": [1, 0, 0, 0, 0, 0, 0],
"费用": [0, 1, 0, 0, 0, 0, 0],
"计算": [0, 0, 1, 0, 0, 0, 0],
"方法": [0, 0, 0, 1, 0, 0, 0],
"需要": [0, 0, 0, 0, 1, 0, 0],
"参考": [0, 0, 0, 0, 0, 1, 0],
"标准": [0, 0, 0, 0, 0, 0, 1]
}

One-hot表示法是一种离散表示法,其单词向量所组成的矩阵为稀疏矩阵。缺点是词汇表庞大,将占用很大的存储空间,并且词向量之间不存在关联关系,这就使经常同时出现的词汇或同义词在One-hot表示法中不能体现。

词袋模型(BOW)是指忽略文档的语法和语序等要素,将文档仅仅看成是若干无序的单词集合,且每个词都是独立的。

词袋模型

词袋模型经常出现在自然语言处理和信息检索领域。

文本 BOW
保险/费用/计算/参考/标准 [1,1,1,0,0,1,1]
保险/费用/的/计算/费用 [1,2,1,0,0,0,0]

基于One-hot表示法的词袋模型,文档的表示与每个词在文档中顺序没有关系,向量的长度与词汇表大小相同,而每个元素是该索引位置所代表的词在文档中出现的频率。

分布式表示法:

1-dim 2-dim ··· 50~300dim
python 0.52 0.21 0.37 ···
ruby 0.48 0.21 0.33 ···
word 0.05 0.23 0.06 ···

在现代统计自然语言中,有一个非常有洞见的想法,就是:能否用一个词附近的其他词来表示该词?就像你认识一个新认识的朋友,想知道他的收入,你可以看一下他周围10个朋友的收入大致是多少,来推断他的收入是多少一样。

共现矩阵,基于前面那个想法,就有了这样一个局域窗口,这个窗口的作用就是看一下周围的几个词才好,窗口长度一般设5-10。那他怎么表示呢?
假设有三句话:
I like deep learning,
I like NLP,
I enjoy flying,

Counts I like enjoy deep learning NLP flying ,
I 0 2 1 0 0 0 0 0
like 2 0 0 1 0 1 0 0
enjoy 1 0 0 0 0 0 1 0
deep 0 1 0 0 1 0 0 0
learning 0 0 0 1 0 0 0 1
NLP 0 1 0 0 0 0 0 1
flying 0 0 1 0 0 0 0 1
, 0 0 0 0 1 1 1 0

其中面临的主要问题就是向量维数随着词典大小线性增长,且对于模型有着严重的稀疏性问题。

8. CNN

https://skymind.ai/wiki/convolutional-network
LeNet-5

9. RNN、LSTM、GRU


RNN

f_t=\sigma(W^f s_{t-1}+U^f x_t) \\ i_t=\sigma(W^i s_{t-1}+U^i x_t) \\ o_t=\sigma(W^o s_{t-1}+U^o x_t) \\ \tilde{c_t}=tanh(W^cs_{t-1}+U^cx_t) \\ c_t=f_t \circ c_{t-1} + i_t \circ \tilde{c}_t \\ s_t=o_t \circ tanh(c_t) \tag{9.2}

LSTM


GRU

参考文献

  1. 《数学之美》
  2. 《智能问答与深度学习》

你可能感兴趣的:(NLP基础教程)