Skip to content

大模型(LLMs)进阶面试指南

📝 通俗解释:本笔记整理了大模型面试中常见的问题和知识点,包括生成式大模型的原理、复读机问题的解决方法、模型选择等核心内容。


一、什么是生成式大模型?

生成式大模型(一般简称大模型/LLMs)是指能用于创作新内容(例如文本、图片、音频以及视频)的一类深度学习模型。相比普通深度学习模型,主要有两点不同:

  1. 模型参数量更大:参数量都在 Billion(十亿)级别
  2. 可条件或上下文引导生成内容:所谓的 prompt engineering(提示工程)由此而来

📝 通俗解释:生成式大模型就像一个超级博学的"文字创作者",它读过海量的书籍和文章,所以能够根据你的要求(prompt)来创作新的内容。比如你让它写一首诗,它就能根据学到的知识创作出来。


二、大模型是怎么让生成的文本丰富而不单调的呢?

1. 从训练角度来看

  • 大参数量模型:基于 Transformer 的模型参数量巨大,有助于模型学习到多样化的语言模式与结构
  • 微调技术:各种模型微调技术的出现,例如 P-Tuning、LoRA,让大模型微调成本更低,也可以让模型在垂直领域有更强的生成能力
  • 设计好的 Loss:在训练过程中加入一些设计好的损失函数,也可以更好地抑制模型生成单调内容

2. 从推理角度来看

  • 采样策略:基于 Transformer 的模型可以通过引入各种参数与策略,例如 Temperature、Nucleus Sampling 来改变每次生成的内容

📝 通俗解释:让大模型生成丰富内容的"秘诀"主要有两方面——训练时让它学到多样的表达方式,推理时通过一些随机性策略让它每次生成的内容有所不同。这就像同一个话题,让不同的人来写会有不同的文章一样。


三、LLMs 复读机问题

3.1 什么是 LLMs 复读机问题?

LLMs 复读机问题是指大模型在生成文本时不断重复相同或相似的内容,主要表现为以下几种形式:

  1. 字符级别重复:大模型针对一个字或一个词重复不断的生成

    • 例如:在电商翻译场景中,会出现 "steckdose steckdose steckdose..."
  2. 语句级别重复:大模型针对一句话重复不断的生成

    • 例如:在多模态大模型图片理解上,生成结果可能会不断重复图片的部分内容,比如"这是一个杯子,这是一个杯子..."
  3. 章节级别重复:多次相同的 prompt 输出完全相同或十分近似的内容,没有一点创新性的内容

    • 例如:让大模型写一篇关于春天的小作文,结果发现生成的千篇一律,甚至近乎一模一样
  4. 语义单调:大模型针对不同的 prompt 也可能会生成类似的内容,且有效信息很少、信息熵偏低

📝 通俗解释:复读机问题就像一个人说话时总是翻来覆去说同样的话。大模型有时候会陷入"机械重复"的模式,比如让它介绍一个产品,它能连续说十遍"这个产品很好",这就是典型的复读机问题。

3.2 为什么会出现 LLMs 复读机问题?

  1. 数据偏差:大型语言模型通常是通过预训练阶段使用大规模无标签数据进行训练的。如果训练数据中存在大量的重复文本或者某些特定的句子或短语出现频率较高,模型在生成文本时可能会倾向于复制这些常见的模式。

  2. 训练目标的限制:大型语言模型的训练通常是基于自监督学习的方法,通过预测下一个词或掩盖词来学习语言模型。这样的训练目标可能使得模型更倾向于生成与输入相似的文本,导致复读机问题的出现。

  3. 缺乏多样性的训练数据:虽然大型语言模型可以处理大规模的数据,但如果训练数据中缺乏多样性的语言表达和语境,模型可能无法学习到足够的多样性和创造性。

  4. 模型结构和参数设置:大型语言模型的结构和参数设置也可能对复读机问题产生影响。例如,模型的注意力机制和生成策略可能导致模型更倾向于复制输入的文本。

  5. 从 Induction Head 机制的影响角度:模型会倾向于从前面已经预测的词里面挑选最匹配的词;在翻译上,由于 input 和 output 的天然差异性,容易出现重复的都是一些复杂度(perplexity)比较高的文本。也就是说,input 的句式越不常见,本身重复度越高,翻译结果重复的可能性也越高。

    📝 注:我们分别以 flores-101 通用文本和电商标题文本做了尝试,后者出现重复的概率是前者的 20 倍以上。

  6. 从信息熵的角度分析:在模型生成采样时,应该只采样那些与条件熵对应概率接近的字符。电商标题作为一种语句连贯性很弱、基本是词序堆叠的文本,信息熵很高,下一个词预测时概率后验很难预测出来,Softmax 的分布也倾向于平稳,也就是说模型也预测不出来下一个词应该是什么。因此模型会倾向从前面的词里面挑选重复。

📝 通俗解释:为什么大模型会不自觉地重复说话呢?主要是因为:(1)训练数据里重复内容太多,它学会了复制;(2)它的训练目标是"预测下一个词",这让它倾向于延续前面的内容;(3)有些文本本身就很零散(比如电商标题),模型不知道下一个词该说什么,就干脆重复前面的。

3.3 如何缓解 LLMs 复读机问题?

3.3.1 Unlikelihood Training(不可能性训练)

  • 思路:在训练中加入对重复词的抑制来减少重复输出
  • 介绍:在原有 likelihood training loss 基础上加入 unlikelihood loss,抑制模型生成集合 C 中的 token

Token 级 Unlikelihood Training Loss: $$\mathcal{L}{\text{UL-token}}^t(p\theta(\cdot|x_{<t}), \mathcal{C}^t) = -\alpha \cdot \underbrace{\sum_{c \in \mathcal{C}^t} \log(1 - p_\theta(c|x_{<t}))}{\text{unlikelihood}} - \underbrace{\log p\theta(x_t|x_{<t})}_{\text{likelihood}}$$

Sentence 级 Unlikelihood Training Loss: $$\mathcal{L}{\text{UL}}^t(p\theta(\cdot|x_{<t}), \mathcal{C}^t) = - \sum_{c \in \mathcal{C}^t} \log(1 - p_\theta(c|x_{<t}))$$

📝 通俗解释:Unlikelihood Training 就像告诉模型:"这个词你之前用过好几次了,这次尽量别再用它了"。通过在训练时加入这种"惩罚",让模型学会不要总是重复同样的词。

实验结果:

Modelsearchseq-rep-4uniq-seqpplaccrepwrepuniq
$\mathcal{L}_{\text{MLE}}$greedy.44210.8k25.64.395.627.35211.8k
beam.5239.5k
$\mathcal{L}_{\text{UL-token}}$greedy.28313.2k26.91.390.577.31112.7k
beam.33611.7k
$\mathcal{L}_{\text{UL-seq}}$greedy.13713.1k25.42.399.609.33512.8k
beam.01918.3k
$\mathcal{L}_{\text{UL-token+seq}}$greedy.05815.4k26.72.395.559.29313.8k
beam.01319.1k
Human-.00619.8k--.487-19.8k

📝 通俗解释:上表中 seq-rep-4 代表 4-gram 重复率;uniq-seq 代表总共出现的不同词的个数;ppl 代表句子困惑度;acc 代表句子准确性;rep 代表前词重复率。从这些指标中可以明显观察到,unlikelihood training 能降低整体生成句子的重复度。

⚠️ 注意:该方法仅能解决字符级和语句级重复问题,无法解决输入多次相同 prompt 输出单调性的问题。

参考:NEURAL TEXT DEGENERATION WITH UNLIKELIHOOD TRAINING


3.3.2 引入噪声

在生成文本时,引入一些随机性或噪声,例如通过采样不同的词或短语,或者引入随机的变换操作,以增加生成文本的多样性。这可以通过在生成过程中对模型的输出进行采样或添加随机性来实现。

📝 通俗解释:就像在写作时故意"不走寻常路",引入一些随机性,让模型不要总是按最常见的套路出牌,这样生成的内容会更丰富多样。


3.3.3 Repetition Penalty(重复惩罚)

  • 思路:重复性惩罚方法通过在模型推理过程中加入重复惩罚因子,对原有 Softmax 结果进行修正,降低重复生成的 token 被选中的概率

$$p_i = \frac{\exp(x_i / (T \cdot I(i \in g)))}{\sum_j \exp(x_j / (T \cdot I(j \in g)))} \quad I(c) = \theta \text{ if c is True else } 1$$

📝 通俗解释:公式中的 theta 就是惩罚力度,设置为 1.2 表示对重复的词进行惩罚,让它被选中的概率降低。这就像考试时,如果答案和前面写的一样,就会扣分。

  • 参数设置
    • T 代表温度,温度越高,生成的句子随机性越强
    • theta 值一般设置为 1.2,1.0 代表没有惩罚

📝 通俗解释:Repetition Penalty 是一种简单有效的重复抑制方法。在 Huggingface 中,model.generate 已包含此参数,仅需设置 repetition_penalty=p(p>1.0)即可开启。

⚠️ 注意:该方法仅能解决字符级和语句级重复问题,无法解决输入多次相同 prompt 输出单调性的问题。

参考:CTRL: A CONDITIONAL TRANSFORMER LANGUAGE MODEL FOR CONTROLLABLE GENERATION


3.3.4 Contrastive Search(对比搜索)

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

对比 Loss(Contrastive Loss): $$\mathcal{L}{\text{CL}} = \frac{1}{|\boldsymbol{x}| \times (|\boldsymbol{x}|-1)} \sum^{|\boldsymbol{x}|} \sum_{j=1, j \neq i}^{|\boldsymbol{x}|} \max {0, \rho - s(h_{x_i}, h_{x_i}) + s(h_{x_i}, h_{x_j})}$$

其中 $s(h_{x_i}, h_{x_j}) = \frac{h_{x_i}^{\top} h_{x_j}}{|h_{x_i}| |h_{x_j}|}$ 是余弦相似度

📝 通俗解释:对比 Loss 的核心思想是让模型学会区分不同的词——相似的词在空间中距离要远一些,这样模型就不会总是倾向于生成那些"老朋友"词了。

对比搜索(Contrastive Search): $$x_t = \arg \max_{v \in V^{(k)}} \left{ (1 - \alpha) \times \underbrace{p_\theta(v | \boldsymbol{x}{<t})}{\text{model confidence}} - \alpha \times \underbrace{(\max { s(h_v, h_{x_j}) : 1 \le j \le t - 1 })}_{\text{degeneration penalty}} \right}$$

其中第一项是原模型的概率,第二项是一种惩罚——当前 token 与历史 token 相似度较高时,就降低当前 token 的概率。

📝 通俗解释:对比搜索在生成时会"检查"当前词是否和之前说过的太像了,如果太像就降低它的分数。这样就能避免翻来覆去说同样的话。

⚠️ 注意:该方法仅能解决字符级和语句级重复问题,无法解决输入多次相同 prompt 输出单调性的问题。

参考

  • 论文:A Contrastive Framework for Neural Text Generation
  • Github:https://github.com/yxuansu/SimCTG
  • Huggingface:设置 penalty_alpha=alpha(0<alpha<1)即可开启

3.3.5 Beam Search(集束搜索)

  • 思路:Beam Search 是对贪心策略一种改进。思路简单,就是稍微放宽考察的范围。在每一个时间步,不再只保留当前分数最高的 1 个输出,而是保留 num_beams 个。当 num_beams=1 时就退化成了贪心搜索。

📝 通俗解释:Beam Search 就像同时考虑多条写作思路,而不是只盯着一条路走到黑。比如写一句话时,同时保留几个可能的方向,最后选择最好的那个。

示例(num_beams=2):

初始状态:[]
Timestep 1:生成 A,B,C,D,E → 保留概率最高的 A 和 C
Timestep 2:从 A 扩展 → 保留 B(序列 AB);从 C 扩展 → 保留 E(序列 CE)
Timestep 3:从 B 扩展 → 保留 D(序列 ABD);从 E 扩展 → 保留 D(序列 CED)
最终结果:ABD 和 CED

⚠️ 注意:Beam Search 理论上并不能对大模型中的任何重复问题进行修正,甚至有可能增大重复概率。但从翻译的测试实验结果来看,它确实在一定程度上改变了模型 Softmax 后的分布情况,优化了输出的结果。

Huggingface 使用:设置 num_beams=2 即可开启集束搜索


3.3.6 TopK Sampling

TopK 通过对 Softmax 的输出结果 logit 中最大的 K 个 token 采样来选择输出的 token。

  • 优点:相比于贪心搜索增添了随机性,同样的输入,多次经过 TopK 采样生成的结果大概率不会一样
  • 问题:当概率分布很极端时,即模型很确定下一个 token 时,容易造成生成错误

📝 通俗解释:TopK 采样就像从概率最高的 K 个词里随机抽一个。这样每次生成的结果都会有所不同,增加了多样性。但问题是如果模型特别有"把握"时,可能会选错词。

Huggingface 使用:设置 do_sample=True 同时设置 top_k 值(默认为 50)

⚠️ 注意:TopK 采样是能解决所有重复单调问题的方案之一,但存在最大问题是最后生成的句子可能狗屁不通,不能保证句子的通顺度以及对 prompt 的忠诚度。


3.3.7 Nucleus Sampling(核采样/TopP 采样)

Nucleus Sampling 俗称 TopP 采样,是一种用于解决 TopK 采样问题的新方法。

  • 思路:不限制 K 的数目,而是通过 Softmax 后排序 token 的概率,当概率之和大于 P 时停止
  • 优点:当模型很确定下一个 token 时,可采样的 K 也会很少,减少异常错误发生的概率

📝 通俗解释:TopP 采样的思路是"宁缺毋滥"——不是固定选 K 个,而是选到累积概率达到某个阈值就够了。这样模型很有把握时就不必从更多不确定的词里选,减少了出错几率。

Huggingface 使用:设置 do_sample=True 同时设置 top_p 值(默认为 1.0)

📝 通俗解释:相比 TopK,TopP 生成的句子通顺度以及对 prompt 的忠诚度更佳,一般建议选择它而不是 TopK。


3.3.8 Temperature(温度参数)

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

  • 较低的温度:意味着较少的随机性,温度为 0 将始终产生相同的输出。适合有"正确答案"的任务,如总结类、翻译类
  • 较高的温度:意味着更多的随机性,可以帮助模型给出更有创意的输出,但可能偏离主题或给出无意义的输出

📝 通俗解释:Temperature 就像调节"创意程度"的旋钮。温度低时模型比较"保守",总是选最安全的词;温度高时模型更"奔放",可能会冒出一些意想不到的内容。

调整公式: $$p_i = \frac{\exp(x_i / (T \cdot I(i \in g)))}{\sum_j \exp(x_j / (T \cdot I(j \in g)))}$$

📝 通俗解释:Temperature 参数 T 就是之前 Repetition Penalty 公式里的 T。Temperature 配合 TopK 或 TopP 采样,可以达到生成更有创意回答的需求,但生成句子的稳定性不可控。

Huggingface 使用:设置 temperature(默认为 1.0)


3.3.9 No Repeat Ngram Size

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

📝 通俗解释:这就相当于给模型下死命令:"不准出现连续两个相同的词!出现我就换下一个"。是最直接但也比较粗暴的方法。

Huggingface 使用:设置 no_repeat_ngram_size=N

⚠️ 注意:该方法仅能解决字符级和语句级重复问题,无法解决输入多次相同 prompt 输出单调性的问题。


3.3.10 重复率指标检测

常见重复率监测指标:seq-rep-Nuniq-seqrepwrep

通过这些指标的融合,可以对重复生成的结果进行一定程度的监测,并在监测到异常生成结果时,通过加入特殊字符、修改 prompt 表达等形式来重新生成结果。

📝 通俗解释:就像安装了一个"重复检测器",一旦发现模型开始说车轱辘话,就及时干预,让它换个说法。

⚠️ 注意:通过切分或加入特殊字符的方式确实能让本身异常的翻译结果恢复正常,但潜在风险是翻译的语序可能会出现一定的问题。


3.3.11 后处理和过滤

对生成的文本进行后处理和过滤,去除重复的句子或短语,以提高生成文本的质量和多样性。可以使用文本相似度计算方法或规则来检测和去除重复的文本。

📝 通俗解释:就像文章写完后检查一遍,把重复的段落删掉或改写,让最终输出更干净。


3.3.12 人工干预和控制

对于关键任务或敏感场景,可以引入人工干预和控制机制,对生成的文本进行审查和筛选,确保生成结果的准确性和多样性。

📝 通俗解释:对于重要场合,比如法律文书、医疗建议等,必须有人类把关,不能完全让模型自由发挥。


四、LLaMA 系列问题

4.1 LLaMA 输入句子长度理论上可以无限长吗?

限制在训练数据。理论上使用 RoPE 的 LLaMA 可以处理无限长度,但实际上存在一些限制和挑战:

  1. 计算资源:生成长句子需要更多的计算资源,包括内存和计算时间。由于 LLMs 通常是基于神经网络的模型,计算长句子可能会导致内存不足或计算时间过长的问题。

  2. 模型训练和推理

    • 训练阶段:处理长句子可能会导致梯度消失或梯度爆炸的问题,影响模型的收敛性和训练效果
    • 推理阶段:生成长句子可能会增加模型的错误率和生成时间
  3. 上下文建模:LLMs 是基于上下文建模的模型,长句子的上下文可能会更加复杂和深层。模型需要能够捕捉长句子中的语义和语法结构,以生成准确和连贯的文本。

📝 通俗解释:虽然理论上可以处理无限长,但实际上就像绳子一样,太长了就容易"打结"(计算复杂)、"断裂"(梯度问题)、"力不从心"(效果下降)。目前主流大模型支持的长度一般在 2K-32K token 之间。

应对方法

  • 采用分块方式处理长句子
  • 增加计算资源
  • 优化模型结构和参数设置
  • 使用更高效的推理算法

五、Bert 模型 vs LLaMA/ChatGLM 类大模型,如何选择?

模型对比

模型参数量特点适用场景
BERT约 1.1 亿NLU 任务效果好,单卡 GPU 可部署,速度快实体识别、信息抽取、文本分类等 NLU 任务
ChatGLM-6B60 亿可以处理所有 NLP 任务,效果好纯中文任务的 NLG 任务
LLaMA-7B70 亿可以处理所有 NLP 任务,效果好中英文 NLG 任务

📝 通俗解释:BERT 像是"专科医生",在 NLU(理解)任务上很在行,而且部署便宜、反应快;LLaMA/ChatGLM 像是"全科医生",什么都能干,但比较"贵"(需要好显卡)、反应慢。

选择建议

  1. NLU 相关任务:用 BERT 模型能处理得很好,如实体识别、信息抽取、文本分类,没必要上大模型
  2. NLG 任务
    • 纯中文任务:用 ChatGLM-6B
    • 需要处理中英文任务:用 Chinese-Alpaca-Plus-7B-HF

📝 通俗解释:就像去医院看病,小问题找专科医生(BERT)就行,又快又便宜;大问题需要会诊(全科能力),再考虑找专家团队(大模型)。


六、各个专业领域是否需要各自的大模型来服务?

答案:通常需要各自的大模型来服务,原因如下:

  1. 领域特定知识:不同领域拥有各自特定的知识和术语,需要针对该领域进行训练的大模型才能更好地理解和处理相关文本。例如,医学领域需要训练具有医学知识的大模型。

  2. 语言风格和惯用语:各个领域通常有自己独特的语言风格和惯用语,这些特点对于模型的训练和生成都很重要。

  3. 领域需求的差异:不同领域对于文本处理的需求也有所差异。例如:

    • 金融领域:更关注数字和统计数据的处理
    • 法律领域:更关注法律条款和案例的解析
  4. 数据稀缺性:某些领域的数据可能相对较少,无法充分训练通用的大模型。针对特定领域进行训练的大模型可以更好地利用该领域的数据。

📝 通俗解释:就像不可能让一个全科医生精通所有科室一样,通用大模型在专业领域往往不如"专科"模型好用。比如让 ChatGPT 写医学论文,可能不如专门训练过的医学大模型写得专业。

折中方案:可以共享通用的模型和技术,通用大模型用于处理通用文本任务,领域特定模型在通用模型基础上进行微调,这样可以减少重复训练和资源消耗。


七、如何让大模型处理更长的文本?

动机

目前绝大多数大模型支持的 token 最大长度为 2048,因为序列长度直接影响 Attention 的计算复杂度(O(N²)),太长了会影响训练速度。

方法一:LongChat

step1:Position 等比例缩放

  • 将新的长度压缩到原来 2048 长度上,好处是能复用原来的位置信息
  • 例如从 2048 扩展到 16384,长度变为原来的 8 倍,那么值为 10000 的 position_id 被压缩成 10000/8=1250
python
# 将 position_ids 按比例缩放
query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids / ratio)

step2:微调

  • 用训练 Vicuna 的对话语料做微调,超过 16k 的文本被截断

📝 通俗解释:LongChat 的思路就像是把一本很长的书"缩印"到原来的小本本里,这样既能看到全貌,又不改变相对位置关系。

方法二:ALiBi(Attention with Linear Biases)

Position 等比例缩放既然有用,那后续会不会有一种新的 position 构造的方式,无论多长都可以归一到同样的尺度下,只要 position 的相对位置保持不变就可以?ALiBi 的方法就是一个比较简单优雅的方式,可以部分解决扩展长度的问题。

商业模型的做法

ChatGPT 和 Claude 到底是怎么做的目前都没有公开,但目前有证据的方法包括:

  1. 稀疏化:GPT3 论文中曾提到有这方面的尝试
  2. MoE(混合专家):周彦祺在一次分享中透露 GPT-4 用了 MoE 的技术(猜测是 100B×16E)
  3. Multi-Query Attention:Google 的 PaLM、Falcon 等模型都用到过,通过权重共享来提升性能

未来方向

  1. Linear Attention:将 Attention 的复杂度从 O(N²) 降低为 O(N),例如 Linear Transformer 和 RWKV
  2. RNN 回归:RWKV 敢于把 RNN 拿回来,是一个很有勇气的尝试

📝 通俗解释:处理长文本的核心难点是计算量随长度指数增长。目前的解决方案主要有:(1)"偷工减料"(稀疏化);(2)"能者多劳"(MoE);(3)"另辟蹊径"(Linear Attention)。未来的趋势可能是让 Transformer 和 RNN 融合,取长补短。


总结

本面试指南涵盖了以下核心知识点:

知识点难度重要程度
生成式大模型概念⭐⭐⭐
复读机问题及解决方案⭐⭐⭐⭐⭐⭐⭐⭐
LLaMA 长文本处理⭐⭐⭐⭐⭐
模型选择策略⭐⭐⭐⭐⭐⭐
领域大模型必要性⭐⭐⭐

📝 通俗解释:大模型面试中,最常考的就是"如何解决复读机问题",这部分需要重点掌握各种解码策略(TopK、TopP、Beam Search等)的原理和优缺点。

基于 MIT 许可发布