语言模型的深入理解

NLP发展历史简要

自然语言处理,通俗的说就是利用计算机来处理和分析人类的语言,最终期望计算机在理解语言上像人类一样智能。众所周知,自然语言天然就是序列形式的,因此NLP所面临的一个最基本的问题就是分析这些文字序列的基本规律。那么如何去描述文字序列的规律?这就产生了理性主义和经验主义两大阵营。

理性主义认为人类的智能行为可以使用符号系统来模拟,智能的基本单位是符号,认知过程就是在符号的表征下进行符号运算,因此思维就是符号运算(有图灵机那味了)。他们主张采用公理化、形式化的方法,严格按照一定的规则来描述自然语言的特征,通常是用一些符号来编写语言知识的表示体系(好比编译原理中的文法),以此来建立所谓的“普遍语法”,这个流派的代表人物是乔姆斯基(学过编译原理的人应该十分清楚了)。

另一派经验主义的人认为,我人类泱泱发展了几十万年,复杂多样的语言现象岂能是用规则就能给穷尽的,语言学的研究必须以语言事实作为依据,必须详尽大量的占有材料,才有可能在理论上得出比较可靠的结论。这一派的研究通常是利用概率和统计的方法去分析现存语料库,以此来自动地获取语言知识(这些知识就是以概率的形式存在)。

两派的掐架从上世纪三十年代持续到九十年代,最后以经验主义的获胜告终。中间发生或许多比较有趣的事情,比如IBM的杰里内克(经验主义)曾在一个会议上公开说到:“每当我解雇一个语言学家,语音识别系统的性能就会改善一些(Every time I fire a linguist, the performance of the recognizer improves)”,可以说是侮辱性极强了……

早期无论是理性主义的基于规则的方法还是经验主义的基于统计的方法,最终语言知识的表示形式还是离散的、符号化的,这个种方式也被称为符号主义(Symbolicism)。到了二十一世纪,得益于海量的数据和算力的巨大提升,联结主义(Connectionism)开始兴起,该流派认为人工智能来源于对人脑机制的模拟,知识是分布在神经网络内相互连接的神经元中,当这些神经元的刺激超过了某个阈值,这些神经元将被激活,神经元的整体活动构成了人类的认知。相比于传统的统计方法,神经网络方法是通过人工构建深层的神经网络去自动表示、探索和模拟数据间的潜在关系,这种方法在今天成为了主流。

总结一下各种主义的关系:
在这里插入图片描述
NLP的一些简要发展历史就铺垫到这,感兴趣可以查阅更多资料,回到正题。

什么是语言模型?

前述我们说过NLP一个最基本的问题就是分析文字序列的基本规律,这个任务就是语言模型(Language Model)。在经验主义范式下(无论是统计方法还是深度学习方法),我们都离不开概率统计这个强有力的工具。语言模型可以被定义为,计算一个句子X的概率问题,而句子的基本语义单位是单词,因此: P ( X ) = P ( w 1 w 2 … w m ) P(X)=P(w_{1} w_{2} \ldots w_{m}) P(X)=P(w1w2wm)

这个式子显然可以进行分解,根据链式法则,得到:
P ( w 1 w 2 … w m ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 1 w 2 ) … P ( w m ∣ w 1 w 2 … w m − 1 ) ( 1 ) P\left(w_{1} w_{2} \ldots w_{m}\right)=P\left(w_{1}\right) P\left(w_{2} \mid w_{1}\right) P\left(w_{3} \mid w_{1} w_{2}\right) \ldots P\left(w_{m} \mid w_{1} w_{2} \ldots w_{m-1}\right) (1) P(w1w2wm)=P(w1)P(w2w1)P(w3w1w2)P(wmw1w2wm1)1
这个式子其实已经可以计算了,比如利用统计方法,可以对语料库进行频次统计,利用公式:
P ( w m ∣ w 1 w 2 … w m − 1 ) = C ( w 1 w 2 … w m ) C ( w 1 w 2 … w m − 1 ) P\left(w_{m} \mid w_{1}w_{2}\ldots w_{m-1}\right)=\frac{C\left(w_{1} w_{2}\ldots w_{m}\right)}{C\left(w_{1} w_{2}\ldots w_{m-1}\right)} P(wmw1w2wm1)=C(w1w2wm1)C(w1w2wm)
其中 C C C表示该词串在语料库中出现的频次,这样可以算出每项 P P P,进而算出最后的结果。然而这样会导致:

1.参数量太大。比如词串 w 1 w 2 … w m − 1 w_{1} w_{2} \ldots w_{m-1} w1w2wm1的可能性太多,随长度爆炸式增长。
2.结果太稀疏。比如计算 P ( w m ∣ w 1 w 2 … w m − 1 ) P\left(w_{m} \mid w_{1} w_{2} \ldots w_{m-1}\right) P(wmw1w2wm1),需要统计词串 w 1 w 2 … w m − 1 w_{1} w_{2} \ldots w_{m-1} w1w2wm1出现的频数(分母),再统计这个词串后出现单词 w m w_{m} wm的频数,显然很多情况下可能分母就为0,无法计算。

马尔科夫假设

解决办法就是进行相应的假设,使得这个式子进行一定的“松弛“,以易于计算。这其实是马尔科夫链的思想体现,亦被称为马尔科夫假设,原理如下。

从(1)式直观来看, P ( w m ∣ w 1 w 2 … w m − 1 ) P\left(w_{m} \mid w_{1} w_{2} \ldots w_{m-1}\right) P(wmw1w2wm1)实际上体现了一种基于“历史”单词的模型,也就是当前词把前面的所有单词作为“历史”,并参考这个“历史”来确定或者说是生成当前词(条件概率的基本含义)。为了化简问题,一种简单的想法是使用定长历史,比如,每次只考虑前面n−1 个历史单词,这就是n-gram 语言模型。

扫描二维码关注公众号,回复: 12907009 查看本文章

比如2-gram(称为bigram,二元语言模型)就只考虑前一个单词,于是(1)式就可以简化为:
P ( w 1 w 2 … w m ) ≈ P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 2 ) . . P ( w n ∣ w n − 1 ) P(w_{1} w_{2} \ldots w_{m}) \approx P(w_{1}) P(w_{2} \mid w_{1}) P(w_{3} \mid w_{2}) . . P(w_{n} \mid w_{n-1}) P(w1w2wm)P(w1)P(w2w1)P(w3w2)..P(wnwn1)
显然这个式子就简单易算多了。

理论上参考历史越长就越精确,不过在实践中用的最多的还是二元和三元(trigram),再高就没有太大的效果了。

实际上,这种用统计来计算的方法我们成为统计语言模型,但现在我们更流行的还是基于神经网络的方法,神经语言模型借助精巧设计的神经网络,不需要对序列进行马尔科夫假设,可以直接对原始的式子即(1)式进行计算,因此不存在n-gram的问题,关于这块内容我会另写博客进行介绍。

语言模型有什么用?

现在我已经有一个语言模型,给定一个句子,该模型能给出这句话的概率,那么这玩意能有什么用?

首先,我们的概率是从整个语料库中统计出来的,这个概率本质上它体现了这句话“合理程度”,那么有了量化的标准意味着彼此可以进行比较。比如给了一堆句子,我们可以用概率来判断哪些话更通顺、更流畅、更像人话。一个例子:

你儿子在我手上,快点把钱打过来。 prob=0.80
#这样一个句子,非常“通顺合理”,就得到一个很高的概率值。

特朗普在厕所里摆满了多个艺员。 prob=0.20
#这样一个句子,非常“怪异”,也可能是有别字、语病的,就得到一个很低的概率值。

除了用来打分,语言模型的另外一个重要功能就是用来做文本生成。例如:以 “今天天气真好” 开头写个短文,我们就可以把这个序列送到模型里,显然模型可以轻易计算出下一位置填什么单词最好(即概率最高那个),然后在此基础上不断预测出下一个词。

但回过头来,按照(1)式来看,整个句子的概率是所有项概率的乘积,我们每个位置取最高概率其实并不一定是最优解,即整个句子的概率并不一定是最大。那么我们如何才能找最优解呢?这个求解的过程,或者说生成的过程叫做解码(decode),这是另外一个研究问题了。上述每个位置取最大概率的方式叫做贪心搜索 (greedy search),另外一个常用的是束搜索(Beam Search),这些方法都不能保证找到最优解,只是一种解码策略,更多详细介绍可以查阅相关资料。

reference
《机器翻译:基础与模型》
计算语言学研究70年
自然语言处理的经验主义和理性主义 - 幸福好不容易的文章 - 知乎

猜你喜欢

转载自blog.csdn.net/MoreAction_/article/details/115140051