不会使用数学模型,你都不知道自己失去了什么。
文字与数字在本质上都是“信息”的载体,所以关于语言文字的识别、处理、分析,其实都符合“信息论”中的数学模型,这也是近些年来人们逐渐认识到的。
也是因为文字只是信息的载体,而信息在不同文字系统中是等价的,所以翻译这件事儿才有可能达成。著名的罗塞塔(Rosetta)石碑上分别用埃及象形文、埃及拼音文、古希腊文刻下了相同的一段信息——
罗塞塔(Rosetta)石碑
这个石碑为我们破译埃及文字提供了决定性的指导,由此我们也容易理解,为什么今天许多翻译软件和服务都叫“罗塞塔”了。这个石碑给我们一点重要的启示:语言的数据(即“语料”)对于翻译至关重要。
不仅如此,我们发现,古人为了防止信息的遗失,常常会将同样的文字重复数遍,这些“冗余”的信息就是安全性的保障。
古人在抄写时难免会有笔误,如何避免这个问题呢?聪明的犹太人在抄写《圣经》时,发明了一种数学方法,即把每个字母对应一个数字,把每一行的数字求和与原版对比看看是否一致。其实,这不就是计算机与通信中常用的“校验码”么?
犹太人抄写《圣经》要比对每一行的校验码
今天我们研究自然语言的处理,其实与古人自发的行为,有着许多共通的东西,它们就是——数学规律。
今天我们已经能经常看到可以与人类对话的机器,家中的“小爱同学”似乎越来越懂你,那么,计算机真的能理解人在说什么吗?或者说,计算机真的有“智能”么?
理解这个问题非常之重要,因为它真的可能颠覆很多人对于当今技术社会的认知。
上世纪80年代以前,科学家们的思路与现在大相径庭。当时人们觉得,要想让机器理解人的语言,或者让机器有人的智能,前提就是“让机器像人一样思考”。这就好比说人类想做一个机器可以像鸟一样飞上天,就要先模仿鸟的身体结构与动作,所以称这一类思维为“鸟飞派”,当然,后来的故事我们都知道了,人类发明了基于空气动力学的飞机。
飞机飞得好,不需要像鸟
自然语言处理或者说人工智能,最终的解决方案,并不是鸟飞派的技术路线,而是采用“基于统计的语言模型”,简单地说,机器其实完全不知道人在说什么,但是它可以根据以往学习到的数据,计算出各种可能性,让我们感觉——“它听懂我说的了”。
其实,语言的本质就是“通信”,通信模型说的很清楚:信息先通过发出者进行编码,也就是把信息转换成语言,再由接收者解码,也就是听懂。所以计算机作为接收者,目标就是完成解码任务。
所以,从语言的本质角度来思考,我们人类能“听懂”一句话,或者能识别一个词的涵义,主要原理其实也是统计出来的——我们根据上下文的“语境”,再结合以前的“经验”,分析出“最有可能”的真实语义。
那么,这个过程如何才能可以用计算机计算出来呢?
“语境”说起来简单,但具体实现却很难,一句话中第N个词可能与前面所有词都有关系,这样计算量就非常大了。数学家们的实际做法是,采用一个简化假设,假设某个词只与它前面那一个词有关,这个假设其实就是数学上有名的“马尔可夫假设”,这种语言模型由于只考虑2个词,所以称为“二元模型”。
这个“马尔可夫假设”最初是研究“随机过程”时提出的,什么叫随机过程呢?我们说一个变量是随机变量,其实意思是这个变量是相对静止的,它与其它变量的变化不会有什么关联。而随机过程就是指在任何一个时刻t,对应的状态st都是随机的。比如我们可以把s1,s2,...,st看成是北京每天的最高气温,那么每个s都是随机的,同时,任一天的s都与以前的最高气温有关。
这就比较复杂了,很难分析得清楚;马尔可夫就提出一种简化假设,即随机过程中各个状态si的概率分布,只与它前一个状态s(i-1)有关——
公式简化了,计算容易了
马尔可夫假设,是机器学习领域中的重要思想与工具,也是我们在计算领域常用的思维之一,有点类似于咱们讲过的微积分工具中的一阶导数逼近,是对次要原因的忽略。
但是,我们不禁会想,如果多考虑几个词,是不是准确性会更高呢?确实是这样,不过实际应用中已经总结出,当从考虑1个词到2个词再到3个词时,模型的效果显著增强,但是多到4、5个词以后,模型效果几乎就不太有提升了,而计算量却大许多。所以,目前业内实际应用最多的是“三元模型”,实现准确度与计算量之间的平衡。
思考一个简单的问题:一次考试中,我想知道我们班小A和小B谁考得更好,“需要多少信息量呢”?显然,1比特就足够了,也就是说是2选1(可以用0或1来表示结果)的问题。
那么,如果有4个学生,问谁考第一,需要多少信息量呢?注意,答案是2比特而不是4比特,因为我们只需要提问2次就能问出来,第一句我们提问“第一名是在AB中呢还是在CD中呢”,回答者可以用1比特来解答,比如用1来表示第一名在AB中,然后我们再问一次就知道是AB中的谁了。
所以,问N个学生中问谁考第一名,我们需要的信息量是——log2(N)。
也就是说,信息量大是因为不确定性大,信息量就等于不确定性,而信息的作用就是消除不确定性。
这种信息量的量化表示就称为“信息熵”(Entropy),是因为在物理学中,我们把系统的混乱度称为熵,此处两者的意义是完全相同的。“信息熵”的概念是1948年香农(Shannon)在神作论文《通信的数学原理》中首次提出。
香农(Shannon)的神作《通信的数学理论》
那么,我们把问题稍微复杂一点点,还是小A与小B两个同学,刚才我们是假设这两个同学的学习水平一样,也就是说他们俩谁考得好的概率都是0.5;但我们现在又了解到在平时测验中,小A考得更好的概率是0.6,而小B考得更好的概率是0.4,既然我们已知了有用的信息,那么我们按理来说,只需要比刚才1比特更少的信息就可以解答问题了,香农指出,我们还需要的信息熵可用以下算式计算:
H = -(0.4*log2(0.4)+0.6*log2(0.6)) = 0.9710
注意算式中考虑的概率如果换成上面的0.5,结果就变回1比特了。完整的信息熵计算公式如下:
信息熵计算公式
有了这个公式,我们就可以量化各种信息了,比如一本50万字的中文书籍,它的信息熵有多大呢?
我们知道,常用汉字约7000字,假如等概率使用,平均每个汉字需要13比特的信息熵;但其实真实情况不是等概率的,最常用的10%的汉字占常用文本的95%以上,如下图所示,这样每个汉字约占9比特信息熵,如果再考虑上下文相关性,又可以降到5比特。所以一本50万字的书的信息量大约是250万比特。这样就实现了信息的量化。
(关于概率论相关基础知识可参见科技千里眼概率统计专栏)
当我们想获得某一方面的信息时,最先想到的,就是去搜索引擎找一找,而搜索结果的好坏,很大程度上取决于其背后所依靠的数学原理。近些年高等数学受到空前重视,也可能是因为大家发现IT巨头背后的很多核心技术都是基于数学理论,发现了数学应用的价值。
比如我们现在熟知的“布尔代数”,当年发明它时人们完全不知道这有什么用,直到80年后香农指出用布尔代数可以实现开关电路,最终成为了计算机的数字电路的基础。(相关知识可参见计算机原理专栏)
而其实目前所有的搜索引擎,也都逃不出布尔代数的框架体系。
在布尔代数的世界中,万物均可量子化。
布尔代数这么厉害,可是把布尔运算所有定律放一块,也仅仅12条——
布尔运算12条定律
这么简单的形式,却几乎是整体数字领域的基石,真应了牛顿的那句:“真理在形式上从来都是简单的”。
另外,搜索引擎中还应用到了大量的“图论”。图论,其实是一门彻彻底底的数学,它与数理逻辑、集合论、近世代数并称为离散数学的四大分支,其中数理逻辑就是以前面讲的布尔运算为基础的一门数学。
图论中的“图”,是指由一些给定的点及连接两点的线所构成的特殊图形,点就代表事物,连线就代表两个事物间的关系。所以,从这个角度看,互联网虽然复杂,但是说穿了就是一张大图而已,每个点就是一个网页,每条线就是一个超链接。
这个世界的网络其实就是一张大“图”
作为一款搜索引擎,要想完成对全网络的搜索,首先就是要用一个自动程序对整个这张大图实现一个“遍历”,把这些点都找到并保存下来,这个程序就是我们常说的“网络爬虫”。有趣的是,数学中的遍历算法已经出现几十年了,而网络爬虫的需求才使得遍历算法一下子有了用武之地。
搜索引擎的结果优劣,就在于是否把用户想看到的高质量结果放在了前面,那么如何定量地计算出一个网页的“质量”和与检索词的“相关性”呢?
首先我们研究关于“网页质量”的问题。目前世界上以谷歌为首的搜索引擎,都以一条简单的原则为基础,那就是如果一个网页被很多其他网页所链接,说明它受到普遍的承认,那么它的质量就高。另外,如果链接这个网页的页面中有许多是高质量的网页,那么也认定本网页质量较高。这两条规则不仅是有点绕嘴,而且不知道大家是否发现了一个问题——
“在判定一个网页质量时,首先需要知道链接它的其它网页的质量”。
这不就是一个“先有鸡还是先有蛋”的问题么?似乎无从下手啊。
先有鸡还是先有蛋?
其实,像这一类问题,有一种很简洁而神奇的计算方法,那就是“迭代算法”,就是一轮一轮地算,无论初始值如何选取,这种算法都能保证最终的计算结果收敛到真实值。
这种算法还有一个高明之处,那就是它把整个互联网当作一个整体来看待,这无形中符合了“系统论”的观点。谷歌的创始人佩奇也是因为他发明的这个算法当选为了美国工程院院士。
网页质量高,但是与用户搜索的词相关性差,也不行。
举个例子,现在用户搜索的是“原子能的应用”,显然分成两个词:“原子能”和“应用”,因为“的”这个词几乎没有任何意义,称为“停止词”,在这里可以直接忽略。
我们就会想,那就把页面里包含这两个词多的网页靠前呗?不可以,因为有些网页篇幅很长,它的相关性可能并不强,但是它出现这几个词的次数就是多啊。
所以,我们可以处理一下,把关键词的次数进行“归一化”,也就是用关键词的次数除以网页的总字数,这就是“词频”(TF)的概念。那么,词频总和最大的,就靠前,可以么?
也不行。比如“应用”这个词,是个很通用的词,而“原子能”是个很专业的词,所以后者一定是有更重要的意义的,因此,应该给每个词加一个权重,这个权重就是一个很高级的概念了,称为“逆文本频率指数”(IDF),是信息检索中最重要的发明。
这个IDF的意思就是说,如果一个关键词只在很少的网页中出现,通过它就更容易锁定目标,它的IDF(权重)就应该越大。
TF-IDF算法
这里的TF-IDF算法,就是目前人类搜索引擎做网页排名的核心算法。
标题没有错,数学就是这么神奇,看似无关的事物,到最后都可以用数学统一在一起。
信息时代,海量的新闻如何能用计算机自动完成分类呢?
首先,我们要以计算机的角度来认识新闻,把每个新闻表示成一个“向量”,称为“特征向量”。所谓向量就是一列数字,怎么得到这一列数字比较合理呢?方法就采用上面提到的TF-IDF算法:咱们先找到词汇表,比如有64000个词,那么就依次计算每个词的TF-IDF值,这样,就得到了一列长度为64000的向量。
这样,新闻就变形了向量,那么,如何计算这些向量的相似性呢?其实,在数学中,两个向量的余弦就是用来表征向量的相似度的。咱们可以先从最简单的2维向量(平面向量)上分析,如图两个向量画在平面上,夹角余弦为1时,说明夹角为0,说明两条新闻类型完全相同;如果余弦为0,此时夹角为90度,两条向量正交,则说明两条新闻的根本没有相同的主题词,它们的类型完全不同。
计算出了新闻之间的两两相似性,就很容易分类了;可以采用一个自底向上不断合并的办法,先把相似性大于一个阈值的新闻合并成一个小类,再把小类作为一个整体合并成大类,当一个大类中的一些新闻之间的相似性小到一定程度就应该停止合并了。这个过程称为“分类聚合”。
上面提到了对于特征向量进行两两计算,这样会迭代很多次,耗时特别长。有一个比较好的替代办法就是使用“矩阵”中的“奇异值分解”。
咱们一起来看一下奇异值分解是怎么一回事。
比如现在有一个超大矩阵A,A的尺寸是100万行50万列,代表着100万个词与50万个主题之间的关联性。奇异值分解,简单地说,就是完成矩阵A的乘法分解,形式如下:
A = XBY
其中,X的尺寸为100万行100列,B为100行100列,Y为100行50万列。
这样,不仅存储空间大大减少,由原来的5000亿个元素减为现在的1.5亿个元素,而且,XBY三个矩阵也具有非常重大的意义,其中,X表示词与词类关联,B表示词类与文类的关联,Y表示文类与主题的关联,这样一次的计算就完成了这么多的工作,可以说是非常漂亮!
这里我们再一次地体会到了矩阵的神奇之处,感兴趣的同学可参见科技千里眼的线性代数专栏。
吴军老师的《数学之美》中让人惊喜和启迪的内容还有许多,吴老师用具体的实际应用为我们展示了数学模型的力量——那是一种与众不同的深刻的认知力。
吴军老师——中国科技工作者的指路明灯