1. 背景

关于LLM复读机问题,本qiang~在网上搜刮了好几天,结果是大多数客观整理的都有些支离破碎,不够系统。

因此,本qiang~打算做一个相对系统的整理,包括LLM复读机产生的原因以及对应的解决方案。

2. LLM复读机示例

示例1:短语级别的重复

User: 你喜欢北京么?

AI: 北京是中国的首都,有很多名胜古迹,如长城,故宫,天坛等,我十分喜欢喜欢喜欢喜欢…..

示例2:句子级别的重复

User: 你喜欢北京么?

AI: 北京是中国的首都,有很多名胜古迹,如长城,故宫,天坛等,我十分热爱北京,我十分热爱北京,我十分热爱北京,…..

3. LLM复读机原因

本文主要参考了清华大学的论文《Learning to Break the Loop: Analyzing and Mitigating Repetitions for Neural Text Generation》,文中详细介绍了LLM产生复读的原因。论文的前提假设是LLM的解码均为贪心解码(greedy decoding),即每次生成的token选择词表中概率最大的token。

结论如下:

(1) LLM趋向于提高重复先前句子的概率

特别地,即使仅出现一条句子级的上下文重复,重复的概率在大多数情况下也会增加。产生这种现象的原因可能是LLM对上下文非常有信心,当先前的token共享同一个句子级的上下文时,模型会学到一条捷径,直接复制该token。

另一种解释就是Inudction Head机制,即模型会倾向于从前面已经预测word里面挑选最匹配的词。

举个例子来说明下,示例1中的第二个’喜欢’共享了同句子中的’我十分喜欢’,因此模型直接会将’喜欢’拷贝至’我十分喜欢’,进而生成’我十分喜欢喜欢’

(2) 自我强化效应(self-reinforcement effect)

重复的概率几乎随着历史重复次数的增加而单调增加,最终,重复概率稳定在某个上限值附近。

一旦生成的句子重复几次,模型将会受困于因自我强化效应引起的句子循环。

下图是论文中的图,意思是随着重复次数的增加,’general’一词的概率几乎单调增加,最终趋于稳定。其中红柱表示生成相同token的概率,蓝色表示最大概率。

(3) 初始概率较高的句子通常具有较强的自我强化效应。

4. 如何解决

目前针对LLM重复生成的问题,主要有两种策略,一种是基于训练思想,一种是基于解码策略。

4.1 基于训练策略

整体思想就是通过构造伪数据,即短语重复、句子重复等伪数据,如短语或句子重复N遍,然后设计重复惩罚项来抑制大模型生成重复句子。

论文中提出了DITTO方法即采用了此策略,DITTO全称为PseuDo RepetITion PenalizaTiOn(不得不佩服算法名称的设计精美~)。

重复惩罚项通过设计损失函数来达成,其中是惩罚因子λ,论文中提到,对于开放式生成,推荐取值为0.5,对于总结摘要类任务,取值为0.9性能更好。

代码分析:

DITTO损失函数计算的代码块位于https://github.com/Jxu-Thu/DITTO中”DITTO/fairseq/custom/repetetion_penalty_accum_loss.py”方法中,大体流程简要分析如下:

# 构造随机重复的特征

sample, P, L, N, K = self.re_orgnize_sentence(sample)

# 基于构造的重复特征进行预测

net_output = model(**sample['net_input'])

……….

## 计算损失函数

# 获取重复的基线概率信息

gt_probs, mask, valid_tokens = self.obtain_rep_baseline_prob(model.get_targets(sample, net_output), target_probs.detach(), P, L, N, K)

# 损失函数公式套用

one_minus_probs = torch.clamp((1.0 - torch.abs((target_probs - gt_probs*self.rep_reduce_gamma))), min=1e-20)

loss = -torch.log(one_minus_probs) * mask

loss = loss.sum()

此外,基于训练的策略还有其他方式,如UL(unlikelihood training)和SG(straight to gradient),论文链接可以参考第6小节。

4.2 基于解码策略

基于解码策略包含诸多方法,如beam search, random search(topK, topP), 温度, ngram等。

(1) 集束搜索(beam search)

针对贪心策略的改进,思想就是稍微放宽一些考察范围。即,在每一个时间步,不再只保留当前分数最高的1个输出(贪心策略),而是保留num_beams个,当num_beams=1时,集束搜索就退化成了贪心搜索。

(2) random search(topK, topP)

topK即从概率最高的K个token中进行筛选,即允许其他高分tokens有机会被选中

topP将可能性之和不超过特定值的top tokens列入候选名单,topP通常设置较高的值,目的是限制可能被采样的低概率token的长尾

(3) 温度T

较低的温度意味着较少的随机性,温度为0将始终产生相同的输出,较高的温度意味着更多的随机性,可以帮助模型给出更有创意的输出。

基于解码的策略墙裂建议直接查阅transformers框架中的实现方法,本qiang~切身体会,阅读源码确实能愉悦身心~

5. 总结

一句话足矣~

本文主要展开解读了LLM的复读机问题,并参考相关论文,给出基于训练策略和基于解码策略的解决手段,相信客官们清楚该问题了。

静待下一次的LLM知识点分享~

6. 参考

(1) DITTO: https://arxiv.org/pdf/2206.02369.pdf

(2) UL: https://arxiv.org/pdf/1908.04319v2.pdf

(3) SG: https://arxiv.org/pdf/2106.07207v1.pdf

(4) beam search: https://zhuanlan.zhihu.com/p/114669778

(5) random search(topK, topP), 温度: https://zhuanlan.zhihu.com/p/613428710

LLM面面观之LLM复读机问题及解决方案的更多相关文章

  1. UOJ #450「集训队作业2018」复读机

    UOJ #450 题意 有$ k$台复读机,每时每刻有且只有一台复读机进行复读 求$ n$时刻后每台复读机的复读次数都是$ d$的倍数的方案数 $ 1\leq d \leq 3,k \leq 5·10 ...

  2. UOJ#450. 【集训队作业2018】复读机 排列组合 生成函数 单位根反演

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ450.html 题解 首先有一个东西叫做“单位根反演”,它在 FFT 的时候用到过: $$\frac 1 ...

  3. 处女座与复读机 DP

    题目链接:https://ac.nowcoder.com/acm/contest/327/G 题意:给你两个字符串序列,让你根据第二个序列判断是不是 复读机,复读机会有以下特征 1.       将任 ...

  4. 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)

    [UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...

  5. 牛客国庆集训派对Day4 J-寻找复读机

    链接:https://www.nowcoder.com/acm/contest/204/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言20 ...

  6. [2018集训队作业][UOJ450] 复读机 [DP+泰勒展开+单位根反演]

    题面 传送门 思路 本文中所有$m$是原题目中的$k$ 首先,这个一看就是$d=1,2,3$数据分治 d=1 不说了,很简单,$m^n$ d=2 先上个$dp$试试 设$dp[i][j]$表示前$i$ ...

  7. uoj#450. 【集训队作业2018】复读机(单位根反演)

    题面 传送门 题解 我的生成函数和单位根反演的芝士都一塌糊涂啊-- \(d=1\),答案就是\(k^n\)(因为这里\(k\)个复读机互不相同,就是说有标号) \(d=2\),我们考虑复读机的生成函数 ...

  8. UOJ #450. 【集训队作业2018】复读机

    前置知识单位根反演自己去浅谈单位根反演看(此外可能需要一定的生成函数的姿势) 首先一看\(d\)这么小,那我们来分类讨论一下吧 当\(d=1\)时,显然答案就是\(k^n\) 当\(d=2\)时,如果 ...

  9. 牛客寒假算法基础集训营2 【处女座与复读机】DP最小编辑距离【模板题】

    链接:https://ac.nowcoder.com/acm/contest/327/G来源:牛客网 一天,处女座在牛客算法群里发了一句“我好强啊”,引起无数的复读,可是处女座发现复读之后变成了“处女 ...

  10. uoj #450[集训队作业2018]复读机

    传送门 \(d=1\),那么任何时刻都可以\(k\)个复读机的一种,答案为\(k^n\) \(d>1\),可以枚举某个复读机的复读次数(必须是\(d\)的倍数),然后第\(i\)个复读时间为\( ...

随机推荐

  1. Job System 初探

    作者:i_dovelemon 日期:2023-08-24 主题:Fiber, Atomic Operation, MPMC Queue, Multiple thread, Job system 引言 ...

  2. AgileConfig-1.7.0 发布,支持 SSO 🎉🎉🎉

    AgileConfig 已经好久好久没有更新过比较大的功能了.一是 AgileConfig 本身的定位就是比较轻量,不想集成太多的功能.二是比较忙(懒).但是本次升级给大家带来了一个比较有用的功能 S ...

  3. ES13 中11个令人惊叹的 JavaScript 新特性

    前言 与许多其他编程语言一样,JavaScript 也在不断发展.每年,该语言都会通过新功能变得更加强大,使开发人员能够编写更具表现力和简洁的代码. 小编今天就为大家介绍ES13中添加的最新功能,并查 ...

  4. tcpdump后台不间断抓包

    版本1的抓包命令 这两天排查一个小问题,需要在服务器上使用tcpdump24小时不间断抓包,这里简单记录下. 先看下tcpdump的语法: tcpdump [ -AbdDefhHIJKlLnNOpqS ...

  5. Linux 用户及用户组相关文件、命令详解

    Linux 用户及用户组相关文件.命令详解 1. 用户.用户组概念及其文件结构详解 ​ Linux用户只有两个等级:root及非root.Linux中还有一部分用户,如:apache.mysql.no ...

  6. Oracle问题:ORA-01109解决办法

    出现问题: 在数据库服务器端,查询dual表,报ORA-01109错误 ORA-01109:database not open 查看: sqlplus / as sysdba;--管理员登录 sele ...

  7. Welcome to the Android Open Source Project!

    Android is an open-source software stack for a wide range of mobile devices and a corresponding open ...

  8. Keycloak 创建和修改自定义用户信息

    前言 公司在用 Keycloak 作为认证服务器,之前在系统数据库里存的,后来想了想是不是可以在 Keycloak 中存.在网上找的方法大多都是通过 admin 接口去改,但这种方法就需要两种解决方案 ...

  9. JDK21的虚拟线程是什么?和平台线程什么关系?

    虚拟线程(Virtual Thread)是 JDK 而不是 OS 实现的轻量级线程(Lightweight Process,LWP),由 JVM 调度.许多虚拟线程共享同一个操作系统线程,虚拟线程的数 ...

  10. JS个人总结(1)

    1. html页面引入js文件优先使用引入外部js文件. 2. 如果在html页面里使用<script></script>,则把js内容放在html内容下面,也就是</b ...