学习算法你必须知道的一些基础知识(文末福利)

点击标题下「异步社区」可快速关注

机器学习是解决很多文本任务的基本工具,本文自然会花不少篇幅来介绍机器学习。要想搞明白什么是机器学习,一定要知道一些概率论和信息论的基本知识,本文就简单回顾一下这些知识。

1.1 概率论

概率就是描述一个事件发生的可能性。我们生活中绝大多数事件都是不确定的,每一件事情的发生都有一定的概率(确定的事件就是其概率为100%而已)。天气预报说明天有雨,那么它也只是说明天下雨的概率很大。再比如掷骰子,我把一个骰子掷出去,问某一个面朝上的概率是多少?在骰子没有做任何手脚的情况下,直觉告诉你任何一个面朝上的概率都是1/6,如果你只掷几次,是很难得出这个结论的,但是如果你掷上1万次或更多,那么必然可以得出任何一个面朝上的概率都是1/6的结论。这就是大数定理:当试验次数(样本)足够多的时候,事件出现的频率无限接近于该事件真实发生的概率。

假如我们用概率函数来表示随机变量xX的概率分布,那么就要满足如下两个特性

联合概率p(x,y)表示两个事件共同发生的概率。假如这两个事件相互独立,那么就有联合概率p(x,y) = p(x)p(y)。

条件概率p(y | x)是指在已知事件x发生的情况下,事件y发生的概率,且有p(y | x) = p(x,y)/p(x)。如果这两个事件相互独立,那么p(y | x)与p(y)相等。

联合概率和条件概率分别对应两个模型:生成模型和判别模型。我们将在下一章中解释这两个模型。

概率分布的均值称为期望,定义如下

期望就是对每个可能的取值x,与其对应的概率值p(x),进行相乘求和。假如一个随机变量的概率分布是均匀分布,那么它的期望就等于一个固定的值,因为它的概率分布p(x)=1/N

概率分布的方差定义如下

可以看出,方差是表示随机变量偏离期望的大小,所以它是衡量数据的波动性的,方差越小表示数据越稳定,反之,方差越大表示数据的波动性越大。

另外,你还需要知道的几个常用的概率分布:均匀分布、正态分布、二项分布、泊松分布、指数分布,等等。你还可以了解一下矩阵的知识,因为所有公式都可以表示成矩阵形式。

1.2 信息论

假如一个朋友告诉你外面下雨了,你也许觉得不怎么新奇,因为下雨是很平常的一件事情,但是如果他告诉你他见到外星人了,那么你就会觉得很好奇:真的吗?外星人长什么样?同样两条信息,一条信息量很小,一条信息量很大,很有价值,那么怎么量化这个价值呢?这就需要信息熵,一个随机变量X的信息熵定义如下

信息越少,事件(变量)的不确定性越大,它的信息熵也就越大,搞明白该事件所需要的额外信息就越多,也就是说搞清楚小概率事件所需要的额外信息较多,比如说,为什么大多数人愿意相信专家的话,因为专家在他专注的领域了解的知识(信息量)多,所以他对某事件的看法较透彻,不确定性就越小,那么他所传达出来的信息量就很大,听众搞明白该事件所需要的额外信息量就很小。总之,记住一句话:信息熵表示的是不确定性的度量。信息熵越大,不确定性越大。

联合熵的定义为

联合熵描述的是一对随机变量XY的不确定性。

条件熵的定义为

条件熵衡量的是:在一个随机变量X已知的情况下,另一个随机变量Y的不确定性。

相对熵(又叫KL距离,信息增益)的定义如下

相对熵是衡量相同事件空间里两个概率分布(函数)的差异程度(而前面的熵衡量的是随机变量的关系)。当两个概率分布完全相同时,它们的相对熵就为0,当它们的差异增加时,相对熵就会增加。相对熵又叫KL距离,但是它不满足距离定义的3个条件中的两个:(1)非负性(满足);(2)对称性(不满足);(3)三角不等式(不满足)。它的物理意义就是如果用q分布来编码p分布(一般就是真实分布)的话,平均每个基本事件编码长度增加了多少比特。

两个随机变量XY,它们的互信息定义为

互信息是衡量两个随机变量的相关程度,当XY完全相关时,它们的互信息就是1;反之,当XY完全无关时,它们的互信息就是0。

对于xy两个具体的事件来说,可以用点互信息(Pointwise Mutual Information)来表示它们的相关程度。后面的章节就不做具体区分,都叫作互信息。

互信息和熵有如下关系

互信息和KL距离有如下关系

如果XY完全不相关,

,则

,互信息也为0。可以看出互信息是KL距离的期望。

交叉熵的定义如下

它其实就是用分布q来表示X的熵是多少,也就是说用分布q来编码X(其完美分布是p)需要多付出多少比特。

好了,介绍了这么多概念公式,那么我们来个实际的例子,在文本处理中,有个很重要的数据就是词的互信息。前面说了,互信息是衡量两个随机变量(事件)的相关程度,那么词的互信息,就是衡量两个词的相关程度,例如,“计算机”和“硬件”的互信息就比“计算机”和“杯子”的互信息要大,因为它们更相关。那么如何在大量的语料下统计出词与词的互信息呢?公式中可以看到需要计算3个值:p(x)、p(y)和p(x,y)。它们分别表示x独立出现的概率,y独立出现的概率,xy同时出现的概率。前两个很容易计算,直接统计词频然后除以总词数就知道了,最后一个也很容易,统计一下xy同时出现(通常会限定一个窗口)的频率,除以所有无序对的个数就可以了。这样,词的互信息就计算出来了,这种统计最适合使用Map-Reduce来计算。

1.3 贝叶斯法则

贝叶斯法则是概率论的一部分,之所以单独拿出来介绍,是因为它真的很重要。它是托马斯?贝叶斯生前在《机遇理论中一个问题的解》(An Essay Towards Solving a Problem in Doctrine of
Chance
)中提出的一个当时叫“逆概率”问题。贝叶斯逝世后,由他的一个朋友替他发表了该论文,后来在这一理论基础上,逐渐形成了贝叶斯学派。

贝叶斯法则的定义如下

p(x | y)称为后验概率,p(y | x)称为似然概率,p(x)称为先验概率,p(y)一般称为标准化常量。也就是说,后验概率可以用似然概率和先验概率来表示。这个公式非常有用,很多模型以它为基础,例如贝叶斯模型估计、机器翻译、Query纠错、搜索引擎等等。在后面的章节中,大家经常会看到这个公式。

好了,这个公式看着这么简单,到底能有多大作用呢?我们先拿中文分词来说说这个公式如何应用的。

中文分词在中文自然语言处理中可以算是最底层、最基本的一个技术了,因为几乎所有的文本处理任务都要首先经过分词这步操作,那么到底要怎么对一句话分词呢?最简单的方法就是查字典,如果这个词在字典中出现了,那么就是一个词。当然,查字典要有一些策略,最常用的就是最大匹配法。最大匹配法是怎么回事呢?举个例子来说,要对“中国地图”来分词,先拿“中”去查字典,发现“中”在字典里(单个词肯定在字典里),这时肯定不能返回,要接着查,“中国”也在字典里,然后再查“中国地”,发现它没在字典里,那么“中国”就是一个词了;然后以同样的方法处理剩下的句子。所以,最大匹配法就是匹配在字典中出现的最长的词。查字典法有两种:正向最大匹配法和反向最大匹配法,一个是从前向后匹配,一个是从后向前匹配。但是查字典法会遇到一个自然语言处理中很棘手的问题:歧义问题。如何解决歧义问题呢?

我们就以“学历史知识”为例来说明,使用正向最大匹配法,我们把“学历史知识”从头到尾扫描匹配一遍,就被分成了“学历\史\知识”,很显然,这种分词不是我们想要的结果;但是如果我们使用反向最大匹配法从尾到头扫描匹配一遍,那就会分成“学/历史/知识”,这才是我们想要的分词结果。可以看出用查字典法来分词,就会存在二义性,一种解决办法就是分别从前到后和从后到前匹配。在这个例子中,我们分别从前到后和从后到前匹配后,将得到“学历\史\知识”和“学/历史/知识”,很显然,这两个分词都有“知识”,那么说明“知识”是正确的分词,然后就看“学历\史”和“学/历史”哪个是正确的。从我们的角度看,很自然想到“学/历史”是正确的,为什么呢?因为(1)在“学历\史”中“史”这个词单独出现的概率很小,在现实中我们几乎不会单独使用这个词;(2)“学历”和“史”同时出现的概率也要小于“学”和“历史”同时出现的概率,所以“学/历史”这种分词将会胜出。这只是我们人类大脑的猜测,有什么数学方法证明呢?有,那就是基于统计概率模型。

我们的数学模型表示如下:假设用户输入的句子用S表示,把S分词后可能的结果表示为A:A1, A2,…, Ak(Ai表示词),那么我们就是求条件概率p(A | S)达到最大值的那个分词结果。这个概率不好求出,这时贝叶斯法则就用上派场了,根据贝叶斯公式改写为

显然,p(S)是一个常数,那么公式相当于改写成

其中,p(S | A)表示(A)这种分词生成句子S的可能性;p(A)表示(A)这种分词本身的可能性。

下面的事情就很简单了。对于每种分词计算一下p(S | A)p(A)这个值,然后取最大的,得到的就是最靠谱的分词结果。比如“学历史知识”(用S表示)可以分为如下两种(当然,实际情况就不止两种情况了):“学历\史\知识”(用A表示,A1=学历,A2=史,A3=知识)和“学/历史/知识”(用B表示,B1=学,B2=历史,B3=知识),那么我们分别计算一下p(S | A)p(A)和p(S | B)p(B),哪个大,就说明哪个是好的分词结果。

但是

这个公式并不是很好计算,

可以认为就是1,因为由

必然能生成S,那么剩下的问题就是如何计算

在数学中,要想简化数学模型,就要利用假设。我们假设句子中一个词的出现概率只依赖于它前面的那个词(当然可以依赖于它前面的 m 个词),这样,根据全概率公式

就可以改写为

接下来的问题就是如何估计

。然而,

,这个问题变得很简单,只要数一数(

)这对词在统计的文本中前后相邻出现了多少次,以及Ai?1本身在同样的文本中出现了多少次,然后用两个数除以它就可以了。

上面计算

的过程其实就是统计语言模型,然而真正在计算语言模型的时候,要对公式进行平滑操作。Zipf定律指出:一个单词出现的频率与它在频率表里的排名(按频率从大到小)成反比。这说明对于语言中的大多数词,它们在语料中的出现是稀疏的,数据稀疏会导致所估计的分布不可靠,更严重的是会出现零概率问题,因为

的值有可能为0,这样整个公式的值就为0,而这种情况是很不公平的,所以平滑解决了这种零概率问题。具体的平滑算法读者可以参考论文《An Empirical Study of Smoothing Techniques for Language Modeling》。

然而在实际系统中,由于性能等因素,很少使用语言模型来分词消歧,而是使用序列标注模型(后面章节会讲到)、语料中词与词的共现信息、词的左熵(该词左边出现过的所有词的信息熵之和)和右熵(该词右边出现过的所有词的信息熵之和),以及一些词典等方法来消歧。新词发现技术也和这个技术差不多。

1.4 问题与思考

1.熵、相对熵和交叉熵的物理意义是什么?

2.贝叶斯法则的优缺点是什么,有哪些应用?



本文摘自《文本上的算法——深入浅出自然语言处理》

《文本上的算法——深入浅出自然语言处理》

路彦雄 著

点击封面购买纸书

自然语言处理是研究人机之间用自然语言通信的理论和方法,是人工智能领域的一个重要分支,有着非常广泛的应用空间。

本书结合作者多年学习和从事自然语言处理相关工作的经验,力图用生动形象的方式深入浅出地介绍自然语言处理的理论、方法和技术。本文抛弃繁琐的证明,提取出算法的核心,帮助读者尽快地掌握自然语言处理所必备的知识和技能。

通过本书,你将学习和理解:

★ 概率论、信息论、贝叶斯法则等基础知识;

★ 机器学习和深度学习的热门话题;

★ 程序优化的方法;


PageRank和相似度计算的原理;

★ 搜索引擎的原理、架构和核心模块;

★ 各种推荐算法的原理和工作机制;

★ 自然语言处理和对话系统等技术难题。

本书适合从事自然语言处理相关研究和工作的读者参考,尤其适合想要了解和掌握机器学习或者自然语言处理技术的读者阅读。

小福利

关注【异步社区】服务号,转发本文至朋友圈或 50 人以上微信群,截图发送至异步社区服务号后台,并在文章底下留言,分享你的试读体验,我们将选出3名读者赠送《文本上的算法——深入浅出自然语言处理》1本,赶快积极参与吧! 活动截止时间:2018 年3月21日

在“异步社区”后台回复“关注”,即可免费获得2000门在线视频课程;推荐朋友关注根据提示获取赠书链接,免费得异步图书一本。赶紧来参加哦!

扫一扫上方二维码,回复“关注”参与活动!

阅读原文,购买《文本上的算法——深入浅出自然语言处理》

阅读原文

原文地址:http://blog.51cto.com/13127751/2087523

时间: 2024-10-11 12:38:08

学习算法你必须知道的一些基础知识(文末福利)的相关文章

学习 python 的 pytest 框架需要的基础知识和学习准备

学习 python 的 pytest 框架需要的基础知识和学习准备测试从业者学习 python 应该掌握的内容: 首先是变量和数据类型,其次列表.字典以及 Json 的一些处理,再者就是循环 判断以及函数或类这些内容. 其中的重点: 1.循环判断以及字典这块是重点 2.函数和类,类的学习这块要花较多时间去学习它的集成.封装.多态等,这 是一个不断积累的过程,先把前面的东西弄清楚了,然后去学如何用函数的方 式去处理这些比较基础的内容 python 大纲学习内容详见另一篇文章 扫下方二维码 电商项目

学习笔记之二(断点调试的基础知识)

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>调试</title> <script type="text/javascript"> function writeTimesTable(timesTable){ var counter1; var writeString; for (counter1=1;count

openstack学习笔记(一)-openstack的基础知识

一.OpenStack的基础知识 openstack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache2.0许可证(兼容GPLv3以及DFSG)授权的自由软件和开放源代码项目. OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作.OpenStack支持几乎所有类型的云环境,项目目标是提供实施简单.可大规模扩展.丰富.标准统一的云计算管理平台.OpenStack通过各种互补的服务提供了基础设施即服务(IaaS)的解决方案,

Python学习之路(三):基础知识之运算符

1.while循环 1.1 while基本格式 while循环体格式为: while 循环条件: 循环体1 循环体2 1 count = 1 2 while count <= 10: # 循环条件的关键在于控制循环次数 3 if count != 7: 4 print(count) 5 count = count + 1 1.2 break 运用break能够在适当的条件下终止循环,即跳出当前循环,执行循环外下面的语句. 1 num = 1 2 while num < 3: 3 print(n

机器学习算法推导过程中的数据基础知识

1.向量.矩阵求导 当然了,这里补充一下求解过程中的关于向量.矩阵求导的几个公式: 这里其实只需要明白第一个,后边的三个都可以由第一个简单的推导而来. 注意这里对列向量AX的每一项的求导写为行,不然就会得到一个超越矩阵,我们不采用这种方式.

学习笔记(十一)——Linux Shell 基础知识

1. shell 特性: 使用 history 命令查看命令历史: [[email protected] ~]# history 用户的 history 记录位于用户家目录下 .bash_history 文件中: [[email protected] ~]# vim ~/.bash_history 有关 history 的相关快捷操作: [[email protected] ~]# !!    //上一条命令 [[email protected] ~]# !$    //上一条命令的最后一个参数

cocos2d-x学习笔记1——项目的创建和基础知识

一.创建第一个cocos2d-x项目 二.cocos2d-x项目结构 三.AppDelegate类 四.运行第一个cocos2d-x项目 五.修改游戏窗口大小

Java学习之路(一)Java基础知识

标识符(命名规范) 标识符由字母.数字.下划线.¥.$.中文组成: 首字母不能使用数字: 不能与系统关键字重名: 长度无限制,区分大小写: 类名:每个首字母大写: 包名:全部小写: 方法名:第一个单词小写,其他首字母大写: 变量:小写: 常量:大写: 基本数据类型 整数 byte 字节型 short 短整型 int 整数 long 长整型 基本数据类型 浮点数 double 双精度型 float   单精度型   字节型 char 0 —65535   布尔型 Boolean(true.fals

Log4net学习系列(一)——Log4net的基础知识学习

今天把Log4net日志记录做了封装,作为一个公共的类库.记录一下应该注意的地方.先了解一下log4net的理论知识. 参考百度百科 一.log4net是什么? log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具. log4net是Apache软件基金会Apache Logging Services工程的一部分.Apache日志服务工程致力于为程序调试和审计提供跨语言的日志服务. 二.l