admin管理员组

文章数量:1622541

来自模型训练的方式:
unlikelihood training:
straight to gradient:

方案4:
另外,针对<HJIKL, HJIKLL, HJIKLL…>的分布几乎相同的各向异性,就是L的分布与前面t-1词的分布趋同,可以认为是L这个词的input embedding并没有学好!最简单的解决方式,先在通用数据上大批量跑出来哪些词时容易重复的,再对他们组成的词汇单独的pre训练,强行改变他们的分布,也能在不降低生成质量的情况下,大幅度改善重复的问题。

方案5:
还有一个很trick的方法,也就是对容易出现重复生成的文本,做对应词语L的缺词文本构造,生成多个扩充文本放到训练集里训练。这个无论是在翻译、QA还是对话里都比较有效,毕竟数据为王嘛,就是让模型对semi-distinctive的样本多多学习下。

方案6:
分析指出,Self-reinforcement effect 是重复的核心问题。我们进一步提出了DITTO, 一种非常的简单的方法,在训练阶段纠正模型分布的方法来解决重复问题。 实验证明在generation的各种decoding 算法[greedy, top-p, top-k] 以及 abstractive summarization 任务上都有显著提高。
https://arxiv/abs/2206.02369

来自解码decode的方式:

方案1:
这种问题首先可以通过Beam search或者Random search缓解,比如在LLAMA和NLLB的原始Transformers代码中,beam search是默认为false,如果打开并将seeds设置为2,那整体的重复生成情况能减少到原来的40%;

方案2:
对比搜索的方式 contrastive sampling [1,2] ,据说是能够达到与人类匹配的水平。

方案3:
另一种比较实际的操作,这个其实是从predict softmax分布上发现的,一个词重复生成,也就是说下一个位置它的概率值依然是最大的,那么你可以先对前面的句子做n-gram的重复检测,对出现重复的词在next prediction时做mask,强行控制模型不选前面t-n~t-1出现的重复词时,重复性大大减少,翻译的准确率也会明显提升!就是这么简单粗暴,其实原理也类似于Reward,强制模型朝着信息熵高的方向来生成。

origin MLE:

来自模型训练的方式

1 Unlikelihood Training

论文:https://arxiv/pdf/1908.04319.pdf

Unlikelihood training方法通过在训练中加入对重复词的抑制来减少重复输出[3],
具体来说:下式中集合C代表上文生成的token,本身likelihood training loss是要促使模型学习到原标签中自然的语言逻辑,而修改后的loss不仅要促进模型学习到真实标签的语言自然性,也要通过unlikelihood loss抑制模型,使其尽量不生成集合C中的token。
一般对于生成式任务,只需要在原模型基础上加入unlikelihood training进行sentence级别finetune即可,不需要通过token级别的unlikelihood和likelihood loss叠加训练。(如果进入叠加训练虽然会降低重复率,但是句子困惑度会升高,准确率会下降)


这样就可以把之前出现过的单词添加进neg集合中,从而缓解生成重复文本的问题,增加生成文本的多样性。

2 Straight to the Gradient: Learning to Use Novel Tokens for Neural Text Generation

论文地址:https://arxiv/abs/2106.0720
ICML 2021
假设pt是softmax结果,我们重新计算新的p:

这样就可以把之前没出现过的单词的概率进行增大,从而缓解生成重复文本的问题,增加生成文本的多样性。

3 DITTO:Learning to Break the Loop: Analyzing and Mitigating Repetitions for Neural Text Generation

论文地址:https://arxiv/pdf/2206.02369.pdf

在本文中提出了一种简单有效的基于训练的方法——伪重复惩罚法(Pseudo-Repetition Penalization,DITTO)。先手动地向模型输入重复的句子,然后显式地教模型对抗这种重复。

构造数据:
通过重复从训练语料库中采样的句子来手动构建伪数据,通过将句子 s 重复 N+1 次,构造一个伪重复样本 x。
在这些伪数据上设计了一个重复惩罚损失函数,让模型学会随着句子重复次数的增加,以指数方式衰减重复概率。

训练放在哪里?先训练一个基线模型,再单独做DITTO训练:
在实验中通过微调标准 MLE 基线(平均混合句子级重复惩罚更新和正常 MLE 损失更新)来应用句子级重复惩罚。作者发现,将另一个从训练语料库中随机采样的句子作为前缀附加到伪重复数据 x 上,可以实现更好和更稳定的性能。

在人类语言中会出现必要的词汇和短语级重复(如人名、城市和谚语)。因此模型应能够从给定的前缀中复制这些单词或短语,并增加它们的重复概率。这些有用的重复可以被视作正样本,而本文设置的伪重复数据可以被视为负样本,将它们结合起来训练,模型应学会区分上下文是否有用。因此,尽管本方法的动机是克服句子级重复问题,但也可以提高模型的学习能力和泛化性。与以前的方法设置硬约束来惩罚任何重复不同,本文的训练目标明确地编码了模型应该倾向于避免过度重复的直觉,因此也可以减轻过度惩罚的弊端。

来自解码decode的方式:

1 Repetition Penalty

论文地址:https://arxiv/pdf/1909.05858.pdf

重复性惩罚方法通过在模型推理过程中加入重复惩罚因子,对原有softmax结果进行修正,降低重复生成的token被选中的概率。
以下公式为例,其中T代表温度,温度越高,生成的句子随机性越强,模型效果越不显著;
I就代表惩罚项,c代表我们保存的一个list,一般为1-gram之前出现过的单词,theta值一般设置为1.2,1.0代表没有惩罚。

重复性惩罚方法是一种简单有效的重复抑制手段,因为它通过提高I值,有效降低集合c中词再次被选中的概率。当然,类似与unlikelihood training,本方法也可以通过设置不同的c集合来改变惩罚的方向。(该方法仅能解决字符级别和语句级别重复,无法解决输入多次相同prompt输出单调性的问题)

Huggingface中,model.generate已经包含此参数,仅需设置repetition_penalty=p(p>1.0)即可开启重复惩罚因子

2 Contrastive Search

论文地址:https://arxiv/pdf/2202.06417.pdf
代码仓库:https://github/yxuansu/SimCTG

Contrastive Search方法是为了解决原先解码方法,例如Beam Search,在采用最大化生成方式解码时出现解码退化的问题即生成的文本不自然的,并包含文本重复而提出的一种解决方案。
Contrastive Search提出对比loss以及对比搜索两个创新点,从模型训练和模型推理层面缓解了生成式模型重复以及单调问题。

其中对比loss通过在原loss基础上添加对比loss,即对比token间相似度的方式去解决生成式模型重复单调问题,公式如下:

而对比搜索方法就是在decode阶段限制相似token生成的概率,大大降低生成内容重复率和单调性。

其中第一项就是原模型的概率,后面一项可以理解成一种惩罚,当前token与历史token相似度较高时,就降低当前token的概率。

对比loss和对比search在训练和推理两个阶段限制生成token间的相似度,有效降低了模型对一些特别常见表达的依赖,让模型尝试生成不一样的表达,整体上提升模型的创造性。(该方法仅能解决字符级别和语句级别重复,无法解决输入多次相同prompt输出单调性的问题)
!!! 特别注意,对比search使得后面测试任务推理速度降低十倍;且占用显存更大,慎用 !!!

Huggingface中,model.generate已经包含此参数,仅需设置penalty_alpha=alpha(0<alpha<1) 即可开启对比Search因子alpha

3 Beam Search

Beam Search是对贪心策略一种改进。思路简单,就是稍微放宽考察的范围。在每一个时间步,不再只保留当前分数最高的1个输出,而是保留num_beams个。当num_beams=1时集束搜索(Beam Search)就退化成了贪心搜索。Beam Search虽然本质上并没有降低重复率的操作,但是该策略确实在结果上优化了部分生成结果,降低了一定的重复率。

Huggingface中,model.generate中已经包含此参数,仅需设置num_beams=2即可开启集束搜索

4 TopK sampling

TopK通过对Softmax的输出结果logit中最大的K个token采样来选择输出的token,该方法存在的问题是当概率分布很极端时,即模型很确定下一个token时,容易造成生成错误。
TopK采样会选择最大的K个token,并通过logit值对K个token进行采样,相比于贪心搜索增添了随机性,相当于同样的输入,多次经过TopK采样生成的结果大概率不会一样。

Top K采样方法
TopK采样是一种行之有效,能简单暴力的解决单词/句子/章节重复单调问题的方案之一,当然它存在的最大问题是最后生成的句子存在狗屁不通现象,并不能保证句子的通顺度以及对prompt的忠诚度。

Huggingface中,model.generate中已经包含此参数,需设置do_sample=True,开启采样模式,同时设置top_k值,top_k值默认为50

5 Nucleus sampler

Nucleus sampler俗称TopP采样,一种用于解决TopK采样问题的新方法,该采样方式不限制K的数目,而是通Softmax后排序token的概率,当概率大于P时停止,相当于当模型很确定下一个token时,可采样的K也会很少,减少异常错误发生的概率。以下图为例,TopP采样会不断选择logit中最大概率的token,放入一个list中,直到list中计算的总概率大于设置的TopP值,后对list中的token概率进行重新计算,最终根据计算出来的概率值对list中的token进行采样。

Top P采样方法
Nucleus sampler是对简单暴力的TopK采样修改后的方法,也能解决单词/句子/章节重复单调问题,相比TopK,该方法生成的句子通顺度以及对prompt的忠诚度更佳,一般选择它,而不选择TopK。

Huggingface中,model.generate中已经包含此参数,需设置do_sample=True,开启采样模式,同时设置top_p值,top_p值默认为1.0

6 Temperature

生成模型中抽样包含随机性,因此每次生成时,相同的prompt可能会产生不同的输出。温度是用于调整随机程度的数字。

较低的温度意味着较少的随机性;温度为 0 将始终产生相同的输出。执行具有“正确”答案的任务,对于总结类,翻译类等具有明确答案的任务,较低的温度(小于1)更合适。如果模型开始自我重复,则表明温度设置过低。高温意味着更多的随机性,这可以帮助模型给出更有创意的输出。如果模型开始偏离主题或给出无意义的输出,则表明温度过高。温度调整公式如下:

Temperature参数就是前面介绍repetition penalty中的T参数。
提高Temperature配合上文两种采样算法,可以达到生成更激进创新性回答的需求,但生成句子的稳定性不可控。

Huggingface中,model.generate中已经包含此参数,仅需设置temperature,默认为1.0

7 No repeat ngram size

该方法是一种最暴力抑制重复的方法,通过限制设置的ngram不能出现重复,如果重复,就选概率次大的一个,来强制模型不生成重复的token。

该功能一般都会开启,来保证生成的句子不犯很离谱的连续重复问题。(该方法仅能解决1.1节中阐述的前两种重复问题,无法解决输入多次相同prompt输出单调性的问题)

Huggingface中,model.generate中已经包含此参数,仅需设置no_repeat_ngram_size=N即可

本文标签: 性问题Generation