本章带我们回到远古,回到语言、文字和数字产生的时代;
早期人类会传播信息嘛?早期的人类如何传播信息?
就上面简单的信息传递过程,其实也体现出了信息传播的模型:
因为早期人类了解到的信息很少,因此它们并不需要语言和数字,比如,它们想说那里有只熊,只需要手指着,呀呀两声就好了;
思考下语言是如何产生的?
随着文明的发展,语言的共同要素:物体、数量、动作便被抽象出来;
当语言和词汇多到一定程度时,人们记不住了,高效记录信息的需求就产生了,这便是文字的起源;
随着文明的发展,文字越来越多,问题是太多的话人们记不住,于是出现了“概念的第一次概括和归类”,这种概括和归类与机器学习中的聚类算法十分类似;
文字经过归类后,难免会产生歧义,比如中国古代的文言文,同理中国古代学者对儒家经典的注释和正义,其实都是在按照自己的理解做消除歧义性的工作;
埃及人通过文字记录了他们生活中很重要的信息,这使得我们对5000年前的埃及的了解要比1000年前的玛雅文明的了解要多得多,这要归功于埃及人通过文字记录了他们生活中最重要的信息,这能给我们一些指导意义:
那么数字为什么出现呢?
最简单的计数系统:掰手指,所以手指头不够用了怎么办?简单暴力的方法:用脚指!
历史证明,使用脚指的这种文明消失掉了,那就是玛雅文明,他们采用20进制,因此玛雅人的一个世纪是四百年,而2012年刚好是这个太阳纪的最后一年,这就是讹传的世界末日;
我们的祖先也发现了手指头不够用了,我们的祖先很聪明,他们发明了进位制,中国人用个十百千万兆亿,罗马人用I表示1,V表示5,X表示10,L表示50等;
那么10亿分别用这两种方法如何表示?
描述数字最厉害的人是古印度人,他们发明了包括0在内的10个阿拉伯数字,阿拉伯数字我们至今仍然在使用;
拼音文字诞生于两河流域附近,之后经过了很多年的发展,传给了古希腊人发展,在他们那里拼写和读音已经紧密结合起来了;
从象形文字到拼音文字是一个飞跃,因为人们已经懂得对信息进行编码;
在罗马体系的文字中,常用字短,生僻字长,这就是信息论中的最短编码理论;
古希腊时期,语法出现,语法可以理解成语言的编码和解码规则,但是任何语言都有语法规则覆盖不到的地方,这些例外和不精确使得我们的语言丰富多彩;
语法的地位如何呢?
讲了文字、语言和数字的历史,目的是帮助读者感语言和数字天然的、内在的联系;
比如抽象概括的思想、比如建立语法规则的思想等等;
机器能不能理解自然语言?这里涉及到两个认知层面的问题:
这两个问题的答案都是YES;
图灵测试的概念:让人和机器交流,如果人无法判断自己交流的对象是人还是机器,就说明这个机器有智能了;
20世纪50年代到70年代,人们一致认为:要让机器翻译或语音识别,只有让机器能理解自然语言,而做到这一点就必须让机器拥有类似我们人类这样的智能;事实证明,这个观点是错误的;
20世纪60年代,摆在科学家面前的问题是怎样才能理解自然语言,而关键点是分析语句和获取语义,然后建立了一系列语法规则,当然规则可能会非常庞大,而且建立的语法规则不能做到完全覆盖;
1970年后,统计语言学出现,关键人物是贾里尼克和他领导的IBM华生实验室,他们利用统计模型,将语音识别率从70%提高到90%;
当时基于统计学方法的核心模型是通信系统加隐含马尔可夫模型;
一直到20世纪90年代末期,统计学方法才变得更有说服力,其中一部分原因也是那些老科学家的退休,他们不愿接受新的想法···
基于统计学的数学模型和通信模型是相通的,但是科学家们,用了几十年的时间才意识到这一点;
另外前段时间还有同学跟我说,现在的自动驾驶,国家必须出一些相关的法律法规来规定一些特殊情况,比如如何非撞不可,是撞老人还是撞小孩,我们争论了半天···,我说,现在的统计学模型,你根本无法加这种规则啊,这里面的判断,全都是一堆矩阵数字,根本没法理解···,争论了一晚上都争论无果;
不过我知道,规则这种东西是无穷无尽的,而现在的自动驾驶的基本方向也是用数据集去训练,都是统计学的方法,根本不是规则化,所以我觉得我那位同学说的很没谱;
有关自然语言的处理,可以用一句话来概括:
假设S是一个句子, S = w 1 , w 2 , w 3 , ⋅ ⋅ ⋅ , w n S=w_1, w_2, w_3, ···, w_n S=w1,w2,w3,⋅⋅⋅,wn,其中wi表示词,那么P(S)就可以表示成: P ( S ) = P ( w 1 , w 2 , ⋅ ⋅ ⋅ , w n ) = P ( w 1 ) x P ( w 2 ∣ w 1 ) x P ( w 3 ∣ w 1 , w 2 ) ⋅ ⋅ ⋅ P ( w n ∣ w 1 , w 2 , ⋅ ⋅ ⋅ , w n − 1 ) P(S)=P(w_1, w_2,···,w_n)= P(w_1) x P(w_2|w_1) x P(w_3|w_1,w_2)···P(w_n|w_1, w_2, ···, w_n-1) P(S)=P(w1,w2,⋅⋅⋅,wn)=P(w1)xP(w2∣w1)xP(w3∣w1,w2)⋅⋅⋅P(wn∣w1,w2,⋅⋅⋅,wn−1)
的确 w n w_n wn出现的概率取决于它前面的词,但是这些条件概率怎么算呢?
第三个词的概率 P ( w 3 ∣ w 1 , w 2 ) P(w_3|w_1,w_2) P(w3∣w1,w2)已经非常难算了,因为涉及到3个变量,每个变量的可能性都是一种语言词典的大小;
那怎么办?能不能采用近似的方法,估算呢?
马尔可夫提出了一种偷懒的算法,假设每个词仅仅和其前面那个次有关,即:
P ( S ) = P ( w 1 ) x P ( w 2 ∣ w 1 ) x P ( w 3 ∣ w 2 ) ⋅ ⋅ ⋅ P ( w n ∣ w n − 1 ) P(S)=P(w_1) x P(w_2|w_1) x P(w_3|w_2)···P(w_n|w_n-1) P(S)=P(w1)xP(w2∣w1)xP(w3∣w2)⋅⋅⋅P(wn∣wn−1)
这就叫二元模型,当然也可以假定一个词由前N-1个词决定,那么就是N元模型;
那么条件概率就好算了:
P ( w i ∣ w i − 1 ) = P ( w i − 1 , w i ) P ( w i − 1 ) P(w_i|w_i-1)=\dfrac{P(w_i-1, w_i)}{P(w_i-1)} P(wi∣wi−1)=P(wi−1)P(wi−1,wi)
根据大数定理,去分别统计他们出现的数量就OK了!
这种估算方法很多人怀疑,但是事实证明,这种方案比任何方案都有效;
当然实际的语言模型并没有那么简单,还有需要细节需要处理,见下文:
高阶模型就是之前讲的N元模型,N的取值问题,在实际应用中最多的是N=3的模型,为什么不取大一点呢?
因为算法复杂度和N成指数关系,但是自然语言的上下文关系可能跨度很大,仅仅假设和前两个词有关系怎么能行呢?
这里还提到了其他长程依赖的方法;
模型训练:尽可能使用大的数据集
零概率问题:在语料中,某些词没有出现,那么能认为他们的概率为0嘛?不能的,这里用了些平滑方法:古德-图灵估计;
给那些零概率的词赋予了一个很小的非零值,从而解决了该问题;
还有卡茨退避法
之后在工程中,可能会遇到类似的问题,几乎都属于数据集的处理叭;
给出的结论是:在成本不高的情况下,有必要对数据集进行过滤;
个人也做过有关深度学习相关的东西,不过的确好像没怎么去处理数据集,包括数据集过滤,数据集扩充;
有时数学公式无法求解,不如退而求其次,求近似值,说不定也能取得不错的效果;
这是一个比较好的研究思路,不过像解决工程上的一些棘手问题,还是需要一些数学功底的;
什么是分词?
将中国航天官员分解成 中国 航天 官员 这就叫分词
怎么分?
简单,查字典,匹配最长词,但是这种方案只能解决七八成的问题;
用统计学模型:
假设有三种方案:
A1, A2, ···, A3
B1, B2, ···, B3
C1, C2, ···, C3
那么哪个出现的概率最大,哪个就最好咯;那么怎么算呢?
这是一个动态规划问题,使用的算法是维特比算法,具体怎么算笔记里就不说了,仅仅将算法名字写出来,如果以后用得到再去查资料;
而且读这本书最重要的我觉得不是数学细节问题,而是处理问题的思维问题,比如将上述分词问题转换成一个概率问题,概率问题再想办法转换成动态规划问题,然后求解;
这一点是因为歧义问题,有些人认为清华大学不用拆,有些人认为清华大学需要拆分成清华 和 大学
我觉得吧,不必去争论这些乱七八糟的问题,毕竟即使把嘴皮磨破了也无法说服某些人,要么忽略,要么用数学方法把这个问题解决掉;
调查发现人们对分词的一致性也只有80%-90%
但是其实可以忽略这一点;
更好的做法是让分词器支持不同层次的词的切分;
这是针对上述分词的不一致问题提出的解决方案,即清华大学的粒度比较大,而再拆分成:清华、大学粒度就比较小了;
之前提到过,其实模型很简单:
假设s1, s2, s3为发送者发送的信息,o1, o2, o3为接收端观测到的信号,那么如何根据o来推测s就是类似于语音识别了,这个问题怎么求解呢?
就是将条件概率最大化:
P(s1, s2, s3 | o1, o2, o3)
一堆数学公式不太好编辑:贝叶斯公式对上述公式做了变形,然后介绍了马尔可夫链,然后隐含马尔可夫模型,然后就能求解了;
个人觉得,某个实际问题不能解决,一般是因为两种障碍:
自然语言处理面临的就是第二个问题,采取的解决方案是马尔可夫提出的偷懒的办法,就是上面讲的N元模型;
介绍了如何训练隐含马尔可夫模型
和
一个无监督学习的算法:鲍姆-韦尔奇算法
无监督学习不能有效的找到全局最优点;