开源大模型
为什么大模型会出现涌现能力?
首先介绍一下涌现现象:当模型参数量达到一定规模后,突然出现的新的能力,这些能力在小规模模型中通常不会出现或者表现不明显。
NIPS 2023年的一篇论文提出了对涌现能力的一种解释:对于特定任务和模型,在分析模型输出时,涌现能力的出现是由于研究人员选择的衡量指标所致,而非模型行为随着规模扩大而发生了根本性变化。具体而言,非线性或者不连续的衡量标准会产生明显的涌现能力,而线性或连续的度量标准会导致模型性能的平滑、连续、可预测的变化。
模型体系
目前主流的开源大模型体系分为三种:
- Causal Decoder
- 从左到右的单向注意力
- 自回归语言模型,预训练任务和下游应用完全一致,严格遵守当前token只能看到已经解码的部分的规则,在文本生成任务上效果优异,训练效率高,zero-shot能力更强,具有涌现能力
- 代表模型:LLaMA系列模型
- Encoder-Decoder
- 输入上采用双向注意力,对问题的编码理解更充分;输出上采用单向注意力
- 在偏理解的NLP任务上效果好,但是在长文本生成任务上效果较差,训练效率较低
- 代表模型:T5,BART
- Prefix Decoder
- prefix部分的token采取双向注意力+Causal Decoder
- 代表模型:ChatGLM,ChatGLM2,U-PaLM
这三者的主要区别在于attention mask不一样。此外Causal Decoder的训练效率也要高于Prefix Decoder,因为Causal Decoder结构会在所有token上计算损失,而Prefix Decoder只会在输出上计算损失。

为什么现在的大模型大部分都是Decoder Only结构?
Zero-Shot
Decoder Only结构的模型在没有任何微调数据的情况下,Zero-Shot的表现能力最好;而Encoder-Decoder结构的模型需要在一定数量的标注数据上做多任务微调才能激发最佳性能注意力满秩
理论上Encoder的双向注意力会存在低秩问题,即Attention矩阵由一个$n\times d$的矩阵与$d\times n$的矩阵相乘之后加softmax
得到($n >> d$)。退化到低秩状态可能会削弱模型的表达能力。相比之下Causal Attention
是下三角矩阵,行列式不等于0,保证了满秩,从而具备更强的建模能力。预训练任务难度
Decoder Only架构在预训练时由于每个位置接触的信息较少,因此预测下一个token的难度更高,当模型足够大、数据足够多时,Decoder Only模型学习通用表征的上限更高。推理效率
1)就生成任务而言,引入双向注意力并无实质好处,Encoder-Decoder模型架构之所以能够在某些场景下表现更好,可能是因为它多了一倍参数,所以在同等参数量、同等推理成本下,Decoder-Only架构是最优选择。
2)Decoder Only架构支持KV-Cache的复用,每个token的表示只与它之前的输入有关,而Encoder-Decoder架构难以做到这一点
生成式模型的解码方式
- 贪心搜索(greedy search)
在每个时间步,贪心搜索直接选择具有最高条件概率的token,直到出现终结符或最大句子长度
贪心搜索无法保证得到最优序列 - 穷举搜索(exhaustive search)
如果目标是获得最优序列,可以考虑使用穷举搜索,列举所有可能的输出序列及其条件概率,然后选输出条件概率最高的一个
穷举搜索计算量非常大 - 集束搜索(beam search)
集束搜索是一种启发式图搜索算法,在图的解空间比较大的情况下,为了减少搜索所占用的空间和时间,在每一步深度扩展的时候,剪掉一些质量比较差的结点,保留一些质量较高的结点。
具体过程为:使用广度优先策略在树的每一层建立搜索树,按照启发代价对节点进行排序,然后仅保留预先确定的个数(beam size)的节点,仅这些节点在下一层继续扩展,其它节点就被剪掉了。
集束搜索的计算量在贪心搜索和穷举搜索之间,通过灵活地选择束宽,束搜索可以在正确率和计算代价之间进行权衡
InstructGPT
OpenAI并没有公布ChatGPT的论文,不过他们介绍ChatGPT是基于InstructGPT方案做的,因为InstructGPT这篇论文具有重要的参考意义,论文全称是Training language models to follow instructions with human feedback
。
GPT-3本质上是基于上下文的生成模型,这意味着当给GPT-3某种上下文内容时,它会尝试填充其余的内容。例如,给它句子的前半部分,它将尝试推测句子的下半部分;给它一个问句,它会给出回答。但是GPT-3经常会生成与用户期望不一致的非预期输出,这说明增加语言模型的规模并不一定能够提升它们理解和执行用户意图的能力。
InstructGPT通过使用人类的反馈来微调语言模型,从而使模型更好地符合用户的意图。首先,构建(用户Prompt-期望模型输出)的数据集,使用这个数据集通过监督学习对GPT-3进行微调;随后,收集一个模型输出的排名数据集,使用这个数据集通过人类反馈的强化学习(Reinforcement Learning from Human Feedback, RLHF)进一步微调监督模型。微调之后的模型称之为InstructGPT。实验表明,1.3B的InstructGPT模型产生的输出比175B的GPT-3模型产生的输出更受人类青睐。

具体而言,主要流程如下:
- 工程师团队设计了一个基于Prompt的数据集,提示文本中详细说明了下游任务是什么。将这个数据集给标注人员标注,得到人类期望的模型输出。那标注后的数据集去微调GPT-3。
- 用微调之后的GPT-3去预测第一步的数据集中的任务,得到$N$个结果。再让标注人员去标注每个选项的好坏,并把这个标注后的数据集用来训练奖励模型(Reward Model, RM)。
- 用微调之后的GPT-3再次对Prompt进行预测,然后通过奖励模型进行打分,计算奖励,通过PPO策略更新模型参数
当然,这个方法可能会导致在NLP任务上表现变差,为了缓解该问题,OpenAI在微调期间混合了一小部分用于训练GPT-3的原始数据,还尝试将预训练梯度混合到PPO梯度中。此外,随着模型的更新,强化学习模型产生的数据和训练奖励模型的数据的差异会越来越大,OpenAI的解决方案是在损失函数中加入KL惩罚项来确保PPO模型的输出和SFT的输出差距不会太大。
LLM缺陷与解决方案
复读机问题
为什么会出现LLMs复读机问题?
- 数据偏差
如果训练数据中存在大量的重复文本或者某些特定的句子和短语出现频率比较高的话,模型在生成文本时可能会倾向于复制这些常见的模式。 - 训练目标的限制
模型的训练目标是通过预测下一个词来学习语言模型,这种训练目标可能使得模型更倾向于生成与输入相似的文本,导致出现复读机问题 - 缺乏多样性的训练数据
如果训练数据中缺乏多样性的语言表达和语境,模型可能无法学到足够的多样性和创造性,导致出现复读机问题 - 模型结构和参数设置
大型语言模型的结构和参数设置也可能导致复读机问题
如何解决复读机问题?
- Unlikelihood Training
在训练中加入对重复词的抑制,从而减少重复输出 - 引入噪声
在生成文本时,引入一些随机性或者噪声,例如采样不同的词或短语,或者引入随机的变换操作,以增加生成文本的多样性 - 引入重复惩罚
在模型推理过程中加入重复惩罚因子,对原有的softmax结果进行修正,降低重复生成的token被选中的概率 - Beam Search
Beam Search是对贪心策略的一种改进,虽然本质上并没有降低重复率的操作,但是该策略在结果上优化了部分生成结果,一定程度上降低了重复率 - TopK Sampling
对Softmax的输出结果logit中最大的K个token采样来选择输出的token,相比于贪心搜索添加了随机性
当概率分布非常极端时,即模型非常确定下一个token是什么的时候,容易生成错误回复 - Nucleus Sampler
Nucleus sampler俗称TopP采样,该采样方式不同于TopK采样限制K的数目,而是通过Softmax排序后的概率来采样。当候选token的概率之和大于P时停止采样,从而减少异常错误发生的概率。 - Temperature
温度是用于调整随机程度的数字,较低的温度意味着较少的随机性。 - No repeat n-gram size
限制设置的n-gram不能出现重复,如果重复,就选概率次大的一个,来强制模型不生成重复的token。
长文本问题
如何让大模型处理更长的文本?
序列长度直接影响Attention的计算复杂度,序列太长会影响训练速度,同时也会占用更多的计算资源。此外,超长上下文的大模型在部署推理时,也会导致推理时间变长,推理显存空间变大。让大模型处理更长的文本,一般有两种途径:1)大模型在初始阶段被设置为长上下文,然后经过预训练,指令微调和对齐训练等方式得到一个长上下文模型;2)选择已经训练好的大模型,通过技术改造扩展其上下文长度,然后再进行微调训练得到长上下文模型。
【参考文献】