generation的重复性问题

2023-11-21 20:28
文章标签 问题 generation 重复性

本文主要是介绍generation的重复性问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

来自模型训练的方式:
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.org/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.org/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.org/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.org/pdf/2206.02369.pdf

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

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

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

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

在这里插入图片描述

来自解码decode的方式:

1 Repetition Penalty

论文地址:https://arxiv.org/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.org/pdf/2202.06417.pdf
代码仓库:https://github.com/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的重复性问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/404884

相关文章

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2