假设你在输入法中输入"xianzaiquna",输出的可能是:
显然"西安在去哪"是一句极其别扭不通的句子,所以我们会很自然的选择输出"现在去哪",但是输入法没有我们那么智能能够一下子就判断出要输出哪一句话,输入法会计算出两个句子的概率值,然后通过比较选择概率值大的句子作为最终的输出结果,计算句子概率值的工具就是语言模型。
语言模型的应用非常广泛,比如在输入法中输入拼音可以智能预测可能的输出结果,或者在谷歌或者百度搜索时自动填充可能的搜索文本等都是语言模型的应用。语言模型是很多涉及到产生文字或预测文字概率的NLP问题的组成部分,比如神经网络机器翻译的Seq2Seq模型可以看作是一个条件语言模型,它相当于是在给定输入的情况下对目标语言的所有句子估计概率,并选择其中概率值最大的句子作为输出。
假设一门语言中所有可能的句子服从某一个未知的概率分布,这门语言中的所有句子出现的概率之和为1,给定其中某个句子
,语言模型(Language Model, LM)的任务就是预测句子
在语言中出现的概率。显然我们没有办法枚举出这一门语言的所有句子,因此只能采样一个小型的样本空间,称为语料库。于是,这个未知的概率分布就统计自某个人工标注而成的语料库。
现在我们人工标注一个小型的语料库,语料库中共有三个句子:
商品 和 服务
商品 和服 物美价廉
服务 和 货币
基于这个小型语料库的计数统计,我们可以估计出世界上任何一个汉语句子的概率:
,其它所有的句子的概率都为0,这就是语言模型。
显然在真实场景中使用的语料库要比上面的小型语料库复杂庞大的多,但是无论多么庞大的语料库都会面临下面两个问题:
显然靠简单的枚举是不可行的,我们需要一种可计算、更合理的概率估计方法。句子无限多个,但是组成句子中的单词确实有限的。于是考虑从单词构成句子的角度出发去建模句子,把句子表示成
,其中
为第i个单词。
现在将计算句子
的概率值转换为计算
的概率值,根据全概率公式
可得:
其中,
(Begin OF Sentence, 有时也用<s>
),
(End OF Sentence, 有时也用</s>
),它们是用来标记句子首尾的两个特殊"单词"。计算出这些条件概率值,将这些条件概率值相乘即可求出句子
的概率值。现在的问题就变成如何计算这些条件概率值?
这里使用极大似然估计的方法来计算每个条件概率值,简单来说利用数据集
的似然函数来估计条件概率值,一般假设数据集中的句子都是都是相互独立的,将数据集
的似然函数
中的每个句子展开成条件概率值的形式,然后等式两边取log对数,将似然函数中的乘法转换成具体的加法。此时的参数为这些条件概率,我们需要找出使得数据集
可能性最大的条件概率参数,极大似然估计的形式定义为
,不过需要注意这些条件概率参数是有天然的条件的,比如对于
条件概率:
,此时的
为词汇集合;
,概率值介于0~1之间;
求解有约束的最优化问题最简单的方法就是利用拉格朗日乘数法。利用极大似然估计计算的条件概率值为:
其中,
表示
的计数。
现在我们来利用上面那个具有三个句子的小型语料库来计算一下"商品 和 服务"这句话的概率值,需要在句子的首尾分别添加
和
标记:
其中:
,
只需要统计语料库中"商品"作为第一个单词出现的次数为2,
只需要统计语料库中所有单词作为第一个单词出现的次数为3,即
;
,
只需要统计语料库中"BOS 商品 和"出现的次数为1,
只需要统计语料库中"BOS 商品"出现的次数为2,即
;
同理
,
。整个句子的概率值为四个条件概率的乘积:
在实际的语料库中词汇量(单词的数量)会非常大,因此单词组合更是不计其数。假设现在有一个语料库的词汇量为
,如果要将
的所有参数都保存在一个模型里,将需要
个参数。通常句子会比较长,因此一般情况下计算代价会非常大,即使使用一些优化方法(比如字典树索引等)计算代价依然不菲。
为了估计这些参数的取值,常见的方法有n-gram模型、决策树、最大熵模型以及神经网络语言模型等。
参考:
本文分享自 AI机器学习与深度学习算法 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!