今天来看一个关于LLMs复读机问题的详细介绍,主要从定义、出现复读机问题的原因和怎么解决三个方面来介绍:
1、什么是 LLMs 复读机问题?
LLMs 复读机问题:
- 字符级别重复:指大模型针对一个字或一个词重复不断生成。例如在电商翻译场景上,会出现“steckdose steckdose steckdose steckdose steckdose steckdose steckdose steckdose...”;
- 语句级别重复:大模型针对一句话重复不断生成。例如在多模态大模型图片理解上,生成的结果可能会不断重复图片的部分内容,比如“这是一个杯子,这是一个杯子...”;
- 章节级别重复:多次相同的prompt输出完全相同或十分近似的内容,没有一点创新性的内容。比如让大模型给你写一篇关于春天的小作文,结果发现大模型的生成结果千篇一律,甚至近乎一模一样。
- 大模型针对不同的prompt也可能会生成类似的内容,且有效信息很少、信息熵偏低。
2、为什么会出现 LLMs 复读机问题?
- 数据偏差:大语言模型通常是通过预训练阶段使用大规模无标签数据进行训练的。如果训练数据中存在大量的重复文本或者某些特定的句子或短语出现频率较高,模型在生成文本时可能会倾向于复制这些常见的模式。
- 训练目标的限制:大语言模型的训练通常是基于自监督学习的方法,通过预测下一个词或掩盖词来学习语言模型。这样的训练目标可能使得模型更倾向于生成与输入相似的文本,导致复读机问题的出现。
- 缺乏多样性的训练数据:虽然大语言模型可以处理大规模的数据,但如果训练数据中缺乏多样性的语言表达和语境,模型可能无法学习到足够的多样性和创造性,导致复读机问题的出现。
- 模型结构和参数设置:大语言模型的结构和参数设置也可能对复读机问题产生影响。例如,模型的注意力机制和生成策略可能导致模型更倾向于复制输入的文本。
- 从 induction head机制的影响角度:也就是模型会倾向于从前面已经预测的word里面挑选最匹配的词。例如,在翻译上,由于input和output的天然差异性,会发现容易出现重复的都是一些复杂度perplexity比较高的文本,也就是说input的句式越不常见,本身重复度越高,翻译结果重复的可能性也越高。
- 从信息熵的角度分析:信息熵与语言模型生成的关联在语言模型中,信息熵可以用于衡量文本的多样性。例如,对于电商标题这类语句连贯性弱、基本是词序堆叠的文本,其信息熵通常很高,因为每个词的出现概率较为均匀,难以预测下一个词。当信息熵很高时,模型在预测下一个词时会面临较大的不确定性。此时,Softmax函数输出的概率分布会趋于平稳,即每个词的预测概率接近。这种情况下,模型难以确定下一个词,因此可能会选择重复前面出现过的词,从而导致复读机现象。条件熵与生成策略条件熵是指在给定某些条件下的不确定性。在语言模型中,条件熵可以用来衡量在已知前文的情况下,下一个词的不确定性。如果条件熵很高,说明即使给定前文,下一个词的预测仍然非常不确定。例如,当模型生成文本时,如果前文的信息熵已经很高(如电商标题),那么模型在生成下一个词时会倾向于选择那些与前文相似的词,以减少不确定性。这种策略虽然在一定程度上可以降低生成的不确定性,但也容易导致重复。TSNE分布与各向异性TSNE(t-SNE)是一种用于高维数据可视化的技术,可以将复杂的高维数据映射到二维或三维空间,以便观察数据的分布。在语言模型中,TSNE分布可以用来观察词嵌入的分布情况。当模型生成重复词汇时,如“L”不断重复,其TSNE分布会沿着前面词的分布均匀铺开,形成各向异性。这意味着虽然生成的文本长度增加,但语义并没有实质性变化,仍然集中在相同的分布范围内。信息淹没与模型的应对策略信息淹没是指当输入文本的信息熵很高时,模型难以从中提取有效信息。在这种情况下,模型可能会选择“保守”的策略,即重复前面的词,以避免生成不合理的文本。例如,对于复杂度高的文本(如不常见的句式),模型可能无法准确预测下一个词,因此会选择重复前面的词,以保持生成文本的连贯性。
3、如何缓解?
Unlikelihood Training
来自论文《NEURAL TEXT DEGENERATION WITH UNLIKELIHOOD TRAINING》
Unlikelihood Training 是一种改进语言模型训练的方法,旨在通过调整损失函数来减少生成文本中的重复和单调问题。传统最大似然估计(MLE)训练的目标是让模型生成的序列尽可能接近真实数据,但这可能导致模型过度依赖高频词和重复模式。Unlikelihood Training 在此基础上引入了一个额外的惩罚项,使得模型在生成过程中尽量避免生成已经出现过的或不希望出现的词。
实现:
Unlikelihood Training 的实现主要通过修改模型的损失函数来完成。具体来说,损失函数包含两部分:
- Likelihood Loss:这部分与传统的最大似然估计一致,目的是让模型学习真实标签的语言逻辑。
- Unlikelihood Loss:这部分用于抑制模型生成某些特定的词或序列。具体公式如下:
token级:
sentence级:
其中,是需要抑制的词集合,α 是超参数,用于平衡两部分损失。
实验结果:
其中seq-rep-4代表4-gram重复率;uniq-seq代表总共出现的不同词的个数;ppl代表句子困惑度;acc代表句子准确性;rep代表前词重复率;wrep代表加权前词重复率。从这些指标中可以明显观察到,unlikelihood training能降低整体生成句子的重复度。
unlikelihood training方法是一种表现不错的抑制重复方式,但其中集合C的设计比较困难。针对不同的任务,集合C都需要进行精心的设计,才能保证在生成精度基本不降的情况下抑制模型生成重复与单调的结果。(该方法仅能解决字符和语句重复问题,无法解决输入多次相同prompt输出单调性的问题)
重复率指标检测
常见重复率监测指标
在大语言模型(LLMs)的生成过程中,常用的重复率监测指标包括以下几种:
- seq-rep-N:表示序列中重复的N-gram(N个连续词或字符)的比例。例如,seq-rep-4表示4-gram的重复率。
- uniq-seq:表示生成序列中不同词或字符的数量。
- rep:前词重复率,即前一个词重复出现的概率。
- wrep:加权前词重复率,考虑了重复词的重要性或频率。
这些指标通过量化重复程度,帮助开发者监测和评估模型生成文本的多样性。
监测与调整策略
通过融合这些指标,可以在模型生成过程中实时监测重复现象。当检测到异常重复时,可以采取以下措施:
- 加入特殊字符:在生成的文本中插入特殊字符或标记,打破重复模式。
- 修改Prompt表达:调整输入提示(Prompt),通过改变语义或结构,引导模型生成不同的内容。
- 切分文本:将长文本切分为多个短文本,分别处理后再组合,以降低重复率。
测试结果与潜在风险
测试表明,上述方法能够在一定程度上恢复正常生成结果。然而,这些方法也可能带来一些潜在问题:
- 语序问题:在翻译或其他生成任务中,强制调整可能导致语序不合理。
- 领域适应性:这些方法在不同领域的适用性需要进一步验证,例如在文学创作、新闻报道等场景中可能需要不同的调整策略。
引入噪声
在生成文本时,引入一些随机性或噪声,例如通过采样不同的词或短语,或者引入随机的变换操作,以增加生成文本的多样性。这可以通过在生成过程中对模型的输出进行采样或添加随机性来实现。
Repetition Penalty(重复性处罚)
来自论文《CTRL: A CONDITIONAL TRANSFORMER LANGUAGE MODEL FOR CONTROLLABLE GENERATION》
思路:Repetition Penalty 是一种在模型推理阶段用于抑制重复生成的方法。它通过在 Softmax 输出中引入惩罚因子,降低已经生成过的词(token)被再次选中的概率。这种方法简单有效,能够在不改变模型训练过程的情况下,直接在推理阶段减少重复现象。
实现:
其中T代表温度,温度越高,生成的句子随机性越强,模型效果越不显著;I就代表惩罚项,c通常是一个包含之前生成过的单词的列表,用于记录哪些词需要被惩罚,一般为1-gram之前出现过的单词,theta值一般设置为1.2,1.0代表没有惩罚。
重复性惩罚方法是一种简单有效的重复抑制手段,因为它通过提高I值,有效降低集合c中词再次被选中的概率。当然,类似与unlikelihood training,本方法也可以通过设置不同的c集合来改变惩罚的方向。(该方法仅能解决字符和语句重复问题,无法解决输入多次相同prompt输出单调性的问题)
Huggingface中,model.generate已经包含此参数,仅需设置repetition_penalty=p(p>1.0)即可开启重复惩罚因子。
Beam Search
贪婪搜索在每个时间步只选择当前概率最高的输出,Beam Search是对贪心策略一种改进。思路简单,就是稍微放宽考察的范围。在每一个时间步,不再只保留当前分数最高的1个输出,而是保留num_beams个。当num_beams=1时集束搜索(Beam Search)就退化成了贪心搜索。Beam Search虽然本质上并没有降低重复率的操作,但是该策略确实在结果上优化了部分生成结果,降低了一定的重复率。
下图是一个实际的例子,每个时间步有ABCDE共5种可能的输出,图中的num_beams=2,也就是说每个时间步都会保留到当前步为止条件概率最优的2个序列。
Beam search理论上仅是为了解决贪婪搜索给到的答案仅局部最优,而全局搜索又在时间复杂度上不可行而提出的折中算法,并不能对大模型中的任何重复问题进行修正,甚至有可能增大重复概率。但从翻译的测试实验结果来看,它确实在一定程度上改变了模型Softmax后的分布情况,优化了输出的结果,所以在部分大模型任务上能抑制重复生成问题。
Huggingface中,model.generate中已经包含此参数,仅需设置num_beams=2即可开启集束搜索。
Contrastive Search
来自论文《A Contrastive Framework for Neural Text Generation》
Contrastive Search 是为了解决传统解码方法(如 Beam Search)在最大化生成方式解码时出现的解码退化问题。这些问题包括生成的文本不自然、重复以及单调等。Contrastive Search 通过对比损失(Contrastive Loss)和对比搜索(Contrastive Search)两个创新点,从模型训练和推理两个层面缓解了这些问题。
对比损失(Contrastive Loss)
对比损失的核心思想是通过降低生成 token 之间的相似度,减少模型对常见表达的依赖,从而提升生成文本的多样性和创造性。公式如下:
其中:就是余弦相似度。通过对比损失,模型在训练阶段会学习到降低不同 token 之间的相似度,从而减少生成重复或单调内容的可能性。
从图上可以明显看出token间相似度降低了,token间相似度降低即不同token在高维空间表征分离能有效降低模型仅生成个别重复词或字的概率。
对比搜索(Contrastive Search)
对比搜索是在解码阶段对生成 token 的相似度进行限制,进一步降低重复率和单调性。
公式:
其中:第一项就是原模型的概率,后面一项可以理解成一种惩罚,当前token与历史token相似度较高时,就降低当前token的概率。
作用:如果当前 token 与历史生成的 token 相似度较高,其生成概率会被降低。这使得模型更倾向于生成与历史内容不同的新内容,从而减少重复和单调性。
对比loss和对比search在训练和推理两个阶段限制生成token间的相似度,有效降低了模型对一些特别常见表达的依赖,让模型尝试生成不一样的表达,整体上提升模型的创造性。(该方法仅能解决字符和语句重复问题,无法解决输入多次相同prompt输出单调性的问题)
TopK sampling
TopK Sampling 是一种用于生成文本的随机采样方法,旨在通过引入随机性来增加生成文本的多样性。它通过从 Softmax 输出的 logits 中选择概率最高的 K 个 token,并从中随机采样下一个 token,从而避免了贪婪搜索(Greedy Search)可能导致的单调和重复问题。
实现:
- Softmax 输出:模型在每个时间步输出一个概率分布,表示下一个 token 的可能性。
- 选择 TopK:从 Softmax 输出中选择概率最高的 K 个 token。
- 随机采样:从这 K 个 token 中随机选择一个作为下一个 token。
- 重复上述过程:直到生成完整的序列。
TopK采样是一种行之有效,能简单暴力的解决所有重复单调问题的方案之一,但是由于引入了随机性,生成的文本可能在某些情况下不够通顺或与 Prompt 的相关性较低。
Huggingface中,model.generate中已经包含此参数,需设置do_sample=True,开启采样模式,同时设置top_k值,top_k值默认为50
Nucleus sampler
Nucleus Sampler(TopP 采样)是一种改进的随机采样方法,旨在解决 TopK 采样中的一些问题,如生成质量不稳定和对 K 值选择的敏感性。TopP 采样通过限制采样范围内的累积概率,而不是固定选择 K 个 token,从而更灵活地控制生成的多样性和质量。
TopP 采样的具体步骤如下:
- Softmax 输出:模型在每个时间步输出一个概率分布,表示下一个 token 的可能性。
- 累积概率排序:将 Softmax 输出的概率按从高到低排序。
- 选择累积概率大于 P 的 token:从排序后的 token 中,选择累积概率大于设定阈值 P 的 token。这些 token 组成一个“核心集合”。
- 随机采样:从核心集合中按概率分布随机选择下一个 token。
- 重复上述过程:直到生成完整的序列。
以下图为例,TopP采样会不断选择logit中最大概率的token,放入一个list中,直到list中计算的总概率大于设置的TopP值,后对list中的token概率进行重新计算,最终根据计算出来的概率值对list中的token进行采样。
Nucleus sampler是对简单暴力的TopK采样修改后的方法,相比TopK,该方法生成的句子通顺度以及对prompt的忠诚度更佳,一般选择它,而不选择TopK。TopP 采样的效果依赖于累积概率阈值 P 的选择。如果 P 值过大,生成的随机性会降低;如果 P 值过小,可能会限制生成的多样性。
Huggingface中,model.generate中已经包含此参数,需设置do_sample=True,开启采样模式,同时设置top_p值,top_p值默认为1.0。
Temperature
Temperature是生成模型中用于调整随机程度的一个参数。它通过改变 Softmax 输出的概率分布,控制生成结果的随机性和多样性。
采样时如何选择温度?
较低的 Temperature:较低的温度意味着较少的随机性,概率分布更尖锐,温度为 0 将始终产生相同的输出,执行具有“正确”答案的任务。对于总结类,翻译类等具有明确答案的任务,较低的温度(小于1)更合适。如果模型开始自我重复,则表明温度设置过低。
较高的 Temperature:高温意味着更多的随机性,概率分布更平滑,增加随机性,可以帮助模型给出更有创意的输出。如果模型开始偏离主题或给出无意义的输出,则表明温度过高。温度调整公式如下:
提高Temperature配合上文两种采样算法,可以达到生成更激进创新性回答的需求,但生成句子的稳定性不可控。
Huggingface中,model.generate中已经包含此参数,仅需设置temperature,默认为1.0。
No repeat ngram size
No Repeat ngram size 是一种用于抑制生成文本中重复 n-gram(连续的 n 个词或字符)的方法。其核心思想是通过强制模型避免生成已经出现过的 n-gram,从而减少重复内容的生成。
实现:
在生成过程中,模型会检查当前生成的文本中是否已经包含了某个 n-gram。如果检测到重复的 n-gram,模型会跳过这些重复的内容,选择概率次高的其他 token。
Huggingface中,model.generate中已经包含此参数,仅需设置no_repeat_ngram_size=N即可。
后处理和过滤
对生成的文本进行后处理和过滤,去除重复的句子或短语,以提高生成文本的质量和多样性。可以使用文本相似度计算方法或规则来检测和去除重复的文本。
人工干预和控制
对于关键任务或敏感场景,可以引入人工干预和控制机制,对生成的文本进行审查和筛选,确保生成结果的准确性和多样性。