预备知识

熵

熵H(X)又称自信息,是描述一个随机变量不确定性大小的量,熵越大则不确定性越大,则需要用更多的信息量来消除这种不确定性。前面《浅谈机器学习基础》中讲决策树的时候就提到了香农熵。
在只掌握关于未知分布的部分知识的情况下,符合已知知识的概率分布可能有多个,但使熵值最大的概率分布真实的反映了事件的分布情况。以此为依据构建的模型叫做最大熵模型,后面会详细讲,这里只做简单介绍。
然后是联合熵H(X,Y)、条件熵H(Y|X)和互信息I(X;Y):
联合熵、条件熵、互信息
熵H(X)是描述一个随机变量X所需要的信息量,而联合熵H(X,Y)就是描述两个随机变量X和Y所需要的信息量,联合熵大于或等于这两个变量中任一个的熵。
互信息I(X;Y)描述的是两个随机变量X和Y之间的相关性,也即已知X后,Y不确定性的减少量(熵H(Y)的减少量),反之亦成立。换句话讲,X与Y关联越大,越相关,则互信息I(X;Y)越大。
条件熵H(Y|X)就是在已知X的条件下,Y的熵。因为互信息I(X;Y)的存在,已知X会使Y的熵减少,减少后的Y的熵就是H(Y|X)。
从图中也可以看出:H(X,Y) = H(X) + H(Y|X) = H(Y) + H(X|Y)。回想一下,是不是和条件概率的计算公式有相似的地方。
接下来是相对熵D(p||q),相对熵又称Kullback-Leibler差异,或简称KL距离,是衡量相同事件空间里两个概率分布相对差距的测度,当两个随机分布完全相同时,相对熵为0。当两个随机分布的差别增加时,其相对熵期望值也增大。
然后是交叉熵H(X,q),X是随机变量,q是模型。我们前面讲过交叉熵损失函数,交叉熵的概念就是用来衡量估计模型与真实概率分布之间差异情况的。而困惑度的概念与交叉熵相似,交叉熵对应的困惑度的计算方式为:2的交叉熵次方。交叉熵与困惑度都是越小越证明模型有效。

形式语言与自动机

在乔姆斯基的语法理论中,文法被划分为4种:3型文法、2型文法、1型文法和0型文法,分别称为正则文法、上下文无关文法、上下文相关文法和无约束文法。从0型文法到3型文法,对规则的约束越来越多,每一个正则文法都可以被认为是上下文无关文法,每一个上下文无关文法都是上下文有关文法,而每一个上下文有关文法都可以认为是0型文法。
正则文法要求所有含非终结符号的规则形式为A->Bx(或A->xB),分别为左线性正则文法和右线性正则文法。
上下文无关文法不要求所有含非终结符号的规则右侧为Bx或xB。
上下文相关文法对左侧的A增加了上下文要求,也即αAβ->αγβ,只有A前为α、A后为β才能进行状态转换,也可以看出,若αβ为空,也即成为了上下文无关文法。
自动机因为后面并没有用到,所以这里只简单提一下。
正则文法与有限状态自动机(FA)一一对应,FA是为研究有限内存的计算过程和某些语言类而抽象出的一种计算模型。有限状态自动机拥有有限数量的状态,每个状态可以迁移到零个或多个状态,输入字串决定执行哪个状态的迁移。有限状态自动机可以表示为一个有向图。FA又分为确定有限状态自动机(DFA)和不确定有限状态自动机(NFA),NFA可以转化为DFA。
上下文无关文法与下推自动机(PDA)一一对应。上下文相关文法与线性界限自动机相对应。无约束文法与图灵机一一对应。

语料库与语言知识库

自然语言处理系统离不开数据和知识库的支持。语料库(corpus base)就是存放语言材料的数据库,而语言知识库比语料库包含更广泛的内容,可以分为两种不同的类型:一类是词典、规则库、语义概念库等,分别与解析过程中的词法分析、句法分析和语义分析相对应;另一类语言知识存在于语料库之中,每个语言单位的出现,其范畴、意义、用法都是确定的。
这部分内容我主要想讲两种为我带来启发的知识库组织形式。
首先是知网:
知网的概念关系示意图
它着力反映概念的共性和个性,比如对于『患者』与『医生』,他们的共性是『人』,同时又具有个性,与类之间的继承关系相似;此外,还反映了概念之间以及概念的属性之间的各种关系,通过对各种关系的标注,知网把这种知识网络系统明确教给了计算机,进而使知识对计算机而言成为可计算的。
知网定义了如下各种关系:上下位关系、同义关系、反义关系、对义关系、部件-整体关系、属性-宿主关系、材料-成品关系、施事/经验者/关系主体-事件关系(医生、雇主)、受事/内容/领属物等-事件关系(患者、雇员)、工具-事件关系(手表、计算机)、场所-事件关系(银行、医院)、时间-事件关系(假日、孕期)、值-属性关系(蓝、慢)、实体-值关系(矮子、傻瓜)、事件-角色关系(购物、盗墓)、相关关系(谷物、煤田)。
然后是动态演化认知架构系统(Dynamically Evolving Cognitive Architecture System,简称DECAS),DECAS是前苹果Siri开发团队离职后所设计的bot创建平台Viv所使用的技术。这部分介绍参考了Chatbot 4: Viv能搅动bot市场吗?
DECAS中主要包含了两种对象:概念对象(Concept Object)和动作对象(Action Object),其中概念对象指的就是实体,而动作对象就是执行的动作。
概念对象之间定义了两种关系:扩展(extension),相当于“is a”的关系,比如“跑步鞋”概念对象扩展自“鞋”概念对象;属性(property),相当于“has a”的关系,比如“跑步鞋”概念对象有属性“尺码”概念对象。
动作接收一些概念对象,然后产出一些新的概念对象,类似于函数有输入和输出。动作接收的概念对象包含了两类,一类是必须要有的,没有动作就没法执行;另一类是可选的,可有可无,类似提供了默认参数。
以概念和动作对象为节点,Viv构建了规模庞大的有向网络图。概念节点到动作节点的边表示此动作以此概念为输入参数,而动作节点到概念节点的边表示此动作的输出中包含了此概念。如果两个概念节点存在扩展或者属性关系,那么它们之间也会存在有向边。随着开发者不断把新的概念和动作对象加入到Viv系统,这个网络图会逐渐延伸,越来越大。借助于Viv的动态演化认知架构系统,Viv能做的事会随着网络图的增大而指数增长。
DECAS
举一个具体的例子,有条这样的问句『我是学生,买什么Asics跑步鞋合适呢?』,Viv首先将问句进行词法分析,得到语义组块序列,然后对其进行意图识别,意图分为两部分,一部分是目标概念对象,另一部分是条件概念对象。如下图:
Viv的核心技术就是利用DECAS找到从条件概念对象到目标概念对象的连通路径,Viv把一条路径称为一个计划(Plan)。
前面提到,动作接收一些概念对象,然后产出一些新的概念对象,如果执行一个动作就可以由条件到目标,那当然直接执行下这个动作就搞定了,但显然实际情况复杂得多。
举个例子,开发者定义了两种动作,1)transform_occupation_to_price,转化职业为价格偏好;2)rec_shoes_based_on_price,转化价格偏好为跑鞋推荐。也就是上图中的计划一,这样就实现了由条件概念对象到目标概念对象的推理。当然达到目标的计划也许并不只有一个,开发者可以为每个计划设定一个价值函数,DECAS则只需要选择价值最高的topN计划具体执行即可,或者做得更复杂,比如依据用户反馈实时调整计划。
如果一个计划包含的动作所需的必须输入概念对象缺失,那么就需要与用户进行多次交互以收集缺失概念对象的值,也即多轮对话。多轮对话的目的从来不应该是为了炫技或是强行提高与用户的对话轮数,而是帮助不能清晰表达自己意思的用户补全自己的需求。

语言模型

语言模型(language model,LM)在基于统计模型的语音识别、机器翻译、汉语自动分词和句法缝隙等相关研究领域得到了广泛的应用。
目前主要采用的是n元文法模型(n-gram model),这种模型构建简单、直接,但同时也因为数据缺乏而必须采取平滑(smoothing)算法。
一个语言模型通常构建为字符串s的概率分布p(s),这里p(s)试图反映的是字符串s作为一个句子出现的频率。
对于一个由l个基元(“基元”可以为字、词或短语等,为了表述方便,以后我们只用“词”来通指)构成的句子s=w1w2…wl,其概率计算公式可以表示为:
也即产生第i个词的概率是由已经产生的i-1个词w1w2…w(i-1)决定的,这i-1个词被称为第i个词的历史,随着历史长度的增加,不同历史数目按指数级增长,这会导致我们根本无法在训练数据中对参数进行估计。
所以我们假定,出现在第i个位置上的词wi仅与它前面的n-1个历史词有关,n取多少,我们就称其为几元文法模型,一般来讲,我们一般取n