自然语言生成之n-gram

自然语言生成之n-gram

n-gram简介

n-gram 是指的一段文本中 n 个连续词组成的片段。举例来说,在文本 a cute cat 中,1-gram 有 a, cute, cat 三个;2-gram 有 a cute, cute cat 两个;3-gram 只有 a cute cat 一个。n-gram 模型是本文要介绍的一种语言模型。另外一个用到 n-gram 的场景是 BLEU 等指标的计算。

基本思路

n-gram 是一种基于统计的语言模型(自回归式的预测句子的下一个单词),它先统计语料库中的词出现的条件概率,通过寻找当前给定词组的最大概率的下一单词来实现文本生成。符号化的表示为:
n e x t   w o r d = max ⁡ w ∈ V P ( w ∣ p r e v   w o r d ) next\ word=\max_{w\in V}P(w|prev\ word) next word=wVmaxP(wprev word)
其中, V V V 是词表, p r e v   w o r d prev\ word prev word n e x t   w o r d next\ word next word 分别是当前文本和要预测的下一个单词。n-gram 的做法就是找到语料库中最有可能跟在 p r e v   w o r d prev\ word prev word 之后的 n e x t   w o r d next\ word next word

比如通过《全唐诗》语料库训练一个 n-gram 模型,然后给出 举头望明月,低头思故 举头望明月,低头思故 举头望明月,低头思故 这样一个文本,让模型预测下一个单词。模型会发现 举头望明月,低头思故 举头望明月,低头思故 举头望明月,低头思故 这段文本只在 举头望明月,低头思故乡 举头望明月,低头思故乡 举头望明月,低头思故乡 中出现过一次,即在它统计的概率中, P ( 乡 ∣ 举头望明月,低头思故 ) = 100 % P(乡|举头望明月,低头思故)=100\% P(举头望明月,低头思故)=100% ,那么就可以确定下一个单词为 “乡”。也就是说, n-gram 预测的下一个单词是:在语料库中,最有可能与当前给定文本相连的单词。

示例

考虑下面一个示例:

词表 V = { 青椒,土豆,炒,肉片,牛肉,肉末,豆角 } V=\{青椒,土豆,炒,肉片,牛肉,肉末,豆角\} V={青椒,土豆,炒,肉片,牛肉,肉末,豆角}

语料库如下:

词1 词2 词3
句1 青椒 肉片
句2 青椒 牛肉
句3 青椒 肉片
句4 茄子 肉末
句5 茄子 豆角

如果使用 n = 3 n=3 n=3 的 n-gram 模型,即 tri-gram。要生成以 青椒炒 青椒炒 青椒炒 这段文本为条件生成下一个单词。根据语料库,有:
P ( 肉片 ∣ 青椒 炒 ) = 2 / 3 P ( 牛肉 ∣ 青椒 炒 ) = 1 / 3 P ( 豆角 ∣ 青椒 炒 ) = 0 P(肉片|青椒\ 炒)=2/3\\ P(牛肉|青椒\ 炒)=1/3\\ P(豆角|青椒\ 炒)=0 P(肉片青椒 )=2/3P(牛肉青椒 )=1/3P(豆角青椒 )=0
取最大概率,模型会生成 青椒炒肉片 青椒炒肉片 青椒炒肉片

如果使用 n = 2 n=2 n=2 的 n-gram 模型,即 tri-gram。要生成以 青椒 青椒 青椒 这段文本为条件生成下一个单词。根据语料库,有:
P ( 炒 ∣ 青椒 ) = 1 P ( 豆角 ∣ 炒 ) = P ( 肉末 ∣ 炒 ) = P ( 牛肉 ∣ 炒 ) = 1 / 5 P ( 肉片 ∣ 炒 ) = 2 / 5 P(炒|青椒)=1\\ P(豆角|炒)=P(肉末|炒)=P(牛肉|炒)=1/5\\ P(肉片|炒)=2/5 P(青椒)=1P(豆角)=P(肉末)=P(牛肉)=1/5P(肉片)=2/5
取最大概率,模型会生成 青椒炒肉片 青椒炒肉片 青椒炒肉片

然后,实际上在我们使用语言模型进行文本生成时,并不一定会取每步的最大概率。也就是说,模型也有可能生成 青椒炒豆角 青椒炒豆角 青椒炒豆角 青椒炒肉末 青椒炒肉末 青椒炒肉末 这样的文本。这些文本在语料库中是从来没有出现过的,这表明 n-gram 虽然是简单的基于统计的语言模型,但也具备一定的创造力。

步骤总结

总结起来,n-gram 方法有三个步骤:

  1. 往前看 n-1 个词
  2. 基于前 n-1个词,计算下一个词的概率分布
  3. 从对应的分布中采样出一个词

采样方式

之前我们提到,在 n-gram 进行最后一采样时,不一定会直接选每一步概率最大的词,现在介绍 n-gram 采样的几种方式。

  1. 贪婪,即直接取每步最大概率的词
    • 优点是保证每个词组都是合理,缺点是缺乏多样性
  2. 取 Top-K 概率的词,然后随机或按某种策略选词
    • 扩充了多样性
  3. beam search,每步取 Top-K 概率的词,然后搜索出总体联合概率最大的文本

关于 beam search,考虑实际生活中的这样一种场景:在写作文时,我们写了一个非常好的开头,但是写到后面发现就写不下去了,无法支撑起这个优秀的开头。此时我们有些后悔,如果开头写一个普通一些的开头,那么后面整体行文或许会更好驾驭,最终写出的全文或许会比现在这种情况更好。

同理,在文本生成时,如果每一步都选择概率最大的词,最终生成的文本并不一定就是全局最优的。beam search 的想法就是在文本生成中保留最多的可能性,每一步取 Top-K 优的词,直到最后一步,在所有可能的结果中搜索出一个全局最优的文本,作为输出结果。举例来说,如果我们设置 K=2,那么每一步会得到两个可能的单词,整个文本一共需要生成两个单词,即需采样两步,这样到最后一共会得到 2x2=4 种可能的结果,我们在这四种结果中选取最优的作为输出。此时模型的最终输出的第一个单词就不一定是第一步的最优解,也有可能是第一步的次优解,与第二个单词组合出了更好的整体解。这使得模型有更全局、更长远的眼光。

关于 Top-K 中 K 值的权衡,毫无疑问当 K 取到最大(即词表 V V V 的大小)时,搜索空间最大,一定能找到全局最优解,但通常这种情况下的时空复杂度是无法接受的;当 K 取为 1 时,则相当于贪婪的方式,每步直接取概率最大者,没有搜索空间。

特点

n-gram 的特点如下

  1. 训练速度快,无训练参数
    • 作为一个基于统计的模型,n-gram 只需要将语料库整体扫描一遍,训练就完成了,且不需要任何训练参数,就可以直接进行文本生成。
  2. 具备一定的多样性
  3. 非常依赖于训练语料
    • 如果某种组合在语料库中完全没有出现过,那么 n-gram 是无论如何不可能给出这种输出的。
  4. 关于 n-gram 中 n 的设置
    • n 较小时:n 越小,生成文本的灵活性、多样性就越高(如青椒炒豆角的例子);但是窗口过小,有时跨几个词语去看,发现生成结果会不够连贯
    • n 较大时:n 较大,整个结果的连贯性会比较有保证;但是会造成整个概率分布表非常稀疏,更容易出现某种组合在语料库中完全没有出现过的情况,并且多样性也会受限
    • 通常 n = 2, 3 , 4
  5. 显然,n-gram 模型能够 work 一个假设就是文本是有一定的马尔可夫的性质的,即当前单词只与之前一两个单词有关,与更远的单词基本无关。这在生成文本较短的情况下通常是成立的,但是当生成文本过长,经常会出现前后逻辑无关,前言不搭后语的情况。即长文本中长距离依赖的问题,这是 NLP 领域比较经典的问题,有许多处理的方法。

Ref

  • 自然语言生成(一)N-Gram

你可能感兴趣的:(自然语言处理,机器学习,人工智能,python,1024程序员节)