---
# System prepended metadata

title: 讨论 2023-04-20 文本生成解码

---

讨论 2023-04-20
=
###### tags: `tutorials` `Fudan` `2023`
# 文本生成解码

## 语言模型与文本生成

今天的分享从一个看似很浅显的问题出发，语言模型和文本生成有什么关系？我们之前讲到过语言模型通常可以写做$P(X=\{w_0, w_1,...,w_T\})=\prod_t P(w_t|w_{<t})$，也就是大家常说的next token prediction形式。既然都叫做next token prediction了，我们估计了一个语言模型之后自然可以按概率采样出下一个词，重复这个过程，一连串的词也就是文本生成过程了。

然而，问题其实并没有这么简单。我们回到语言模型的定义本身，衡量一句话出现在自然语言中的概率。那么什么样的句子会有很高的概率？比如“哦”，“是”，“好”，他们的概率要显著高于长篇大论，但我们会认为一个总是生成“哦”的模型是一个好的文本生成模型的吗？

人类语言是以传达信息为目的，换言之，我们说话时总是要告诉别人一些新内容的，那么对听者来说是有不确定性的，比如“你是否爱吃苹果？”，这句话答案是“是”或“否”都是有可能的，所以自然语言往往不是去说那些概率最高的句子。

我们今天的主题就是围绕假如有一个语言模型，我们怎样才能生成更自然的语言。

## 随机采样和贪心采样
首先，两种最常见的采样方法便是随机采样和贪心采样，前者严格按照$P(w \in V|w_{<t})$进行采样，而后者则是$\mathrm{argmax}_{w \in V} P(w|w_{<t})$采样。我们直观感觉是贪心采样会更好一些，但其实概率学对此早有研究，让我们来看一个小例子。

**假设我们抛一枚有问题的硬币，正面概率是0.6，反面是0.4，连续抛一百次，全部正面的概率是？**
一个有趣的事实是100次全部正面的概率非常低，几乎不可能，但是它确实是所有序列中出现最高的那一个。所以如果我们采用贪心采样，那么采样序列就是100次全部正面。

这个例子很好的说明了贪心策略很可能误导我们。

那接下来我们看随机采样，假如我们要说100个单词，每一步都有0.01的概率口误，如果按照随机采样，期望的一段话出错概率依旧很高。如果我们观察人的行为，会发现人对概率是有限区分的，比如大部分人无法认识0.52和0.53的区别，所以0.01的概率对人来说很可能就是0。

## 生成长度
语言模型有个很有趣的性质，那就是语言模型是一个必定在有限步结束的随机过程，这其实与一些随机过程不同，他们不考虑EOS的存在，也没有长度之说。实际上，生成长度是文本生成中一个很难解决的问题，很多工作指出，短序列往往拥有更高的概率。
    
目前关于长度的控制方法，主要有
- 利用参考文本的长度，比如翻译中根据输入长度的倍率来控制
- 长度系数奖励
- 强制最小长度，强制最大长度
    
## 避免重复
语言模型经常会重复，这其实是一个很有趣的现象，我们人是很少大量重复的。那语言模型为何会如此？一个解释是训练语料只有自然语言，那么存在一个虚假模型，即上文一定是自然语言，所以重复上文总归是合理的。这一点其实有点悖论，如果上文是不合理的，那么我们的全概率公式是不对了，如果上文是合理的，有无法摆脱生成时过度依赖上文的问题。

目前规避重复的方法主要是基于N-gram的，即出现过的词组都禁止或减分。

## 概率截断
目前主要有两种方式
- 概率小于阈值的项会被置为0.
- 按排名截断，只有前几名会被采样到

## 信息熵相关
已知一个语言模型，我们可以计算出他在某个长度下的熵，即对应长度的一句话所携带的平均信息量，我们希望采样过程中，序列的信息量与这个期望信息量尽可能一致。
$$\min_w |\log P(w|w_{<t}) + H(w|w_{<t})| $$
$$= \min_w |\log P(w|w_{<t}) - \sum_w' P(w', w_{<t}) \log P(w'|w_{<t})| $$
