CH1-语言模型和解码算法

讲义链接

1、NLG的定义及应用场景

NLG是指,生产出任何新文本。被用于以下场景:

1. 机器翻译
2. 摘要
3. 对话(任务型、闲聊型、问答型)
4. 创意写作:写故事,写诗
5. 生成式,相比于抽取式
6. 图像描述

2、语言模型

2.1 LM

语言建模(Language Modeling)是指,在给定词语的情况下,预测下一个词的概率,用公式表示为:

P ( y t y 1 , . . . , y ( t 1 ) ) P(y_t|y_1,...,y_(t-1))

而语言模型(Language Model)是只一种系统,用以预测上述概率的分布。

2.2 RNN-LM

如果用RNN网络来预测上述概率,那么这个语音模型就称为RNN-LM。

2.3 Conditional LM

如果出了已出现的词,我们还知道其他的输入条件,那么我们就可以进行条件语言建模(ConditionalLanguageModel),用公式表示为

P ( y t y 1 , . . . , y ( t 1 ) , x ) P(y_t|y_1,...,y_(t-1),x)

这种建模方法在很多应用中都有用到:

  • 机器翻译:x是源句子,y是目标句子
  • 摘要生成:x是输入文本,y是摘要文本
  • 对话:x是历史聊天记录,y是下一句话

2.4 泛RNN语言模型的训练

一般模型有两部分组成:编码器(RNN)和解码器(RNN)。

有一种训练方式,是将真正的生成句子输入解码器中,而不是解码器生成的句子。这种训练方式是Teacher Forcing

以NeuralMachineTranslation为例:

3、解码算法

语言模型训练好之后,我们会通过解码算法来生成文本。

这里会介绍两种解码算法,贪心解码(Greedy Decoding)算法和簇搜索(Beam Search)算法

3.1 贪心解码算法

一种比较简单的算法,就是在每一步中预测最有可能的那个词. 这个词会被作为下一次预测时的输入。

上述过程是重复进行的,直到预测出结束符<END>或者生成的词个数已经达到设定的最大值。

整个过程如下图所示:

GreedyDecoding算法的缺点在于,由于没有backtracking回溯过程,即每一次的最好并不是全局的最佳,所以文本生成的效果不是特别好,比如会出现不符合语法逻辑、不自然、不合理的情况。

3.2 beam search解码算法

搜索算法旨在从若干可能的句子里,一次就找出可能性比较高的句子,这个句子可能并不是最优的结果。

核心思想:在每一步解码过程中,跟踪k个最可能的部分序列(我们称之为假设 hypotheses ),这个k就是 束大小,beam size

生成阶段的循环过程结束时,选择概率最大的句子片段(这里的片段是因为还要考虑到生成长度,所以我们会进行一些调整)

举个例子如下图,此时k=2

蓝色的数字值是该句子的得分$score(y_i|y_1,..,y_(i-1),x)$,通过如下公式计算得到:

i = 1 t log P L M ( y i y 1 , , y i 1 , x ) \sum_{i=1}^{t} \log P_{\mathrm{LM}}\left(y_{i} | y_{1}, \ldots, y_{i-1}, x\right)

每个时间步都只保留了k=2个节点往下继续搜索。最后pie对应的路径打分最高,最后的句子是

he hit me with a pie

从图中可以看出,不同路径预测输出结束标志符的时间点可能不一样,比如第三步时,已经有I was hit这样一个结果还不错的句子产生了,这样一句预测完成的句子,称之为完全路径

为了从不同长度的完全路径中挑选一个最佳答案,我们会根据生成句子的长度进行分值的归一化,

1 t i = 1 t log P L M ( y i y 1 , , y i 1 , x ) \frac{1}{t} \sum_{i=1}^{t} \log P_{\mathrm{LM}}\left(y_{i} | y_{1}, \ldots, y_{i-1}, x\right)

不同大小的k对结果有什么影响呢?

如果k越小的话,每次考虑的范围就越小,出现的问题约同贪心解码(k=1时就回退到贪心解码)

k越大的话,每一步都需要更多假设,会造成更多计算量

不仅如此,对NMT来说,k越大,BLEU 值会越小,因为即使对长度进行了归一化,但是k越大,越偏向生成短文本。NMT的六大挑战一文中,对比了不同k情况下的BLEU值,

可以看到,k越大,生成质量越差,特别是如果没有进行长度归一化,结果会更差。当然不同场景下,最优k值也是不同的,比如Czech–English的翻译中,k选4最好,而English– Romanian翻译中,k=30会得到最好的结果。

此外,在闲聊型对话任务中,k越大,生成的答案通用性越强(示例见下图)

当一方说,“我大多情况下都以生鲜为主,不怎么去杂货店买东西”,可以看到k比较小的时候,回答都是比较有主题的,比如围绕饮食、健康开展的。而随着k变大,回复也变得含含糊糊,不会答错但是也没那么相关,有一点答非所问。

3.3 基于采样的解码算法

因为beam seach中每次要进行khypothese,所以可能不会那么efficient.这就推进了基于采样的解码算法诞生。

3.3.1 PureSampling

每一个时间步 t t 下,从分布 P t P_t 随机选一个作为下一个词.和贪心解码算法一样,也是每次只选一个词,但是随机的而不是选概率最大。

3.3.2 Top-n Sampling

每一个时间步 t t 下,从分布 P t P_t 中,按照概率选取 n n 个,再从中随机选一个

可以看到当 n = 1 n=1 时就是贪心,当 n = 1 n=1 时就是pure sample

n n 越大,生成的文本更具有多样性,当然也更加危险,因为不知道会出来什么玩意儿。

n n 越小,生成的文本更加具有通用性,虽然可能有点跑偏,但是生成的文本比较安全,不会出错。

3.3.3 不是解码算法的 Softmax temperature

beam searchsampling的解码算法中,我们都是根据概率大小进行选择的。在softmax过程中,我们还会做一点变化,引入了一个温度参数 τ \tau

P t ( w ) = exp ( s w / τ ) w V exp ( s w / τ ) P_{t}(w)=\frac{\exp \left(s_{w} / \tau\right)}{\sum_{w^{\prime} \in V} \exp \left(s_{w^{\prime}} / \tau\right)}

τ \tau 越大, P t P_t 分布就会越平滑,词表中每个词被选中的概率就会比较平均,所以生成的结果越具有多样性。

τ \tau 越小, P t P_t 分布就会越尖锐,词表中每个词被选中的概率就会不平均,总有一些词选不到,而另外一些词总被选到,所以生成的结果越比较常见。

3.4 解码算法总结

贪心解码算法非常简单,但是效果也不好

束搜索效果比较好,但是也会出现回答太普通,太短等问题。

采样方法则是结果更具有多样性

发布了120 篇原创文章 · 获赞 35 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/u012328476/article/details/104091980
今日推荐