讨论 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})| $$