LLM基础知识
1.LLM中token指的是什么?
在大语言模型中,Token是模型进行语言处理的基本信息单元,它可以是一个字,一个词甚至是一个短语句子。Token并不是一成不变的,在不同的上下文中,他会有不同的划分粒度。
(1) 字节对编码(BPE, Byte Pair Encoding)
- 原理:通过统计文本中字符的共现频率,逐步合并高频字符对,生成子词单元。
- 特点:
- 适用于多语言,能处理未登录词(OOV)。
- 例如:将 “unlearning” 拆分为 [“un”, “learn”, “ing”]。
- 应用:GPT、BERT、T5 等模型广泛使用。
(2) WordPiece
- 原理:与 BPE 类似,但优先合并更常见的子词。
- 特点:
- 优化了 BPE 的冗余合并问题。
- 例如:将 “playing” 拆分为 [“play”, “##ing”]。
- 应用:BERT 等模型。
(3) SentencePiece
- 原理:基于 BPE 的改进版本,支持无监督训练,可处理多语言。
- 特点:
- 不依赖预定义的词典,直接从文本中学习分词规则。
- 例如:中文可能拆分为字或词(如 “我”、”喜欢”)。
- 应用:LLaMA、Qwen 等模型。
token转换:
- 解码器的最终计算:
- 在生成过程的每一步,解码器接收到目前为止已生成的 Token 序列(以及可能来自编码器的信息,如果是 Encoder-Decoder 结构的话)。
- 解码器通过其内部的多层自注意力和前馈网络进行计算。
- 其最后一层通常是一个线性层 (Linear Layer),有时被称为 “语言模型头 (LM Head)” 或 “输出投影层 (Output Projection Layer)”。
- 这个线性层的输出维度等于模型词汇表的大小 (vocab_size)。
- 对于当前要预测的下一个 Token 位置,这个线性层会输出一个原始得分向量 (Logits),向量中的每个元素对应词汇表中一个 Token 的得分。这个向量的形状通常是
(batch_size, vocab_size)
或者在单序列生成时是(1, vocab_size)
。
- 转换为概率分布:
- 原始的 Logits 分数并不能直接表示概率。
- 需要通过 Softmax 函数将 Logits 向量转换为一个概率分布。Softmax 会将所有得分转换到 [0, 1] 区间,并且所有 Token 的概率之和为 1。
- 现在,我们得到了一个表示词汇表中每个 Token 成为下一个 Token 的概率的向量。
- 选择下一个 Token (Decoding Strategy):
- 有了概率分布,模型需要决定具体选择哪个 Token 作为下一个输出。这里有多种策略:
- 贪心搜索 (Greedy Search): 直接选择概率最高的那个 Token。最简单,但可能导致重复或不自然的文本。
- 束搜索 (Beam Search): 在每一步保留概率最高的
k
个候选序列,并在下一步基于这k
个序列继续扩展。能生成更连贯的文本,但计算量更大。 - 采样 (Sampling):
- 温度采样 (Temperature Sampling): 在 Softmax 之前调整 Logits 的分布(用温度 T 除 Logits)。T > 1 使分布更平坦(更随机、更有创造性),T < 1 使分布更尖锐(更集中于高概率词、更保守)。然后根据调整后的概率分布进行随机采样。
- Top-k 采样: 只考虑概率最高的
k
个 Token,将它们的概率重新归一化,然后从中采样。避免采样到概率极低的奇怪词。 - Top-p (Nucleus) 采样: 选择概率总和刚好超过阈值
p
的最小 Token 集合(核心集),将它们的概率重新归一化,然后从中采样。动态调整候选集大小。
- 通过这些策略,模型最终确定了下一个 Token 的 整数 ID (Token ID)。
- 有了概率分布,模型需要决定具体选择哪个 Token 作为下一个输出。这里有多种策略:
- 将 Token ID 转换为文本 (Detokenization):
- 模型现在有了一个 Token ID(例如,整数 50256 可能代表
<|endoftext|>
,整数 198 可能代表换行符\n
,整数 640 可能代表单词 “ the”)。 - 这时就需要分词器 (Tokenizer) 发挥作用了。分词器不仅负责将输入文本转换为 Token ID(编码),也负责将模型生成的 Token ID 转换回对应的文本片段(解码/Detokenization)。
- 分词器内部维护着一个词汇表 (Vocabulary),存储着 Token ID 到实际文本(单词、子词、符号等)的映射关系。
- 模型将选定的 Token ID 输入分词器的解码功能,得到对应的文本字符串。
- 模型现在有了一个 Token ID(例如,整数 50256 可能代表
- 迭代生成:
- 新生成的 Token(及其 ID)会被添加到已生成的序列末尾。
- 这个更新后的序列将作为解码器在下一个时间步的输入。
- 重复步骤 1-4,直到模型生成一个特殊的结束符 Token (End-of-Sequence, EOS),或者达到预设的最大生成长度。
- 最终输出:
- 将所有生成的文本片段(来自每个 Token ID)拼接起来,就形成了最终用户看到的、连贯的文本输出。分词器在拼接时通常还会处理子词合并、空格添加等细节,使得输出更自然。
2.哪些因素会导致 LLM 中的偏见?
在大型语言模型(LLM)中,偏见可能来源于多个因素,包括以下几个方面:
训练数据的偏差:LLM 的性能依赖于所使用的训练数据。如果训练数据中包含偏见(例如,种族、性别、年龄、宗教等方面的偏见),模型可能会在生成文本时反映出这些偏见。
数据选择与采样方法:如果训练数据在选择和采样过程中不够多样化或不够平衡,可能导致模型对某些群体或观点的偏见。某些少数群体或观点可能在训练数据中被低估或忽视,从而导致模型表现出偏见。
模型架构和训练方法:虽然模型架构本身并不直接产生偏见,但特定的设计选择和训练方法可能会放大训练数据中的偏见。例如,过度优化某些性能指标(如精度)可能会忽视公平性和多样性。
人类标注者的偏见:在训练监督学习模型时,标注数据的过程通常涉及人类标注者。如果这些标注者带有偏见,他们的偏见可能会传递到训练数据中,从而影响模型的输出。
模型部署和使用环境:即使模型在训练过程中没有明显偏见,在实际部署和使用过程中,用户交互和反馈也可能引入新的偏见。例如,某些用户输入可能会导致模型生成偏见性回答。
社会和文化背景:语言和文化是动态变化的,不同社会和文化背景下的语言使用方式不同。如果模型训练数据主要来自特定文化或语言环境,可能会对其他文化或语言产生偏见。
为了减少这些偏见,研究人员和开发者可以采取以下措施:
多样化训练数据:确保训练数据在性别、种族、文化、社会经济背景等方面具有多样性。
偏见检测和消除:使用技术手段检测和消除模型中的偏见,例如通过去偏算法和公平性评估工具。
透明度和解释性:增加模型的透明度,使用户能够理解模型的决策过程,并及时识别和纠正偏见。
持续监控和改进:在模型部署后持续监控其表现,收集用户反馈,并定期更新和改进模型。
这些方法可以帮助减少 LLM 中的偏见,提高其公平性和可靠性。
3.如何减轻 LLM 中的“幻觉”现象?
大模型幻觉问题主要指:指的是模型生成的内容看似合理但实际上是错误或虚构的信息。
减轻大型语言模型(LLM)中的“幻觉”现象可以通过多种方法实现。改进训练数据质量和训练方法,包括数据清洗、监督学习和强化学习,确保数据的准确性和多样性;采用后处理技术,如事实验证和编辑校对,确保生成内容的真实性;改进模型架构,结合外部知识库和多任务学习增强模型对事实的理解;提高模型透明度和可解释性,使用户能够理解和检查模型的输出;建立用户教育和反馈机制,鼓励用户验证生成内容并报告错误;以及定期更新和维护模型和数据。通过这些方法,可以显著减少模型生成错误信息的可能性,提高内容的准确性和可靠性。
4.解释一下大模型的涌现能力?
大模型的涌现能力指的是,当模型的规模和复杂度达到一定程度时,出现了一些在较小模型中未曾观察到的新特性或能力,如语言理解与生成、推理、多语言处理和少样本学习等。这些能力并非通过直接编程实现,而是在大量数据和复杂训练过程中自然涌现的。
**
上下文学习 (In-Context Learning) / 少样本学习 (Few-Shot Learning):**
- 表现: 不需要重新训练或微调模型,只需在输入提示 (prompt) 中给出几个任务示例(”shots”),大模型就能理解任务意图并解决类似的新问题。
- 例子:
- 给模型看几个英文翻译成法文的例子,然后给一个新英文句子,它能正确翻译成法文。
- 给模型看几个加法运算的例子
(2+3=5, 1+7=8)
,然后问4+2=?
,它能给出6
。
- 涌现性: 小型模型几乎不具备这种能力,需要大量特定任务的微调数据。
多步推理 / 思维链 (Chain-of-Thought, CoT):
- 表现: 对于需要多个逻辑步骤才能解决的问题(如数学应用题、复杂推理问答),大模型可以通过在输出中显式地写出一步步的思考过程,最终得到正确答案。这种能力可以通过特定的提示技巧(如在示例中加入思考步骤)来激发。
- 例子: 解决一个数学题时,模型会先列出已知条件,然后写出计算步骤 1、步骤 2… 最后得出答案。
- 涌现性: 小型模型即使给出思考步骤的示例,也很难生成连贯、正确的推理链。
指令遵循 (Instruction Following):
- 表现: 模型能够理解并执行以自然语言描述的各种复杂指令,即使这些指令描述的任务在预训练数据中从未明确见过。
- 例子: “写一首关于日落的五行诗,风格要伤感”、“总结下面这段文字,不超过 50 字,并提取关键信息点”、“将这段 Python 代码从 Python 2 转换为 Python 3”。
- 涌现性: 小型模型通常只能处理非常简单或模式化的指令。这种能力在经过指令微调 (Instruction Tuning) 后会得到极大增强,但其潜力本身被认为是随着规模涌现的。
代码生成与理解:
- 表现: 根据自然语言描述生成功能正确的代码片段,或者解释现有代码的功能、查找 bug 等。
- 例子: “用 Python 写一个函数,检查一个字符串是否是回文串”。
- 涌现性: 生成复杂、逻辑正确的代码需要模型对编程语言的语法、语义以及常见算法模式有深刻理解,这在小模型中很难实现。
世界知识的运用:
- 表现: 模型能回答关于世界的大量事实性问题,并能在推理和生成中运用这些知识。
- 例子: “法国的首都是哪里?”、“解释光合作用的过程”。
- 涌现性: 模型需要从海量文本中学习并内化大量的结构化和非结构化知识,这需要巨大的模型容量。
特定基准任务性能的跃升:
- 表现: 在一些衡量语言理解、推理、常识等能力的复杂 NLP 基准测试(如 MMLU, BIG-bench 中的部分任务)上,模型性能在达到某个规模后会突然从接近随机猜测的水平大幅提升。
5.解释一下MOE,它的作用主要是什么?
混合专家模型(Mixture of Experts:MoE)是一种稀疏门控制的深度学习模型,它主要由一组专家模型和一个门控模型组成。MoE的基本理念是将输入数据根据任务类型分割成多个区域,并将每个区域的数据分配一个或多个专家模型。每个专家模型可以专注于处理输入这部分数据,从而提高模型的整体性能。
MoE架构的基本原理非常简单明了,它主要包括两个核心组件:GateNet和Experts。GateNet的作用在于判定输入样本应该由哪个专家模型接管处理。而Experts则构成了一组相对独立的专家模型,每个专家负责处理特定的输入子空间。
微软研究报告,参考链接:
https://www.microsoft.com/en-us/research/blog/deepspeed-advancing-moe-inference-and-training-to-power-next-generation-ai-scale/
MoE的普及程度
部分模型采用MoE:例如,Google的Switch Transformer、Meta的Llama 3、以及一些开源模型(如Mistral)均采用了MoE架构。
其他模型未采用:如OpenAI的GPT-4、Google的Gemini、阿里巴巴的Qwen3(截至2025年)等,可能未公开使用MoE,或采用其他优化策略(如更高效的参数共享或动态计算)。
MoE(Mixture of Experts) 是一种通过动态选择专家网络来处理输入的架构。其核心思想是:
- 专家网络(Experts):多个独立的子模型(如小型神经网络),每个专家负责处理特定类型的输入或任务。
- 门控网络(Gating Network):根据输入内容动态分配权重,决定哪些专家参与计算。
- 混合输出:将专家的输出按权重加权求和,形成最终结果。
示例:
假设一个模型有8个专家,输入为“翻译中文到英文”,门控网络可能选择3个专家(如“语言理解”“语法生成”“领域适配”)进行计算,其余专家不参与。MoE的挑战
- 训练复杂性:
- 门控网络需要与专家网络联合训练,可能增加训练难度和收敛时间。
- 专家之间的平衡问题:某些专家可能被过度使用,导致性能下降。
- 计算开销:
- 门控网络的计算和专家选择可能引入额外延迟(尤其在推理阶段)。
- 可解释性:
- 专家的分工和门控逻辑可能难以解释,影响模型的透明度。
- 硬件适配:
- 需要特定的硬件(如TPU)或优化技术(如混合精度训练)来高效运行。
6.如何缓解大语言模型inference时候重复的问题?
缓解大语言模型推理时重复问题的方法包括引入重复惩罚机制、多样性采样技术(如温度采样、Top-k采样、Top-p采样)、N-gram去重、改进模型架构和训练方法(如长程记忆机制、训练数据去重)以及生成后的后处理技术。这些策略可以有效减少生成文本中的重复现象,提高生成内容的多样性和连贯性。
7.什么是大模型智能体?
智能体是具有自主性、反应性、积极性和社交能力特征的智能实体,由三个部分组成:控制端(Brain),感知端(Perception)和行动端(Action)。
控制端:主要由大型语言模型(LLMs)组成,负责存储记忆和知识,处理信息,并制定决策。它能够规划任务、理解上下文和知识库,并作为主控激活其他功能。
感知端:智能体通过这一部分接收外部信息,包括使用自然语言处理技术来理解文本信息,以及利用计算机视觉技术来分析图像和视频数据等。
行动端:智能体通过这一组件与外部环境互动并产生影响。这包括生成文本和图像、机器人的具身交互能力,以及调用各种工具来完成特定任务。
执行能力是 LLM Agent 最显著的特征之一,但这只是区别的一部分,并非全部。
更准确地说,LLM Agent 不仅仅是“LLM + 执行能力”,而是:
- LLM 作为决策核心: 利用 LLM 的强大推理和规划能力来决定 何时、为何 以及 如何 执行。
- 目标导向的自主性: Agent 的行动是为了完成一个设定的目标,它会主动规划步骤并选择行动,而不是简单地执行一个孤立的命令。
- 与环境的闭环交互: Agent 执行动作后会观察结果,并将结果反馈给 LLM,形成一个“感知-思考-行动”的闭环,使其能够适应环境变化、处理错误并调整计划。
8.LLM有哪些类型?
1. 按架构 (Architecture):
稠密模型 (Dense Models):
这是最常见的类型,基于标准的 Transformer 架构。在处理每个 token 时,模型的所有参数都会被激活和使用。
- 例子: GPT-3, Llama 3, Claude 3 (据公开信息判断)。
- 特点: 实现相对直接,但在达到极大参数规模时计算成本非常高。
混合专家模型 (Mixture of Experts, MoE):
这种架构包含多个“专家”子网络(通常是 FFN 层),并有一个门控网络(路由器)为每个输入 token 选择性地激活一小部分专家(如 Top-k)。
- 例子: Mixtral 8x7B, 可能包括 Google 的部分模型 (如 Gemini 的某些版本)。
- 特点: 允许模型拥有巨大的总参数量,但处理单个 token 的计算成本(FLOPs)相对较低。训练和部署(尤其是显存需求)更复杂。
2. 按训练/微调阶段和能力:
基础模型 / 预训练模型 (Base / Foundation Models):
这些模型只经过了大规模语料库的预训练(通常是预测下一个词),没有经过指令微调或对话优化。它们擅长补全文本、生成类似训练数据的文本,但不一定能很好地遵循指令或进行自然对话。
- 例子: 原始的 GPT-3 (davinci), Llama 3 预训练版本。
- 特点: 是后续微调的基础,适合特定领域适应或研究。
指令微调 / 对话模型 (Instruction-Tuned / Chat Models):
这些模型在基础模型之上,进一步使用指令-响应对或对话数据进行了微调,通常还结合了 RLHF (Reinforcement Learning from Human Feedback) 等技术进行对齐。它们更擅长理解并遵循用户指令、进行多轮对话、并表现得更安全和有用。
- 例子: ChatGPT (基于 GPT-3.5/4), Llama 3 Instruct, Claude 3, Mixtral Instruct。
- 特点: 这是大多数用户直接交互的 LLM 类型。
3. 按数据模态 (Data Modality):
纯文本 LLM (Text-Based LLMs):
这是传统的 LLM,只能处理和生成文本数据。
- 例子: GPT-2, BERT, 早期版本的 GPT-3, Llama 1/2 (基础版本)。
多模态 LLM (Multimodal LLMs, MLLMs / LMMs):
这是当前的重要发展方向。这类模型能够理解和处理多种类型的数据输入,最常见的是
文本和图像
,有些也在探索加入音频、视频等。它们不仅能理解文本,还能“看懂”图片内容,并将两者结合起来进行推理和生成。
- 例子: GPT-4V(ision), Google Gemini 系列, Anthropic Claude 3 (具备图像处理能力), LLaVA, Qwen-VL。
- 特点: 扩展了 LLM 的应用范围,使其能够处理更丰富的现实世界信息。
4. 按访问权限 (Access):
开源模型 (Open-Source Models):
模型权重对公众开放,允许研究人员和开发者自由下载、修改和部署。
- 例子: Llama 系列, Mixtral, Qwen, Falcon。
闭源 / 专有模型 (Closed-Source / Proprietary Models):
模型权重不公开,通常通过 API 或特定产品提供服务。
- 例子: OpenAI 的 GPT 系列 (通过 API), Anthropic 的 Claude 系列, Google 的 PaLM/Gemini (部分通过 API)。
9.什么是基础模型?什么是开源模型,和闭源模型?
1. 基础模型:
Foundation model 出自论文《On the Opportunities and Risks of Foundation Models》,其定义标准包括:
(1)使用无监督学习或者自监督学习,仅接受未标记数据的预训练,而没有人工注释或标记数据的参与;
(2)模型规模很大, 通常超过数十亿的参数;
(3)作为基座模型,仅需要通过微调即可转变为特定应用模型。
在 LLM 中的应用
(1) 无监督学习在 LLM 中的角色
- 传统 NLP 中的无监督学习:
- 词向量学习:如 Word2Vec、GloVe 通过共现矩阵或 Skip-Gram 模型学习静态词向量。
- 主题建模:如 LDA(Latent Dirichlet Allocation)从文本中提取主题分布。
- LLM 中的局限性:
- 无法直接用于大规模 LLM 预训练,因为其目标是学习全局数据分布,而非上下文感知的动态表示。
- 例如,Word2Vec 的静态词向量无法捕捉“bank”在“river bank”和“bank account”中的不同含义。
(2) 自监督学习在 LLM 中的核心地位
LLM 预训练的主流方法:
掩码语言建模(MLM):如 BERT 通过遮盖部分 token 并预测其原始值。
1
2
3PYTHON# 示例:BERT 的 MLM 任务
输入: "The [MASK] is blue."
输出: "sky" # 模型预测被遮盖的词因果语言建模(CLM):如 GPT 系列通过前缀上下文预测下一个 token。
1
2
3PYTHON# 示例:GPT 的 CLM 任务
输入: "The cat sat on the"
输出: "mat" # 模型预测下一个词对比学习:如 SimCSE 通过对比正负样本学习句子表示。
1
2
3PYTHON# 示例:SimCSE 的对比学习
正样本对: "The cat sat on the mat" + "A cat is sitting on a mat"
负样本对: "The cat sat on the mat" + "The sun is shining"
优势:
- 无需人工标注:利用数据本身的结构生成伪标签。
- 上下文感知:学习动态表示(如 BERT 的双向上下文,GPT 的单向上下文)。
- 可迁移性:预训练模型通过微调(Fine-tuning)适配下游任务(如分类、问答)。
2.开源模型与闭源模型
开源模型: 开源模型是对公众开放,任何人都可以使用的模型,允许任何针对LLM的修改和定制,例如:LLaMA模型。
闭源模型: 闭源模型为公司专有仅对公众开放接口的模型,例如:GPT-4o。
10.什么是信息理论?
信息理论是研究语言模型的重要理论,其是一门研究信息的度量、传递、存储和处理的学科。它由克劳德·香农(Claude Shannon)在20世纪40年代创立,主要应用于通信、数据压缩、加密、以及编码等领域。信息理论提供了一个框架,用于理解和优化信息系统的性能。
信息理论中最重要的一个概念是信息量(Entropy),也叫信息熵,它是用来度量信息不确定性的一个指标,其公式表达为:
$$
H(X)=-\sum_iP(x_i)\log P(x_i)
$$
其中,$H(X)$为离散随机变量$X$的信息熵,$P(x_i)$是$X$取值$x_i$的概率。
熵的实际上是一个衡量将样本$x\sim p$ 编码成比特串所需要的预期比特数的度量。熵的值越小,表明序列的结构性越强,编码的长度就越短。直观地讲, $-\log p(𝑥)$ 可以视为用于表示出现概率为$ 𝑝(𝑥)$ 的元素$ 𝑥$ 的编码的长度。
11.什么是n-gram模型?
n-gram模型是一种用于自然语言处理和概率语言建模的基本方法。它通过统计文本中$n$个连续单词出现的频率来预测下一个单词的概率,从而生成或分析文本。n-gram模型广泛应用于文本生成、拼写校正、语音识别和机器翻译等任务。
根据$n$的取值,n-gram可以是单词($n=1$)、二元组($n=2$)、三元组($n=3$)等。例如,对于语句“猫吃老鼠”:
当$n=1$时,n-gram为“猫”、“吃”、“老”、“鼠”
当$n=2$时,n-gram为“猫吃”、“吃老”、“老鼠”
当$n=3$时,n-gram为“猫吃老”、“吃老鼠”
在一个n-gram模型中,关于$x_{i}$的预测只依赖于最后的 $𝑛−1$ 个字符$ 𝑥_{𝑖−(𝑛−1):𝑖−1}$ ,而不是整个历史:
$$
𝑝(𝑥𝑖∣𝑥{1:𝑖−1})=𝑝(𝑥𝑖∣𝑥{𝑖−(𝑛−1):𝑖−1}).
$$
如果$n$太小,那么模型将难以捕获长距离的依赖关系,下一个词将无法依赖于靠前的单词。然而,如果$n$太大,则统计上将无法得到概率的好估计。
12.什么是语言模型的“两类错误”及其影响?
假阳性 (False Positives) - 误报 / “做错事” (Errors of Commission):
- 定义: 模型错误地执行或生成了不应该执行或生成的内容。它“做”了某件错事。
- 在 LLM 中的具体表现:
- 幻觉 (Hallucinations): 这是最典型的例子。模型编造事实、信息、引用来源或事件,将其作为真实信息呈现出来。例如,声称某位历史人物发明了互联网,或者引用一篇根本不存在的科学论文。
- 生成有害或不当内容: 模型输出了违反安全准则的内容,如生成仇恨言论、歧视性文本、暴力描述、非法建议等,即使它被训练或指示不要这样做。
- 错误推理或计算: 给出逻辑上不正确或计算错误的答案。
- 传播错误信息: 将不准确或过时的信息作为事实呈现。
- 违反指令(主动型): 明确违背了用户的负面指令(例如,“不要包含任何关于 X 的信息”,但模型还是包含了)。
- 影响:
- 侵蚀信任: 用户无法依赖模型提供准确可靠的信息。
- 传播虚假信息: 可能导致误解、错误的决策甚至社会危害。
- 安全风险: 生成有害内容可能带来法律、道德和社会风险。
- 降低任务性能: 如果模型在解决问题的过程中产生幻觉或错误推理,最终结果将是错误的。
假阴性 (False Negatives) - 漏报 / “该做没做” (Errors of Omission):
- 定义: 模型未能执行或生成应该执行或生成的内容。它“没做”某件该做的事。
- 在 LLM 中的具体表现:
- 过度拒绝/过度审查 (Overly Cautious Refusals): 模型拒绝回答完全无害或合理的问题,因为它错误地将问题归类为敏感、不安全或超出其能力范围。例如,拒绝讨论历史事件的争议方面,或者拒绝提供常见的编程建议,声称“无法提供帮助”。
- 回答不完整或过于简略: 未能提供用户要求的所有信息,或者答案过于表面化,没有深入。
- 缺乏创造性或主动性: 在需要提供建议、替代方案或进行更深入思考的场景下,表现得过于保守或被动。
- 未能遵循指令(被动型): 忽略了用户指令的某些方面,例如未能按要求的格式输出,或未能包含所有要求的信息点。
- 声称“不知道” (当它应该知道时): 对于其训练数据中很可能包含的信息,模型错误地声称缺乏知识(尽管这有时比产生幻觉要好)。
- 影响:
- 降低实用性: 用户无法从模型那里获得需要的帮助或信息,模型变得不那么有用。
- 用户体验差: 过多的拒绝或不完整的回答会让用户感到沮丧。
- 限制探索和学习: 用户可能无法利用模型获取某些领域的知识或进行深入探讨。
- 任务失败: 如果模型未能执行关键步骤或提供必要信息,依赖它的任务可能会失败。
两者关系与权衡 (Trade-off):
这两类错误之间常常存在一种权衡关系,尤其是在模型安全性和有用性方面:
- 为了减少假阳性(例如,防止生成有害内容),开发者可能会设置非常严格的安全过滤器或进行更强的对齐训练。但这往往会增加假阴性(例如,导致模型过度拒绝无害请求)。
- 反之,为了减少假阴性(让模型更乐于助人、回答更广泛的问题),可能会放宽一些限制,但这又可能增加假阳性(例如,产生幻觉或不当内容的风险)。
13.什么是最大匹配算法?
最大匹配算法是一种基于词典的分词技术,其核心任务是将以连续字符形式存在的文本拆解成一系列有意义的词语。该算法的工作原理是从文本中提取尽可能长的词语,并与预先设定的词库进行匹配。若提取的词语在词库中存在,则将其从文本中分离出来;若不存在,则缩短一个字符后再次尝试匹配,如此循环,直至文本中的每个字符都被成功分词。根据匹配的方向不同,最大匹配算法可以分为正向最大匹配法、逆向最大匹配法以及双向最大匹配法。
正向最大匹配算法:像吃蛋糕一样,从蛋糕的一头开始,尽可能大口地吃(匹配最长的词语)。如果这一大口(词语)在词典中能找到,就确认吃下(记录这个词语),然后继续从剩下的蛋糕(文本)开始新的一口。如果这一大口(词语)在词典中找不到,就少吃一点(减少一个字),再尝尝看。重复这个过程,直到整个蛋糕(文本)被吃完(分词完成)。
逆向最大匹配法:与正向最大匹配算法相反,这次是从蛋糕的另一头开始吃(从文本的末尾开始匹配)。同样地,尽可能大口地吃,如果词典中有这个词,就确认吃下,否则少吃一点再尝。直到蛋糕被吃完为止。
双向最大匹配法:这个方法就像是同时从蛋糕的两头开始吃。分别用正向和逆向的方法吃蛋糕,然后比较哪种吃法更好(哪种分词结果更合理)。最后选择一种最好的吃法(分词结果)。
14.如何解决模型规模过大导致的难以扩展问题?
1. 模型架构创新 (更稀疏、更高效的结构):
- 混合专家模型 (Mixture of Experts, MoE):
- 原理: 将模型的前馈网络层 (FFN) 替换为多个“专家”网络和一个“门控”网络。对于每个输入 Token,门控网络只选择性地激活一小部分(如 Top-k)专家进行计算。
- 效果: 可以在保持(甚至降低)单个 Token 处理计算量 (FLOPs) 的同时,大幅增加模型的总参数量。这使得模型可以拥有更丰富的知识容量,但训练和推理的实际计算成本相对可控。
- 挑战: 需要处理负载均衡(确保专家被均匀使用)、增加的内存消耗(所有专家参数需加载)和通信开销。
- 例子: Mixtral 8x7B, Google 的部分模型。
- 其他稀疏化方法: 研究探索在模型的不同部分(如注意力机制、权重矩阵)引入稀疏性,使得只有一部分参数或连接在计算中被激活。
2. 训练效率优化 (用更少资源训练大模型):
- 分布式训练技术:
- 数据并行 (Data Parallelism): 将训练数据分发到多个计算设备(GPU/TPU),每个设备上有一个完整的模型副本,并行处理不同数据批次,然后同步梯度。
- 张量并行 (Tensor Parallelism): 将模型单个层内的计算(如矩阵乘法)切分到多个设备上并行执行。适用于层内计算量巨大的情况。
- 流水线并行 (Pipeline Parallelism): 将模型的不同层分配到不同的设备上,形成一个流水线,数据依次通过各个设备上的层。
- ZeRO (Zero Redundancy Optimizer): 一种优化显存占用的分布式训练技术,通过将模型状态(参数、梯度、优化器状态)分片存储在不同设备上,显著降低单个设备的显存需求。
- 混合精度训练 (Mixed Precision Training): 使用较低精度的数据类型(如 FP16 或 BF16)进行大部分计算和存储,同时保留部分关键计算(如梯度累加)使用 FP32,以减少内存占用和加速计算,同时尽量保持训练稳定性。
- 高效优化器: 使用内存效率更高的优化器算法。
3. 推理效率优化 (让大模型运行更快、更省):
量化 (Quantization):
将模型参数和/或激活值从高精度浮点数(如 FP32, FP16)转换为低精度整数(如 INT8, INT4)或更低精度的浮点数。
- 效果: 大幅减少模型大小(内存占用)和计算量,提高推理速度,降低功耗,使其更容易部署到资源受限的环境(如边缘设备)。
- 挑战: 可能导致一定的精度损失,需要仔细校准或采用量化感知训练 (QAT)。
剪枝 (Pruning):
移除模型中冗余或不重要的参数(权重)或结构(神经元、注意力头)。
- 效果: 减小模型尺寸,降低计算量。可以是移除单个权重(非结构化剪枝)或整个神经元/通道(结构化剪枝)。
- 挑战: 需要有效的剪枝标准和策略,并可能需要重新训练以恢复性能。
知识蒸馏 (Knowledge Distillation):
训练一个更小的“学生”模型来模仿一个大型“教师”模型的行为(输出或内部表示)。
- 效果: 获得一个性能接近大模型但尺寸和计算量小得多的模型。
- 挑战: 需要精心设计蒸馏过程和损失函数。
推理优化引擎与编译器: 使用如 TensorRT (NVIDIA), OpenVINO (Intel), TVM 等工具,对训练好的模型进行图优化、算子融合、内核优化等,以在特定硬件上达到最佳推理性能。
投机解码 (Speculative Decoding): 使用一个小型、快速的模型来预测多个可能的后续 Token,然后用原始大模型一次性验证这些预测,如果预测正确则可以跳过大模型的多次计算,从而加速生成过程。
高效注意力机制: 采用如 FlashAttention 等优化算法,减少注意力计算中的内存读写次数,显著提升速度并降低显存占用。
4. 硬件与基础设施:
- 更强大的硬件: 使用具有更大显存、更高计算能力、更快互联带宽的 GPU/TPU 或专用 AI 加速器。
- 优化的系统软件: 开发更高效的分布式计算框架、通信库和内存管理系统。
5. 替代方法与范式:
- 检索增强生成 (Retrieval-Augmented Generation, RAG): 不将所有知识都存储在模型参数中,而是让模型在需要时从外部知识库(如向量数据库)检索相关信息,然后结合这些信息生成答案。这可以降低对模型自身参数规模的依赖,并更容易更新知识。
- 模型组合/集成: 使用多个较小的、专门化的模型来协同完成复杂任务,而不是依赖一个单一的巨型通用模型。
总结:
解决 LLM 规模过大带来的扩展性问题是一个系统工程,通常需要结合多种策略:
- 在架构层面引入稀疏性 (如 MoE)。
- 在训练阶段利用分布式技术和混合精度。
- 在推理阶段应用量化、剪枝、蒸馏和优化引擎。
- 并辅以硬件升级和新的范式 (如 RAG)。
- 混合专家模型 (Mixture of Experts, MoE):
15.怎么构建大模型领域的数据集?
大语言模型的训练依赖于大量涵盖广泛领域的文本数据,如WebText数据集用于GPT-2的训练,C4语料库用于T5的训练,以及CommonCrawl用于GPT-3的训练。然而,网络数据的品质参差不齐,因此提出了数据文档的概念,其要点如下:
(1)数据集创建背景:(创建动机)了解数据集为何而建; (创建者)明确数据集的作者是谁;(资金来源)知晓数据集创建的资助情况。(2)数据集组成:(实例代表性)了解数据集中的实例代表什么;(信息完整性)检查是否存在缺失信息;(机密性)确认是否包含敏感或机密数据。(3)数据收集过程:(数据获取方式)了解实例数据的收集方法;(参与人员)明确参与数据收集的人员;(报酬情况)掌握数据收集人员的报酬方式;(道德审查)确认是否进行了道德审查。(4)预处理、清理和标记:(完成情况)了解这些工作是否已实施;(软件工具)确认是否有相应的软件支持。(5)数据集使用情况:(应用任务)了解数据集已用于哪些任务;(限制性任务)明确不适合使用该数据集的任务。(6)数据分发:(分发方式)了解数据集的分发途径;(知识产权限制)确认是否存在第三方对数据的知识产权或其他限制。(7)数据集维护:(负责人)明确谁负责维护数据集;(更新情况)了解数据集是否会进行更新。
16.Encoder-decoder模型训练的目标函数是什么?
BART和T5是典型的Encoder-decoder模型,可以实现像BERT一样对输入进行双向编码或者像GPT一样进行自回归编码。BART采用RoBERTa相同的编码器架构和相同的目标函数进行训练。通过掩码,乱序,删除等手段,实现了分类和生成任务。
T5采用denoising objective作为目标函数。该目标函数的功能是:在输入样本中,用一些唯一的特殊符号
在训练过程中,为了提高效率和稳定性,通常会使用一种叫做 Teacher Forcing 的技术。这意味着在解码的第 t
步,无论模型在第 t-1
步实际预测了什么词,都会将真实的目标词 y_{t-1}
(而不是模型自己生成的词)作为输入来预测 y_t
。这使得每个时间步的损失计算可以并行进行,并且避免了早期错误在序列生成过程中累积。目标函数本身(最小化交叉熵)不变,但计算 P(y_t | ...)
时使用的条件 y₁, ..., y_{t-1}
是来自真实数据的。
17.优化算法怎么应用在大模型的训练中?
Adam (Adaptive Moment Estimation): 目前 LLM 训练中最常用的优化器之一。 它结合了 Momentum(估计梯度的一阶矩)和 RMSprop(估计梯度的二阶矩)的思想,为每个参数计算自适应的学习率。它通常收敛快且对超参数选择相对鲁棒。
AdamW (Adam with Decoupled Weight Decay): Adam 的一个改进版本,在 LLM 训练中更为常用。它将 L2 正则化(权重衰减)与梯度更新解耦。原始 Adam 中权重衰减的效果会受到自适应学习率的影响,而 AdamW 直接在参数更新后应用权重衰减,通常能获得更好的泛化性能。
学习率调度 (Learning Rate Scheduling):
学习率通常不是固定不变的。常见的策略包括:
- 预热 (Warmup): 在训练初期使用一个较小的学习率,然后逐渐增加到预设的基础学习率。这有助于在模型参数随机初始化时稳定训练。
- 衰减 (Decay): 在训练后期逐渐降低学习率(如线性衰减、余弦衰减)。这有助于模型更精细地收敛到最优解附近。
- 组合: 最常见的是 Warmup + Decay 的策略。
梯度裁剪 (Gradient Clipping): 为了防止梯度爆炸(梯度值变得非常大导致训练不稳定),通常会对梯度的范数 (Norm) 或值进行裁剪,将其限制在一个最大阈值内。
分布式训练下的优化器: 在大规模分布式训练中(如使用数据并行),每个设备计算一部分数据的梯度,然后需要将梯度聚合(如求平均)。优化器(如 AdamW)的更新步骤通常在所有梯度聚合后执行。像 DeepSpeed ZeRO 这样的技术还会将优化器的状态(如 Adam 的一阶和二阶矩估计)也分布到不同设备上,以节省显存。
18.什么是大模型的混合精度训练?
在处理大规模语言模型训练时,FP16(16位浮点数)格式虽然能够显著减少内存消耗,但它限制了数值的精度,特别是对于非常小的数值,比如小于2^-24的值会直接归零。因此,为了保证训练的精度和稳定性,我们通常采用FP32(32位浮点数)来进行训练。
然而,为了平衡存储和计算效率,实践中会将模型的权重以FP32格式存储,而在计算过程中使用FP16进行前向和反向传播。这种方法虽然可能引入一些数值上的放大误差,但能够有效减少内存使用,同时避免了梯度消失的问题,使得内存需求大约减少了一半。这样的策略在保持模型性能的同时,优化了资源的使用。
19.Probing方法怎么用于下游任务的迁移?
Probing技术是一种用于分析和理解预训练语言模型内部表示的有效手段。它通过在预训练语言模型的最后一层之后附加参数较少的线性或浅层前馈网络,即Probing预测头,有效地分析和理解模型内部表示,以评估模型对特定任务(如输出标签)的处理能力。为了将一个包含 $L$ 个token的序列合理地映射为单个/少量的token的表示,Probing技术采用了以下两种策略:CLS token策略和平均化策略来优化预测头的映射能力。
CLS token策略表示在序列的开始处插入一个特殊的分类token(CLS),这个token的目的是聚合整个序列的信息。在模型的输出中,CLS token对应的表示被用作整个序列的表示。平均化策略假设序列中的每个token都为整个序列的语义贡献了等量的信息。因此,取序列中所有token的表示的平均值,以此来创建一个单一的、全局的序列表示。Probing方法在训练过程中保持预训练模型的权重不变,仅对新增的预测头进行训练,大幅度降低了训练成本。
目标: 检验 BERT 的顶层隐藏状态是否线性可分地编码了每个词的词性信息。
所需组件:
- 预训练模型: BERT (
bert-base-uncased
或类似模型)。 - 探测任务: 词性标注 (POS Tagging)。
- 探测数据集: 一个带有词性标注的语料库,例如 Penn Treebank 的一部分,或者任何包含句子和对应词性标签的数据集 (如
(句子, [词性标签列表])
)。 - 探测器 (Probe): 一个简单的线性分类器。
训练步骤:
加载预训练模型和分词器:
1
2
3
4
5
6
7
8
9
10
11
12PYTHONfrom transformers import BertModel, BertTokenizer
import torch
# 加载预训练的BERT模型和分词器
model_name = 'bert-base-uncased'
tokenizer = BertTokenizer.from_pretrained(model_name)
bert_model = BertModel.from_pretrained(model_name)
# 将BERT模型设置为评估模式,并冻结其参数
bert_model.eval()
for param in bert_model.parameters():
param.requires_grad = False # <--- 关键:冻结BERT参数准备探测数据集:
- 假设我们有这样的数据:
- 句子 1: “The cat sat on the mat.”
- 词性标签 1:
['DET', 'NOUN', 'VERB', 'ADP', 'DET', 'NOUN', '.']
(使用某种标签集,如 Universal Dependencies) - 句子 2: “She eats green apples.”
- 词性标签 2:
['PRON', 'VERB', 'ADJ', 'NOUN', '.']
- 我们需要将这些数据处理成 BERT 的输入格式,并获取对应的隐藏状态。
- 假设我们有这样的数据:
提取表示 (特征工程):
遍历数据集中的每个句子。
分词:
使用 BERT 的
tokenizer
对句子进行分词。注意 BERT 使用的是 Subword Tokenization (如 WordPiece),一个词可能被分成多个子词。
1
2
3PYTHONsentence = "The cat sat on the mat."
inputs = tokenizer(sentence, return_tensors="pt", padding=True, truncation=True)
# inputs 包含 'input_ids', 'token_type_ids', 'attention_mask'获取隐藏状态:
将分词后的输入传入冻结的BERT 模型,获取指定层的隐藏状态。我们这里选择最后一层 (顶层)。
1
2
3
4PYTHONwith torch.no_grad(): # 确保不计算梯度
outputs = bert_model(**inputs)
last_hidden_states = outputs.last_hidden_state # shape: (batch_size, sequence_length, hidden_size)
# 对于 bert-base-uncased, hidden_size = 768对齐标签与表示:
这是棘手的一步。原始的词性标签是针对词的,而 BERT 的隐藏状态是针对子词 (token)的。需要一种策略来对齐:
- 策略1 (常用): 只使用每个原始词对应的第一个子词的隐藏状态作为该词的表示。
- 策略2: 对属于同一个原始词的所有子词的隐藏状态进行平均池化或最大池化。
- 假设我们使用策略 1,我们需要将
last_hidden_states
和原始的词性标签对齐。例如,如果 “sat” 被分为['sat']
,我们就取sat
对应的 768 维向量;如果 “eating” 被分为['eat', '##ing']
,我们只取eat
对应的 768 维向量。
构建探测器的训练数据:
将对齐后的隐藏状态向量(特征)和对应的词性标签(目标)配对。
X_probe
(特征列表):[vector_for_'The', vector_for_'cat', vector_for_'sat', ...]
Y_probe
(标签列表):['DET', 'NOUN', 'VERB', ...]
定义并训练探测器 (Probe):
定义探测器:
一个简单的线性分类器。输入维度是 BERT 的隐藏层大小 (768),输出维度是词性标签的总类别数 (e.g., 17 for Universal Dependencies)。
1
2
3
4
5
6
7
8
9
10
11PYTHONimport torch.nn as nn
hidden_dim = 768
num_pos_tags = 17 # 假设有17种词性标签
# 定义一个简单的线性层作为探测器
probe_classifier = nn.Linear(hidden_dim, num_pos_tags)
# 定义损失函数和优化器 (只优化探测器的参数)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(probe_classifier.parameters(), lr=1e-3) # <--- 关键:只传入探测器的参数训练循环:
使用准备好的
(X_probe, Y_probe)
数据对探测器进行标准的监督学习训练。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17PYTHON# 假设 X_probe_tensor 和 Y_probe_tensor 是处理好的 PyTorch 张量
# (需要将 Y_probe 转换为数字索引)
num_epochs = 5
batch_size = 32
for epoch in range(num_epochs):
# (这里省略了数据加载和批处理的细节)
for batch_vectors, batch_labels in dataloader: # 假设有dataloader
optimizer.zero_grad()
# 通过探测器进行预测
outputs = probe_classifier(batch_vectors)
# 计算损失
loss = criterion(outputs, batch_labels)
# 反向传播 (只会计算和更新探测器的梯度)
loss.backward()
optimizer.step()
print(f"Epoch {epoch+1}, Loss: {loss.item()}")
评估探测器:
在一个独立的测试集上重复步骤 3 (提取表示) 和步骤 4 (使用训练好的探测器进行预测)。
计算探测器在测试集上的性能指标,如准确率 (Accuracy)。
1
2
3
4
5
6
7
8
9
10
11
12PYTHON# 假设 X_test_tensor, Y_test_tensor 是测试数据
probe_classifier.eval()
correct = 0
total = 0
with torch.no_grad():
outputs = probe_classifier(X_test_tensor)
_, predicted = torch.max(outputs.data, 1)
total += Y_test_tensor.size(0)
correct += (predicted == Y_test_tensor).sum().item()
accuracy = 100 * correct / total
print(f'Accuracy of the POS probe on the test set: {accuracy:.2f}%')
解释结果:
- 如果准确率很高 (e.g., > 90% 或接近专门训练的 POS Tagger 的性能): 这表明 BERT 的顶层隐藏状态中已经包含了丰富的、线性可分的词性信息。即使只用一个简单的线性分类器也能很好地提取这些信息。
- 如果准确率不高: 可能意味着词性信息没有被线性编码得很好,或者编码方式更复杂,或者该层主要编码了其他类型的信息。
20.Prompt tuning方法怎么用于下游任务的迁移?
Prompt tuning方法专注于优化输入提示,而不涉及修改语言模型的内部参数。该方法通过在原始输入前添 $k$ 个可学习的连续tokens,使得新的输入长度变为 $L= L + K$ 。这些额外的tokens的嵌入是通过在带标签的任务数据上进行训练来学习的。在整个微调过程中,预训练的语言模型保持冻结状态,即模型的主体参数不会发生变化。随着预训练模型规模的增大,prompt tuning的性能表现越来越出色,有时甚至能够与全面微调的效果相匹配。其中,该方法的初始化策略包括: 随机词汇嵌入(选择随机的词嵌入),类标签词嵌入(选择和分类标签相关的词嵌入)和随机初始化(随机分配值)。
P-Tuning v2是提示调整(Prompt tuning)方法的一个改进版本,不仅仅是在输入层添加可学习的提示(prompt),而是在模型的多个层级上进行了优化。
- 可学习 Prompt / Soft Prompt / Continuous Prompt (概念):
- 核心思想: 与传统的、需要人工设计和调整的离散文本 Prompt(”Hard Prompt”)相对,可学习 Prompt 将 Prompt 视为模型参数的一部分,可以通过训练数据进行优化学习。
- 形式: 它不是一串文本单词,而是一系列连续的向量 (embeddings)。这些向量的维度通常与模型内部的词嵌入维度相同。
- 作用: 这些学习到的向量被添加到模型的输入层(有时是模型的更深层),作为一种“虚拟的指令”或“任务上下文”,引导冻结参数的预训练模型(如 GPT, BERT, T5 等)在特定下游任务上表现良好。
- 目标: 实现参数高效微调 (Parameter-Efficient Fine-Tuning, PEFT)。即,在使模型适应新任务时,只更新极少数参数(这些可学习的 Prompt 向量),而保持庞大的预训练模型主体不变,从而大大降低训练和存储成本。
- 涵盖范围: 这个概念涵盖了多种具体技术,只要其核心是学习连续向量作为 Prompt,都可以称为使用了可学习 Prompt。
- Prompt Tuning (具体技术):
- 定义: 这是由 Lester 等人在论文 “The Power of Scale for Parameter-Efficient Prompt Tuning” (2021) 中提出的一种特定的 PEFT 方法。
- 具体做法:
- 保持整个预训练语言模型完全冻结。
- 在输入序列的词嵌入表示前面,添加一小组(例如 10-100 个)可训练的 Prompt 嵌入向量。
- 在针对下游任务进行微调时,只更新这些新添加的 Prompt 嵌入向量的参数,模型的其他所有参数都保持不变。
- 这些学习到的 Prompt 向量会通过模型的自注意力机制影响后续真实输入词的表示,从而引导模型产生任务相关的输出。
- 特点:
- 极其参数高效: 需要训练的参数量非常小(可能只占模型总参数的 0.01% 或更少)。
- 实现简单: 只在输入层添加和学习参数。
- 性能: 在模型规模足够大时,其性能可以媲美完全微调 (Full Fine-tuning)。
- 与其他技术的区别: 它与 Prefix Tuning(在每一层都添加可学习的前缀)等其他可学习 Prompt 技术略有不同,Prompt Tuning 只在输入层添加。
21.PrefixDecoder/CausalDecoder/Encoder-Decoder的区别有哪些?
1. Causal Decoder (因果解码器 / 标准解码器 / Decoder-Only)
- 核心特点: 在生成(解码)序列中的第
t
个 token 时,只能 关注 (attend to) 输入序列(如果有的话,通常是 prompt)以及已经生成的从第 1 到t-1
个 token。它不能看到未来的 token (t+1
及之后)。 - 实现方式: 通过在自注意力 (Self-Attention) 机制中使用因果掩码 (Causal Mask) 或下三角掩码 (Lower Triangular Mask) 来实现。这个掩码会阻止注意力机制“看到”当前位置之后的 token。
- 信息流: 单向的 (Unidirectional)。信息只能从过去流向未来。
- 架构: 通常只有一个主要的 Transformer 模块(堆叠而成),没有独立的编码器部分。输入(如 prompt)和输出在同一个序列空间中处理。
- 典型用途: 语言建模、文本生成、对话系统、代码生成等。模型被训练来预测序列中的下一个词。
- 例子: GPT 系列 (GPT-3, GPT-4), Llama 系列, Mistral, Mixtral, Claude, PaLM (部分版本) 等绝大多数当前流行的生成式大模型。它们通常被称为 “Decoder-Only” 架构。
Decoder-Only 完整架构概览
想象一下,Decoder-Only 模型就像一个处理序列信息的“工厂流水线”,它由以下主要部分组成:
- 输入处理 (Input Processing):
- 分词器 (Tokenizer): 将输入的文本(比如你的 Prompt)分解成模型能理解的基本单元(Tokens)。
- 词嵌入层 (Token Embedding Layer): 将每个 Token 映射到一个高维的向量表示(Embedding)。这个向量捕捉了 Token 的基本语义。
- 位置编码层 (Positional Encoding Layer): 为每个 Token 的嵌入向量添加一个表示其在序列中位置信息的向量。这很关键,因为 Transformer 本身不处理序列顺序,位置编码告诉模型哪个词在前,哪个词在后。
- Transformer 解码器模块堆栈 (Stack of Transformer Decoder Blocks):
- 这是模型的核心。通常包含很多层(几十到上百层)相同结构的解码器模块堆叠在一起。
- 每一层解码器模块 (Single Decoder Block) 内部包含:
- 带掩码的多头自注意力 (Masked Multi-Head Self-Attention):
- 核心: 这是 Decoder-Only 的灵魂!它允许序列中的每个 Token 关注 (Attend to) 它自己以及它前面的所有 Token,来计算自己的更新表示。
- 掩码 (Masked): 使用因果掩码 (Causal Mask),强制性地阻止任何 Token 关注它后面的 Token。这就是为什么它能做“预测下一个词”的任务,因为它在计算当前词的表示时,“看不到”未来。
- 多头 (Multi-Head): 将注意力计算分成多个“头”并行进行,每个头学习关注输入的不同方面(不同的表示子空间),然后将结果合并,以获得更丰富的表示。
- 残差连接与层归一化 (Add & Norm):
- 将自注意力层的输入直接加到其输出上(残差连接),有助于缓解梯度消失问题,让模型更容易训练。
- 然后进行层归一化,稳定训练过程。
- 前馈神经网络 (Feed-Forward Network, FFN):
- 一个简单的两层全连接网络(通常带有 ReLU 或 GeLU 等激活函数),对自注意力层的输出进行进一步的非线性变换,增强模型的表示能力。
- 残差连接与层归一化 (Add & Norm):
- 同样,在前馈网络的输出上应用残差连接和层归一化。
- 带掩码的多头自注意力 (Masked Multi-Head Self-Attention):
- 信息流动: 第
N
层解码器模块的输出,会作为第N+1
层解码器模块的输入。
- 输出层 (Output Layer):
- 最终层归一化 (Optional but common): 在最后一个解码器块之后可能还有一个层归一化。
- 线性层 (Linear Layer / Language Model Head): 将最后一个解码器模块输出的高维向量(例如 768 或 4096 维)投影到词汇表大小的维度(例如 50257 维)。现在,每个位置输出的向量,其每个元素对应词汇表中一个词的分数 (logit)。
- Softmax 层: 将这些分数转换成概率分布。在位置
i
输出的概率分布,表示模型预测下一个词 (位置 i+1) 是词汇表中每个词的可能性。
简化实例:预测 “The cat sat ?” 中的下一个词
假设我们有一个极度简化的 Decoder-Only 模型(只有一个解码器层,嵌入维度很小,词汇表也小),并且它已经被训练过。
输入: “The cat sat”
输入处理:
- 分词:
["The", "cat", "sat"]
- 嵌入 + 位置编码:
vec("The")
=emb("The") + pos(0)
vec("cat")
=emb("cat") + pos(1)
vec("sat")
=emb("sat") + pos(2)
- 得到输入序列向量:
[vec("The"), vec("cat"), vec("sat")]
- 分词:
Transformer 解码器模块:
带掩码的自注意力:
- 计算
vec("The")
的新表示:只能关注vec("The")
自己。 - 计算
vec("cat")
的新表示:可以关注vec("The")
和vec("cat")
。 - 计算
vec("sat")
的新表示:可以关注vec("The")
,vec("cat")
, 和vec("sat")
。 注意:它看不到任何未来的词! - 输出经过注意力的表示:
[attn_vec("The"), attn_vec("cat"), attn_vec("sat")]
- 计算
Add & Norm:
[norm(vec("The") + attn_vec("The")), ...]
FFN:
对每个位置的向量应用前馈网络。
- 输出:
[ffn_vec("The"), ffn_vec("cat"), ffn_vec("sat")]
- 输出:
Add & Norm:
[norm(norm_attn_vec + ffn_vec("The")), ...]
得到解码器模块的最终输出:
[final_vec("The"), final_vec("cat"), final_vec("sat")]
输出层:
- 我们关心的是基于 “The cat sat” 预测下一个词,所以我们主要看最后一个位置
sat
的输出final_vec("sat")
。 - 线性层:
logits = Linear(final_vec("sat"))
。logits
是一个长度等于词汇表大小的向量,每个元素是对应词的分数。 - Softmax:
probabilities = Softmax(logits)
。得到一个概率分布。 - 预测: 假设词汇表中有 “on”, “slept”, “jumped”, “mat” 等词。如果模型训练得好,
probabilities
中对应 “on” 的概率值应该是最高的。
- 我们关心的是基于 “The cat sat” 预测下一个词,所以我们主要看最后一个位置
训练时如何工作?
在训练时,模型会看到完整的句子,比如 “The cat sat on the mat.”
- 当模型处理到 “sat” 这个位置时,它的目标是预测出 “on”。
- 模型会计算出
probabilities
分布。 - 计算损失:比较这个
probabilities
分布和真实的下一个词 “on”(通常表示为一个 one-hot 向量,”on” 的位置是 1,其他是 0)之间的交叉熵损失。 - 反向传播:根据这个损失,调整模型的所有参数(嵌入、注意力权重、FFN 权重等),使得下次再看到 “The cat sat” 时,预测出 “on” 的概率更高。
- 这个过程对序列中的每一个位置都会进行(例如,看到 “The” 预测 “cat”,看到 “The cat” 预测 “sat” 等),所有位置的损失会累加起来用于更新。
推理(生成)时如何工作?
- 输入 Prompt: “The cat sat”
- 模型预测下一个词: “on” (概率最高)
- 将预测的词添加到输入序列: “The cat sat on”
- 将新的序列 “The cat sat on” 输入模型,预测下一个词: “the”
- 添加到序列: “The cat sat on the”
- 继续这个过程,直到模型预测出特殊的结束符
<end>
或者达到预设的最大长度。
2. Encoder-Decoder (编码器-解码器)
核心特点:
包含两个不同的模块:
- 编码器 (Encoder): 负责处理整个输入序列 (Source Sequence),并生成一组丰富的上下文表示 (Contextual Representations)。编码器内部通常使用双向注意力 (Bi-directional Attention),即每个 token 可以关注输入序列中的所有其他 token。
- 解码器 (Decoder): 负责根据编码器的输出表示和已经生成的部分输出序列 (Target Sequence) 来自回归地 (autoregressively) 生成下一个 token。
实现方式:
- 编码器使用标准的自注意力(无掩码或只有 padding mask)。
- 解码器通常包含两种注意力机制:
- 带因果掩码的自注意力 (Masked Self-Attention): 用于处理已生成的部分输出序列,确保只能看到过去的输出 token(与 Causal Decoder 类似)。
- 交叉注意力 (Cross-Attention): 用于让解码器的每个位置能够关注编码器的所有输出表示,从而将源序列的信息融入到目标序列的生成中。
信息流: 编码器是双向的,解码器在处理自身输出时是单向的,但可以通过交叉注意力访问完整的源序列信息。
架构: 明确分为 Encoder 和 Decoder 两个堆叠的 Transformer 模块。
典型用途: 机器翻译、文本摘要、问答(其中问题是输入,答案是输出)、代码翻译等序列到序列 (Sequence-to-Sequence, Seq2Seq) 任务。
例子: 原始 Transformer 模型, T5, BART, Google 的部分内部模型 (如 LaMDA 可能有类似结构)。
3. Prefix Decoder (前缀解码器 / Non-Causal Decoder / PrefixLM)
核心特点:
介于 Causal Decoder 和 Encoder-Decoder 之间的一种混合形式。它将输入序列分为两部分:
前缀 (Prefix)和后缀 (Suffix)。
- 模型可以对前缀部分进行双向注意力 (Bi-directional Attention),就像编码器一样,允许前缀中的每个 token 相互关注。
- 在生成后缀部分时,模型采用自回归 (Autoregressive) 的方式,并且后缀中的每个 token 可以关注所有的前缀 token 以及已经生成的后缀 token,但不能关注未来的后缀 token(使用因果掩码)。
实现方式: 通过一种特殊的组合掩码 (Combined Mask) 来实现。对于前缀部分的 token,允许互相看到;对于后缀部分的 token
t
,允许看到所有前缀 token 和1
到t-1
的后缀 token。信息流: 前缀部分是双向的,后缀生成部分是单向的(但可以访问完整前缀)。
架构: 通常也是一个单一的 Transformer 模块,但通过不同的注意力掩码模式来模拟 Encoder-Decoder 的部分行为。
典型用途: 可以统一处理 NLU(自然语言理解,类似 Encoder)和 NLG(自然语言生成,类似 Decoder)任务。常用于文本填充 (Infilling)、条件生成任务,或者作为一种统一的预训练框架。
例子: GLM (General Language Model) 系列 (如 ChatGLM), U-PaLM 可能采用了类似 PrefixLM 的思想。
22.当前优化模型最主要技术手段有哪些?
以下是对当前优化大语言模型的主要技术手段从不同层面进行的分析:
一、算法层面
蒸馏:
- 原理:知识蒸馏是一种模型压缩技术,通过将一个复杂的、性能较好的教师模型的知识转移到一个较小的学生模型中。在大语言模型中,通常使用大型的预训练模型作为教师模型,然后训练一个较小的模型来模仿教师模型的输出。
- 优势:可以显著减小模型的大小和计算量,同时在一定程度上保持较高的性能。这使得大语言模型能够在资源有限的设备上运行,或者提高推理速度。例如,在移动设备上部署语言模型时,蒸馏后的小模型可以更快地响应用户请求,同时减少内存占用。
- 应用场景:适用于对模型大小和性能有严格要求的场景,如移动端应用、嵌入式设备等。
量化:
- 原理:量化是将模型的权重和激活值从高精度的数值表示(如浮点数)转换为低精度的数值表示(如整数)。通过减少数值的精度,可以降低模型的存储需求和计算量。
- 优势:可以大大提高模型的推理速度,减少内存占用,并且在一些情况下对模型性能的影响较小。例如,将模型从 32 位浮点数量化到 8 位整数,可以显著减少模型的大小和计算时间,同时在一些任务上可能只损失少量的准确性。
- 应用场景:适用于需要快速推理和低内存占用的场景,如实时应用、大规模部署等。
二、软件层面
计算图优化:
- 原理:计算图是深度学习模型在计算过程中的一种抽象表示。通过对计算图进行优化,可以减少不必要的计算、提高内存使用效率和并行性。例如,可以合并一些连续的操作,减少中间结果的存储;或者对计算图进行重排,以更好地利用硬件的并行计算能力。
- 优势:可以提高模型的训练和推理速度,减少资源消耗。优化后的计算图可以更高效地在各种硬件平台上运行,充分发挥硬件的性能。
- 应用场景:适用于各种深度学习任务,尤其是在大规模数据和复杂模型的情况下,可以显著提高训练和推理效率。
模型编译:
- 原理:模型编译是将深度学习模型转换为特定硬件平台上的高效执行代码。通过使用专门的编译器,可以针对不同的硬件架构进行优化,生成高效的底层代码。例如,针对 GPU 进行编译可以利用 GPU 的并行计算能力,提高模型的执行速度。
- 优势:可以充分发挥硬件的性能,提高模型的推理速度和效率。编译后的模型通常具有更好的内存管理和并行性,能够更好地适应不同的硬件环境。
- 应用场景:适用于需要在特定硬件平台上进行高效部署的场景,如数据中心、云端服务等。
三、硬件层面
- FP8(NVIDIA H 系列 GPU 开始支持 FP8,兼有 fp16 的稳定性和 int8 的速度):
- 原理:FP8 是一种低精度浮点格式,介于 FP16 和 INT8 之间。NVIDIA H 系列 GPU 对 FP8 的支持使得在进行大语言模型的计算时,可以利用 FP8 的低精度和高速度,同时保持一定的数值稳定性。
- 优势:相比 FP16,FP8 可以提供更高的计算速度和更低的内存占用;而与 INT8 相比,FP8 具有更好的数值稳定性,减少了精度损失的风险。这使得在大语言模型的训练和推理中,可以在不显著降低性能的情况下提高计算效率。
- 应用场景:适用于需要高性能计算和大规模数据处理的大语言模型任务,尤其是在使用 NVIDIA H 系列 GPU 的环境中。
综上所述,从算法、软件和硬件三个层面都有多种技术手段可以优化大语言模型。这些技术手段可以单独使用,也可以结合起来,以实现更好的性能和效率。在实际应用中,需要根据具体的任务需求、硬件资源和性能要求来选择合适的优化方法。
23.大模型推理加速框架有哪一些?都有什么特点?
总结:框架对比与选择建议
框架 | 优势 | 劣势 | 适用场景 |
---|---|---|---|
TensorRT | 极致性能、量化支持 | 仅支持 NVIDIA GPU | 云端高吞吐服务 |
vLLM | 内存高效、长文本优化 | 仅支持解码器模型 | LLM 服务化部署 |
DeepSpeed | 超大模型支持、多模态扩展 | 配置复杂 | 分布式超大规模模型 |
Triton | 多模型并发、服务化友好 | 依赖 NVIDIA GPU | 多任务混合服务 |
ONNX Runtime | 跨平台兼容、轻量级 | LLM 优化不足 | 端侧部署 |
Llama.cpp | 纯 CPU 推理、4-bit 量化 | 无服务化功能 | 个人开发者、离线场景 |
FlexGen | 内存压缩、超长文本支持 | 延迟高 | 显存受限设备 |
光子计算 | 超低延迟、能效比高 | 硬件成本高 | 未来数据中心 |
选择建议
- 云端高吞吐服务:优先选择 TensorRT 或 vLLM。
- 端侧部署:使用 ONNX Runtime 或 Llama.cpp。
- 超大规模模型:采用 DeepSpeed-Inference。
- 多任务混合服务:选择 Triton Inference Server。
- 未来技术探索:关注 光子计算 和 动态批处理优化。
24.大语言模型命名中7B、13B、540B是什么意思?有哪些常见参数?
1. 参数量(Model Size)
符号 | 含义 | 示例 | 说明 |
---|---|---|---|
B | Billion(十亿参数) | 7B、32B、70B | 表示模型参数量,如 7B = 70 亿参数。 |
M | Million(百万参数) | 135M、500M | 较小模型(如 BERT-base 为 110M)。 |
K | Thousand(千参数) | 10K、100K | 极小模型(如轻量级嵌入模型)。 |
MoE | Mixture of Experts(混合专家) | Mixtral 8x7B、DeepSeek-MoE | 参数量后缀为 xN 表示专家数量(如 8x7B = 8 个专家,每个 7B 参数)。 |
2. 架构类型(Architecture)
符号 | 含义 | 示例 | 说明 |
---|---|---|---|
Dense | 密集模型 | Llama 3-8B、GPT-3.5 | 传统 Transformer 架构,所有参数参与计算。 |
MoE | 混合专家(Mixture of Experts) | Mixtral 8x7B、Qwen-MoE | 参数量可扩展(如 145B),但实际计算量与小模型相当。 |
Mamba | 状态空间模型(SSM) | Mamba、Hydra | 替代注意力机制,支持超长上下文(如 1M token)。 |
SSM | State Space Model | Mamba-3B | 与 Mamba 同义,强调序列建模能力。 |
3. 模型深度(Depth & Width)
符号 | 含义 | 示例 | 说明 |
---|---|---|---|
L | Layers(层数) | Llama 3-8B-L24、BERT-L12 | 层数越多,模型深度越高(如 Llama 3-8B 为 32 层)。 |
D | Dimension(隐藏层维度) | D5120(如 GPT-4 的 5120) | 隐藏层维度越大,模型表达能力越强。 |
H | Heads(注意力头数) | H128(如 Llama 3-70B 的 8 个 GQA 头) | 头数越多,模型对多模态或长文本的处理能力越强。 |
AH | Attention Heads(注意力头数) | AH16(如 T5-11B 的 16 头) | 与 H 同义,强调注意力机制的并行性。 |
4. 训练数据(Training Data)
符号 | 含义 | 示例 | 说明 |
---|---|---|---|
T | TB(训练数据量) | T100T(如训练数据 100TB) | 数据量越大,模型知识覆盖越广(如 Llama 3 训练数据达 15T tokens)。 |
S | Samples(训练样本数) | S10B(100 亿样本) | 样本数越多,模型泛化能力越强。 |
V | Vocabulary(词表大小) | V32K(如 BERT 的 30K 词表) | 词表越大,模型对稀有词的处理能力越强。 |
5. 版本与优化目标
符号 | 含义 | 示例 | 说明 |
---|---|---|---|
v1/v2 | 版本号 | Llama v1、Llama v2 | 版本越高,性能或训练数据越优。 |
Pro | 专业版 | Claude Pro、Gemini Pro | 面向付费用户的高性能版本。 |
Lite | 轻量版 | Phi-2-Lite、TinyLLM | 参数量小,适合端侧部署或低资源场景。 |
Instruct/Chat | 指令微调版本 | Llama 3-8B-Instruct、ChatGPT | 经过指令微调(SFT/RLHF),适合对话或任务执行。 |
6. 量化与压缩
符号 | 含义 | 示例 | 说明 |
---|---|---|---|
Q | Quantized(量化) | Q4_K_M(4-bit 量化) | 量化后模型体积和推理速度优化(如 Llama.cpp 支持 4-bit 量化)。 |
4b/8b | 量化位数 | 4b(4-bit)、8b(8-bit) | 位数越低,模型体积越小,但可能损失精度。 |
Pruned | 剪枝模型 | BERT-PBTD、DistilGPT2 | 通过剪枝减少参数量,适合资源受限场景。 |
7. 多模态扩展
符号 | 含义 | 示例 | 说明 |
---|---|---|---|
M | Multimodal(多模态) | Gemini 1.5-M、Qwen-VL | 支持文本、图像、音频、视频等多模态输入。 |
V | Vision(视觉) | CLIP-ViT、Flamingo | 专为图文任务设计(如视觉问答、图文生成)。 |
A | Audio(音频) | Whisper、AudioPaLM | 支持语音识别、语音生成任务。 |
8. 时间与迭代
符号 | 含义 | 示例 | 说明 |
---|---|---|---|
Year | 发布年份 | 2023、2024 | 如 Llama 3 发布于 2024 年。 |
Date | 发布日期 | 2024-03(如 Llama 3 的 3 月) | 精确到月份的版本标识。 |
典型模型命名解析
模型名称 | 参数解析 |
---|---|
Llama 3-8B | 8B = 80 亿参数,Dense 架构,Llama 3 系列。 |
Mixtral 8x7B | 8x7B = 8 个专家,每个 7B 参数(总参数 56B),MoE 架构。 |
Qwen-Max | 企业级版本(类似 Pro),参数量未公开,适合复杂任务。 |
Phi-2-3B | 3B = 30 亿参数,微软轻量级模型,适合端侧部署。 |
Gemini 1.5-Pro-128K | 1.5 = 版本号,Pro = 专业版,128K = 上下文长度 128k token。 |
Mamba-3B-Dense | 3B = 30 亿参数,Dense 架构(非 MoE),状态空间模型(SSM)。 |
注意事项
25.为什么现在的大模型结构大部分是Decoder only结构?
现在的大语言模型结构很多采用Decoder only结构,主要有以下原因:
一、语言生成任务适应性强
专注于生成任务:
- Decoder only结构天然地适合语言生成任务。在这类任务中,模型的目标是根据给定的提示或上下文生成连贯的文本。例如,在文本生成、对话系统、故事续写等场景中,模型需要不断地生成新的单词或句子来回应输入。Decoder only结构能够直接从左到右依次生成输出,与人类的语言生成过程相似,更容易学习语言的模式和规律。
- 相比之下,Encoder-Decoder结构虽然也能用于生成任务,但在一些情况下可能会因为编码器和解码器之间的交互不够直接而影响生成效果。例如,在机器翻译任务中,编码器需要将源语言句子编码成一个中间表示,然后解码器再根据这个中间表示生成目标语言句子。这种两步走的方式在处理一些复杂的语言生成任务时可能会引入额外的复杂性。
自回归特性:
- Decoder only结构通常采用自回归的方式进行训练和生成。这意味着在生成每个单词时,模型会基于之前生成的单词进行预测。这种方式能够充分利用语言的序列性和上下文信息,使得生成的文本更加连贯和自然。例如,在生成一个句子时,模型可以根据前面已经生成的单词来预测下一个最有可能出现的单词,从而逐步构建出完整的句子。
- 自回归特性也使得Decoder only结构在处理长序列数据时具有一定的优势。由于模型是依次生成每个单词,因此可以更好地处理长文本中的长期依赖关系,避免信息的丢失。而在一些其他结构中,可能会因为处理长序列数据的困难而导致性能下降。
二、训练效率高
并行计算:
- 在训练过程中,Decoder only结构可以利用并行计算来提高训练效率。由于模型是从左到右依次生成输出,因此可以同时计算多个位置的输出,而不需要像Encoder-Decoder结构那样等待编码器的结果。例如,在使用大规模数据集进行训练时,可以将数据分成多个批次,每个批次中的句子可以同时进行计算,从而大大加快训练速度。
- 此外,一些先进的训练技术,如混合精度训练、分布式训练等,也可以更容易地应用于Decoder only结构,进一步提高训练效率。
数据效率:
- Decoder only结构通常在数据效率方面表现出色。由于模型专注于生成任务,因此可以从大规模的无标注文本数据中学习语言知识。这些无标注数据通常比较容易获取,而且数量巨大,可以为模型提供丰富的语言模式和上下文信息。相比之下,Encoder-Decoder结构可能需要更多的有标注数据来进行训练,而有标注数据的获取通常比较困难和昂贵。
- 另外,Decoder only结构还可以通过自监督学习的方式进行训练,例如使用语言建模任务(预测下一个单词)作为训练目标。这种自监督学习方式可以充分利用大量的无标注数据,提高模型的泛化能力和性能。
三、模型灵活性和可扩展性高
易于调整和优化:
- Decoder only结构相对简单,更容易进行调整和优化。开发者可以根据具体的任务需求和性能要求,对模型的结构、参数、训练策略等进行灵活的调整。例如,可以增加或减少模型的层数、调整注意力机制的参数、使用不同的激活函数等,以提高模型的性能和效率。
- 此外,由于Decoder only结构的生成过程是直接从左到右依次进行的,因此可以更容易地进行在线学习和增量学习。这意味着可以在模型已经训练好的基础上,继续使用新的数据进行训练和优化,而不需要重新训练整个模型。
可扩展性强:
- Decoder only结构可以很容易地扩展到更大的规模。随着计算资源的不断增加和技术的不断进步,现在已经可以训练出具有数十亿甚至数百亿参数的大语言模型。这些大规模的模型通常采用Decoder only结构,因为它们可以更好地利用大规模数据和计算资源,提高模型的性能和泛化能力。
- 同时,Decoder only结构也可以通过集成多个模型或使用模型并行化等技术来进一步提高性能和可扩展性。例如,可以将多个不同的Decoder only模型进行集成,或者将一个大模型分成多个小模型进行并行计算,以满足不同的应用需求。
26.目前各LLMs都使用哪种激活函数?
目前不同的大语言模型(LLMs)可能会使用以下几种常见的激活函数:
一、ReLU(Rectified Linear Unit,修正线性单元)
特点:
- 计算简单高效,只需要进行简单的比较和乘法运算。
- 对于正输入,输出等于输入,对于负输入,输出为零,这使得它具有一定的稀疏性激活特性,有助于缓解过拟合问题。
- 在训练过程中能够加快收敛速度,因为它不会像一些传统激活函数那样在负区间产生饱和现象。
应用场景:
- 在许多大语言模型的早期版本中广泛使用。例如在一些基础的神经网络层中,ReLU 可以有效地传递信息,促进模型的学习。
- 对于大规模的语言模型,由于其计算效率高,能够在大规模数据和复杂模型结构下快速处理信息。
二、GELU(Gaussian Error Linear Unit,高斯误差线性单元)
特点:
- 是一种平滑的激活函数,它的输出在输入值较小时会有一定的平滑过渡,而不是像 ReLU 那样突然截断。
- 基于输入的高斯分布进行计算,具有一定的随机性和不确定性,这有助于模型更好地捕捉数据的多样性和复杂性。
- 在训练过程中表现出较好的稳定性和收敛性,能够提高模型的性能和泛化能力。
应用场景:
- 在一些先进的大语言模型中得到广泛应用。例如在 Transformer 架构的语言模型中,GELU 可以为注意力机制和前馈神经网络层提供更平滑的激活效果,从而提高模型对语言的理解和生成能力。
- 对于需要处理复杂语义和上下文信息的任务,GELU 能够更好地适应不同的输入情况,生成更准确和自然的语言输出。
三、Swish
特点:
- 具有非线性和光滑的特性,能够在不同的输入范围内提供连续的激活输出。
- 类似于 ReLU 和 Sigmoid 函数的组合,在正区间具有类似于 ReLU 的线性增长特性,在负区间又有一定的平滑过渡,避免了 ReLU 的硬截断问题。
- 在训练过程中能够自适应地调整激活强度,根据输入的大小动态地调整输出的幅度,有助于提高模型的表达能力。
应用场景:
- 在一些追求高性能的大语言模型中可能会被使用。例如在对语言的细微差别和复杂关系要求较高的任务中,Swish 可以为模型提供更丰富的非线性表达能力,从而提高模型的准确性和灵活性。
- 对于需要快速适应不同数据分布和任务要求的模型,Swish 的自适应特性可以使其在不同的场景下都能发挥较好的作用。
四、SwiGLU
SwiGLU(SwiGLU activation function)是一种在大语言模型中可能会被使用的激活函数。
特点:
(1)结合了 Swish 和 Gated Linear Unit(GLU)的特性:- Swish 函数具有平滑的非线性特性,能够在不同的输入范围内提供连续的激活输出,有助于模型更好地捕捉复杂的非线性关系。
- GLU 通过门控机制对输入进行筛选和控制,能够增强模型的表现力和对重要信息的关注。SwiGLU 将两者结合起来,综合了它们的优点。
(2)自适应和动态性: - 可以根据输入的变化自适应地调整激活强度和门控状态,动态地适应不同的任务和数据分布。这使得模型能够更加灵活地处理各种输入情况,提高性能和泛化能力。
(3)高效计算: - 通常在计算上相对高效,不会引入过多的计算复杂度。这对于大规模的语言模型来说非常重要,可以在保持高性能的同时,减少训练和推理的时间成本。
应用场景:
(1)大语言模型中的中间层和输出层:
- 在语言模型的神经网络结构中,可以应用于中间隐藏层,帮助模型更好地学习语言的特征和模式。同时,在输出层也可以使用 SwiGLU 来生成更准确和自然的语言输出。
(2)复杂语言任务: - 对于需要处理复杂语义、上下文理解和生成高质量文本的任务,如文本生成、机器翻译、问答系统等,SwiGLU 激活函数可以提供更强大的非线性表达能力和适应性,提高模型的性能。
(3)大规模训练和微调: - 在大规模数据上进行训练时,SwiGLU 可以帮助模型更好地收敛和泛化。同时,在对预训练模型进行微调时,也可以根据具体任务的需求调整 SwiGLU 的参数,以获得更好的效果。
27.进行SFT操作的时候,基座模型选用Chat还是Base?
在进行监督微调(SFT)时,选择基座模型是一个重要的决策。一般来说,应该根据你的具体应用需求和数据类型来选择“Chat”还是“Base”模型:
选择 Base 模型的情况:
- 如果你的 SFT 数据是通用的、广泛的,且不需要任何对话特定的能力,例如一些开放领域的问答或内容生成任务,那么使用 “Base” 模型通常是更合适的。
- Base 模型未经过特定的对话式微调,因此适合用作一个通用的预训练模型,可以更容易地迁移到特定领域上,而不需要担心已有的对话式结构影响。
选择 Chat 模型的情况:
- 如果你的 SFT 数据涉及对话任务,或者需要支持交互式的用户体验,那么 Chat 模型可能是更好的选择。
- Chat 模型通常已经接受过对话式的预训练,具备一定的上下文记忆能力、对话结构,以及一些通用的礼貌和格式化规则。如果你的SFT任务是为了进一步优化这些对话能力或者是定制化一些特定的对话风格,基于Chat模型会让你少做很多低层的微调工作。
简而言之:
- Base 模型适合领域特定的数据或内容生成任务,适合构建从头开始的应用。
- Chat 模型适合对话、交互式任务或以对话为核心的应用。
希望这能帮助你更好地选择适合的基座模型!
监督微调(SFT)是通过在标注数据上进一步训练预训练模型(如 LLM),使其适应特定任务(如对话、翻译、摘要)的关键步骤。以下是完整的操作流程、工具推荐和注意事项:
1. 准备阶段
(1) 数据准备
数据格式
:通常为
1
input-output
对(如问答、指令-响应)。
1
2
3
4
5JSON{
"instruction": "将以下英文翻译成中文:Hello, how are you?",
"input": "",
"output": "你好,最近怎么样?"
}数据来源
:
- 公开数据集:如 Alpaca、Dolly、FLAN、ShareGPT。
- 自定义数据:通过人工标注或规则生成(如指令模板 + 人工修正)。
数据清洗
:
- 去除重复、低质量样本。
- 统一格式(如 JSON、CSV)。
- 分词检查(避免特殊符号导致训练崩溃)。
(2) 模型选择
基础模型:选择与任务匹配的预训练模型(如 Llama 3、Qwen、Phi-3)。
模型版本
:
- Dense 模型:全参数微调(如 Llama 3-8B)。
- MoE 模型:混合专家模型(如 Mixtral 8x7B),需注意专家激活策略。
- 量化模型:低资源场景(如 4-bit 量化的 Llama.cpp 模型)。
(3) 环境配置
硬件
:
- 单卡:A10、3090(适合 7B 以下模型)。
- 多卡:A100/H100(支持 70B 模型分布式训练)。
软件
:
- 框架:HuggingFace Transformers、DeepSpeed、LLaMA-Factory。
- 依赖库:
accelerate
、peft
(参数高效微调)、datasets
。
2. 训练流程
(1) 模型加载与分词器配置
1 | PYTHONfrom transformers import AutoModelForCausalLM, AutoTokenizer |
(2) 数据预处理
格式转换:将数据转换为模型输入格式(如添加特殊标记)。
1
2PYTHONdef format_prompt(example):
return f"### Instruction:\n{example['instruction']}\n\n### Input:\n{example['input']}\n\n### Response:\n{example['output']}"分词与填充:
1
2
3
4
5
6
7PYTHONfrom transformers import DataCollatorForLanguageModeling
tokenized_datasets = dataset.map(
lambda x: tokenizer(format_prompt(x), truncation=True, padding="max_length", max_length=512),
batched=True
)
data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)
(3) 训练参数配置
超参数设置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17PYTHONfrom transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./results",
overwrite_output_dir=True,
num_train_epochs=3,
per_device_train_batch_size=4,
gradient_accumulation_steps=8,
learning_rate=2e-5,
weight_decay=0.01,
logging_dir="./logs",
logging_steps=10,
save_steps=1000,
save_total_limit=2,
fp16=True, # 混合精度训练
push_to_hub=False,
)
(4) 参数高效微调(PEFT)
LoRA(Low-Rank Adaptation):仅训练低秩矩阵,节省显存。
1
2
3
4
5
6
7
8
9
10
11PYTHONfrom peft import LoraConfig, get_peft_model
lora_config = LoraConfig(
r=8, # 低秩矩阵秩
lora_alpha=16,
target_modules=["q_proj", "v_proj"], # 目标模块
lora_dropout=0.1,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
(5) 训练与验证
1 | PYTHONfrom transformers import Trainer |
3. 评估与优化
(1) 评估指标
- 生成任务:BLEU、ROUGE、METEOR(需安装
nltk
或datasets
)。 - 分类任务:准确率、F1 分数。
- 人工评估:流畅性、相关性、事实性(如使用 MTurk)。
(2) 过拟合监控
- 早停(Early Stopping):监控验证集损失。
- 正则化:增加 dropout、权重衰减(
weight_decay
)。 - 数据增强:随机替换同义词、回译(Back Translation)。
(3) 推理优化
- 量化部署:使用
bitsandbytes
或Llama.cpp
进行 4-bit 量化。 - 服务化:通过
vLLM
或Triton Inference Server
部署为 API。 - 缓存机制:复用注意力键值对(KV Cache)加速生成。
28.如果想要在某个模型基础上做全参数微调,需要多少显存?如何计算?
在做全参数微调时,所需的显存量取决于多个因素,包括模型的大小、批量大小、优化器类型、显存优化技术(如梯度检查点和混合精度)等。以下是具体的计算方法和示例,以帮助估算显存需求。
1. 显存需求的基本组成
显存的主要消耗来自以下几个部分:
- 模型参数:存储模型的权重。
- 优化器状态:包括梯度和动量等。不同的优化器需要的显存量不同。
- 前向传播激活值:用于反向传播计算梯度。
- 微调过程的临时存储:如梯度缓存、梯度检查点等。
2. 参数显存估算公式
- 模型参数 (Model Parameters / Weights):
- 是什么: 这是模型学习到的知识,包括神经网络各层的权重 (weights) 和偏置 (biases)。
- 影响因素: 模型的大小(参数量)、参数的数据类型(精度)。
- 精度:
- FP32 (单精度浮点数): 每个参数占用 4 字节。
- FP16 (半精度浮点数) / BF16 (bfloat16): 每个参数占用 2 字节。
- INT8 (8位整数): 每个参数占用 1 字节 (通常用于推理或量化训练)。
- 特点: 在推理和训练期间都需要加载。
- 优化器状态 (Optimizer States):
- 是什么: 为了根据梯度更新模型参数,优化器需要存储一些中间状态。这部分只在训练时需要。
- 影响因素: 选择的优化器类型、参数量、精度。
- 例子:
- SGD (带 Momentum): 需要存储每个参数的梯度 (大小同参数) + 动量值 (大小同参数)。通常梯度和动量保持 FP32。如果模型是 FP16,则需要 4 + 4 = 8 字节/参数 (梯度+动量,假设都用 FP32) 或 2 + 2 = 4 字节/参数 (如果动量也用 FP16)。实践中,梯度常累积为 FP32。
- Adam/AdamW: 需要存储梯度 (大小同参数) + 一阶矩估计 (m, 大小同参数) + 二阶矩估计 (v, 大小同参数)。同样,这些状态通常保持 FP32 精度。对于 FP16 模型,可能需要 4 + 4 + 4 = 12 字节/参数 (梯度+m+v,假设都用 FP32)。
- 特点: 这是训练时显存消耗的大头之一,尤其是对于 Adam 类优化器。使用 ZeRO 等分布式训练技术可以显著减少单个 GPU 上的优化器状态显存占用。
- 梯度 (Gradients):
- 是什么: 在反向传播过程中计算出的损失函数对每个模型参数的偏导数。
- 影响因素: 参数量、精度(梯度通常以 FP32 计算和累积,即使模型是 FP16/BF16)。
- 特点: 临时存储,计算出来后用于优化器更新参数。大小与模型参数量相同。如果使用 FP32 累积,则需要 4 字节/参数。
- 前向传播激活值 (Forward Pass Activations):
- 是什么: 模型在进行前向计算时,每一层神经网络输出的中间结果。这些结果需要被存储下来,以便在反向传播时计算梯度。
- 影响因素: Batch Size (批量大小)、Sequence Length (序列长度)、模型隐藏层维度、模型层数、注意力机制类型、激活值的精度。
- 特点: 这是训练时通常最大的显存消耗部分,且其大小与 Batch Size 和 Sequence Length 近似成正比。使用梯度检查点 (Gradient Checkpointing / Activation Checkpointing) 技术可以显著减少这部分显存占用,但会增加计算时间(因为它在前向传播时丢弃部分激活值,在反向传播时重新计算)。
- 临时存储 / 工作空间 (Temporary Storage / Workspace):
- 是什么: 各种计算(如卷积、矩阵乘法、注意力计算等)可能需要额外的临时显存空间来存储中间结果或作为 CUDA Kernel 的工作区。梯度缓存、梯度检查点产生的临时数据也属于此类。
- 影响因素: 具体操作、库实现 (cuDNN, cuBLAS)、Batch Size、模型结构。
- 特点: 难以精确预估,但通常比激活值或优化器状态小。
- 输入数据批次 (Input Data Batch):
- 是什么: 当前正在处理的一批输入数据本身也需要加载到显存中。
- 影响因素: Batch Size、Sequence Length、词嵌入维度(或图像尺寸、通道数)、数据精度。
- 框架和 CUDA 上下文开销 (Framework and CUDA Context Overhead):
- 深度学习框架(PyTorch, TensorFlow)本身以及 CUDA 运行时需要一定的显存来管理操作和维护 GPU 上下文。通常相对固定,在几百 MB 到 1-2 GB 之间。
3. 示例:不同规模模型的显存需求
假设我们有以下模型,使用单精度(32位浮点数):
- GPT-2 Small(1.5亿参数):约 600 MB(模型参数) + 1.2 GB(优化器) + 激活值
- GPT-3 Small(1.75亿参数):约 700 MB(模型参数) + 1.4 GB(优化器) + 激活值
- GPT-3 Large(13亿参数):约 5.2 GB(模型参数) + 10.4 GB(优化器) + 激活值
- GPT-3 175B:约 700 GB(模型参数) + 1.4 TB(优化器) + 激活值
4. 计算激活值显存
激活值的显存需求主要取决于批量大小和序列长度。假设每个激活值占用与参数相当的内存,每层都会存储激活值。如果模型有 ( L ) 层、批量大小为 ( B ),序列长度为 ( T ),每个激活值大约占 ( $4 \times T \times B$ ) 字节。
对于较大的模型(如 175B 参数的 GPT-3),激活值消耗甚至可能超过模型参数本身。为了控制显存使用,可以使用 梯度检查点 和 混合精度训练 等技术。
5. 如何降低显存需求
以下是一些减少显存占用的技巧:
- 混合精度训练:将模型参数从 32 位浮点数改为 16 位浮点数,节省约一半显存。
- 梯度检查点:在前向传播中保存较少的激活值,减少反向传播所需的显存。
- 分布式训练:使用多 GPU 来分担显存压力,例如通过模型并行和数据并行。
6. 实际估算显存需求
举个简单例子,如果要全参数微调一个 10 亿参数(1B)的模型,使用 Adam 优化器和批量大小 4,序列长度为 1024:
- 模型参数显存:约 4 GB
- 优化器状态:约 8 GB
- 激活值(假设 24 层 Transformer):约 4 GB
总计大约需要 16 GB 显存,可能还需要额外的缓存。
29.为什么SFT之后感觉LLM傻了?
在对大语言模型(LLM)进行监督微调(SFT)后,模型可能出现“变傻”的现象,这是一些常见问题引起的。以下是可能的原因和相应的解释:
1. 训练数据的单一性或质量问题
- 数据过于单一:如果用于微调的数据太局限,模型会在微调过程中“忘记”一些预训练期间学到的通用知识,变得更加“狭隘”。例如,如果只用特定格式的问答数据进行微调,模型的回答可能会受限于这种格式。
- 数据质量差:如果 SFT 数据中包含错误、不连贯或不准确的信息,模型会在微调时吸收这些低质量信息,从而导致“变傻”。确保数据准确、符合实际应用场景非常重要。
2. 过度拟合或灾难性遗忘
- 过度拟合:如果训练次数过多或学习率过高,模型可能会过度拟合到微调数据上,从而损失了泛化能力。模型会变得“偏执”,只会回答和微调数据非常类似的问题。
- 灾难性遗忘:模型可能会在微调过程中丧失之前学到的一些知识,尤其是当微调数据相对较少时。这导致模型在回答通用问题时表现变差。
3. 监督信号过强,损失灵活性
- SFT通常使用强监督信号来让模型学会特定格式或风格,导致模型生成的回答更加固定化、缺乏灵活性。例如,模型在生成回答时会倾向于采用模板化的回答方式,而忽略多样化表达。
- 为了达到符合特定格式的目标,SFT过程可能会抑制模型原有的推理能力,使其变得“死板”。
4. 对话模式的影响
- 如果 SFT 数据包含大量特定对话模式或礼貌用语,模型可能会变得更加“迎合”用户,而不是做出准确的回答。模型可能会过度强调顺从性、礼貌性,忽略原有的逻辑性和准确性。
5. 优化目标的局限
- 在 SFT 中,模型的训练目标可能过于关注特定的指标(如准确率、格式化等),忽略了实际对话和理解中的灵活性和创造性。例如,如果优化目标过于关注简洁回答,模型可能会忽略额外信息,变得“简短而浅显”。
- 损失函数的选择不当也可能导致模型在某些回答场景中表现变差。例如,如果损失函数过于简单或缺乏多样性,模型会对某些问题给出单调的回答。
6. 微调时未使用足够的正则化
- 缺乏正则化(如Dropout、权重惩罚等)可能会导致模型在微调过程中迅速适应特定的 SFT 数据,但失去泛化能力,使模型更容易出现灾难性遗忘或过度拟合。
7. 参数调整不当
- 超参数(如学习率、批量大小、优化器等)的选择对微调效果影响很大。较高的学习率可能导致模型忘掉原有知识,而太低的学习率可能会使 SFT 效果不明显,达不到期望目标。
如何改进 SFT 过程以避免“变傻”
- 使用多样化和高质量的数据:确保 SFT 数据覆盖丰富的场景,避免过度局限于某种特定格式或领域。
- 加入原始数据进行正则化训练:在微调过程中,可以加入部分预训练数据或通用对话数据,以帮助模型保留其原有知识。
- 调整超参数和正则化策略:使用适当的学习率和训练轮数,避免模型过度拟合到 SFT 数据。
- 使用适当的损失函数:选择合适的损失函数,避免对特定格式或风格过度优化。
- 使用增量训练或混合精度训练:可以在不同的数据集上逐步微调,使模型保留更多的原始知识。
通过以上改进措施,可以在 SFT 的过程中更好地平衡模型的“专精”与“通用”能力,避免模型“变傻”。
29.领域模型Continue PreTrain 数据如何选取?
在构建领域模型并继续预训练(Continue Pretrain)时,数据的选择和质量对最终效果至关重要。领域数据应该能够有效地丰富模型在该领域的知识和语言特征,同时避免信息噪声。以下是选取领域数据的一些关键原则和方法:
1. 确保领域相关性
- 选择与目标领域高度相关的文本,确保数据覆盖目标领域的关键术语、概念和语言风格。例如:
- 医疗领域的模型:应使用医学文献、临床报告、健康网站的内容。
- 金融领域的模型:应包含金融新闻、财经报告、行业研究、市场分析。
- 法律领域的模型:需要法律条文、判决书、合同范本等内容。
- 来源选择:可以从专业文献、行业报告、领域相关的论坛和讨论网站、官方文件等来源收集数据,以保证数据的专业性和准确性。
2. 确保数据质量
- 去除非结构化和低质量文本:剔除拼写错误、语法混乱、不完整的句子和冗余内容。可以使用自动化清洗工具,或者手动筛选一些样本,确保质量。
- 去除重复数据:大量重复的数据可能会导致模型的过拟合,因此需要去重。
- 数据标注:在某些领域中,经过标注的数据更有帮助。例如在法律领域,标注不同类型的法律文件或术语;在医学领域,标注不同的病症、药物等信息。这可以帮助模型更好地理解数据结构。
3. 数据覆盖广度
- 选择包含多种类型的领域文本,以确保模型具有良好的泛化能力。例如,在金融领域,可以选择涵盖股票、银行、宏观经济、政策分析等内容的数据集。
- 时效性:一些领域(如科技、金融)可能对时效性有要求,选择较新的数据有助于模型掌握最新的术语和趋势。
4. 控制数据分布和比重
- 控制领域数据与通用数据的比例:领域数据在整体数据中的占比需要合适,以达到细化模型知识的效果。如果只使用单一领域数据,模型可能丧失其通用性。可以通过逐步增加领域数据的比例来控制知识的迁移速度。
- 分布平衡:在领域数据内部,也需要确保不同类型数据的均衡。例如,在医学领域,可以均衡医学文献、病历记录、药物说明等的数量。
5. 关注领域中的特定语言特征
- 术语和习惯用语:确保数据集中包含领域内常见的术语、缩写和习惯用语,例如在金融领域的“IPO”、“流动性”、在医学领域的“抗体”、“高血压”等。
- 风格和语气:某些领域(如法律、学术)通常有特定的写作风格和语气,选择数据时应尽量保持一致,这有助于模型生成符合领域特征的文本。
6. 数据来源建议
- 公开数据集:可以优先考虑一些经过整理的领域数据集(如 PubMed 医学数据集、法律判例集等),这些数据集通常质量较高、结构较清晰。
- 行业文档:从相关领域的专业报告、白皮书、技术手册、行业期刊等提取内容。
- 领域内的社区和论坛:在一些专业领域中,论坛和问答社区(如Stack Overflow、医学论坛)是获取实用领域数据的好来源。
- 网络爬取:可以从专业网站、领域相关博客等爬取数据,需注意数据版权和清洗。
7. 混合预训练策略
- 为了保留模型的通用能力,可以采用混合预训练的策略。比如将通用数据与领域数据交替进行训练,或分阶段进行训练:
- 阶段式训练:首先在通用数据上训练一段时间,然后逐步切换到领域数据上。
- 交替训练:在每个训练 epoch 中交替使用领域数据和通用数据,以防止模型“遗忘”通用知识。
8. 引入数据增强和多样化
- 数据增强:通过同义词替换、句式变换等方法增加数据的多样性,有助于模型更好地泛化。
- 合成数据:在某些稀缺领域(如特定医学病历),可以生成一些合成数据或使用其他类似的领域数据以增强数据集。
总结
在选取领域数据进行继续预训练时,核心是找到高质量、广泛覆盖且适当平衡的数据。领域数据要具备专业性和时效性,同时需要考虑与通用数据的比重,以确保模型在特定领域内知识更丰富的同时,仍然保持一定的通用能力。
30.领域数据训练后,通用能力往往会有所下降,如何缓解模型遗忘通用能力?
在领域数据上训练模型后,常会出现“灾难性遗忘”的现象,即模型在特定领域表现提升的同时,通用能力有所下降。这种问题在自然语言处理模型中尤为显著,因为领域数据会覆盖一些常用的通用数据,导致模型过度专注于该领域。要缓解模型遗忘通用能力,可以采取以下几种策略:
1. 混合数据训练
- 通用数据与领域数据混合训练:在继续预训练(Continue Pretrain)时,将通用数据和领域数据按比例混合。例如,可以设置领域数据占 70%,通用数据占 30%,以平衡模型的领域知识和通用能力。
- 动态数据比例调整:在训练的初期可以多用领域数据,逐渐增加通用数据的比例。这种做法可以帮助模型先掌握领域知识,再逐步恢复和加强通用能力。
2. 交替训练(Interleaved Training)
- 在每个 epoch 或训练循环中交替使用领域数据和通用数据进行训练。例如,一个 epoch 使用领域数据,接下来一个 epoch 使用通用数据。这样可以让模型在每次接触领域数据后“复习”通用数据,减少遗忘。
- 多任务训练:通过多任务训练的方式,可以同时训练模型的通用任务和领域任务,让模型学习在不同任务中保持平衡。这种方式尤其适合有特定任务需求的模型,如问答、文本生成等。
3. 少量微调(Lightweight Fine-Tuning)
- 冻结部分通用层:在微调过程中,冻结模型的前几层或部分网络层,使其保持原有的通用知识。这样可以只更新模型的高层次表示层或最后几层,以增强模型对领域数据的适应性,同时尽量减少对通用能力的影响。
- 适当降低学习率:使用较小的学习率进行微调,可以减少模型在通用数据上的遗忘速度。这有助于平衡模型对通用知识和领域知识的掌握。
4. 知识蒸馏(Knowledge Distillation)
- 使用蒸馏技术,将通用模型的知识“蒸馏”到新模型中。例如,在训练领域模型时,以预训练模型(教师模型)为参考,让微调后的模型(学生模型)模仿教师模型的输出。这种方法可以在微调过程中保持模型的通用能力。
- 蒸馏过程中,可以设置损失函数,使学生模型在学习领域知识的同时,仍然尽量保持与教师模型的输出一致性,从而保留通用知识。
5. 正则化策略
- Elastic Weight Consolidation (EWC):EWC是一种常见的防遗忘策略,通过在训练时对模型参数施加正则化约束,确保模型不会过度偏离原来的通用知识。它根据参数对模型性能的影响程度来设置不同的约束权重,保护重要的参数。
- L2正则化:通过引入 L2 正则化,可以在训练过程中限制模型的参数更新幅度,保持与预训练模型的权重距离,减少对通用知识的遗忘。
6. 知识回放(Replay)
- 定期将通用数据作为“回放”数据引入模型训练过程。例如,训练一段时间领域数据后,再使用通用数据对模型进行短暂训练。这类似于让模型“复习”之前的知识,可以缓解遗忘问题。
- 在使用回放策略时,可以随机选择通用数据中的一小部分,以降低训练成本,同时在模型内保持通用知识的活性。
7. 层次式微调(Layer-Wise Tuning)
- 通过逐层微调的方式,让模型逐步适应领域数据。例如,先微调高层(接近输出端)的几层,然后逐步向低层(接近输入端)微调。这样可以使模型在保留通用知识的前提下,逐步调整到领域需求上。
- 这种方法的优点在于,模型的低层通常包含更多通用信息,而高层则倾向于捕捉特定任务的特征。逐层微调可以帮助模型在训练过程中逐渐适应领域知识。
8. 基于参数高效的适配(Parameter-Efficient Adaptation)
- 使用参数高效的适配方法,如 Adapter Layer 或 LoRA(Low-Rank Adaptation),在模型的特定层插入适配模块,专门用于学习领域数据,而不对模型的主要参数进行大幅调整。
- 这种方法通过在不改变模型核心参数的情况下引入新的知识,从而保留原有的通用能力,同时实现对领域的适应性。
9. 保持评估与调试
- 在训练过程中,定期评估模型的通用任务性能,例如在常用的通用数据集(如Wiki数据、通用问答集)上进行测试。如果发现模型在通用任务上的性能下降过快,可以采取调整策略,如增加通用数据训练或降低学习率。
- 通过评估模型在领域和通用任务上的平衡情况,及时调整训练策略,以确保模型在微调后不会完全偏向特定领域。
总结
为减缓模型遗忘通用能力,可以通过混合数据、交替训练、正则化、知识蒸馏等多种方法,使模型在学习领域知识的同时保留通用知识。不同方法适合不同的场景,可以根据具体需求结合使用,从而在领域知识与通用能力之间找到平衡。
31.什么是分布式训练?
定义:分布式训练是指将机器学习或者深度学习模型训练任务分解为多个子任务,并在多个计算设备上并行训练的过程。该过程需要多个设备进行计算,还涉及设备之间的数据传输。
优势:可以加速模型的训练。
常见策略:数据并行,模型并行。
假设神经网络中某一层是做矩阵乘法,输入为 4×5 的矩阵 $x$ ,模型参数为 5×8的矩阵 $w$ ,那么该层的输出为4×8的矩阵 $out$。
单机单卡的训练,该层先计算得到 $out$,并将 $out$ 传递给下一层,最终得到 $loss$然后再反向传播过程中,通过 $\frac {\partial {loss}} {\partial w}$ 更新 $w$。而分布式训练则是通过切分 $x$ 或者 $w$ 进行训练加速。其中,根据切分的是 $x$ 还是 $w$ ,分为”数据并行“和”模型并行“。
32.大模型为什么需要分布式训练?
由于内存墙的存在,单一设备的算力及容量,受限于物理定律(电磁学,光学,量子力学等),导致持续提高芯片的集成越来越困难,难以满足大模型的训练需求。
内存墙:计算机处理器和内存之间速度差异的瓶颈问题。即CPU的处理速度远远超过了内存的访问速度,导致CPU在处理任务时常常需要等待内存的响应,从而限制了计算机整体性能的提升。
33.什么是数据并行策略?
定义:数据并行就是将数据 $x$ 进行切分,而每个设备上的模型参数 $w$ 相同。
并行流程:
在分布式训练中,当我们把输入数据 $x$ 沿第0维度平均分配到两个计算设备上时,每个设备上得到的输出将只是最终逻辑输出的一半。这意味着,要获得完整的逻辑输出,我们需要将两个设备上的输出结果进行拼接。
然而,由于数据被分配到不同的设备上,在反向传播计算损失函数对权重 $w$ 的梯度时,每个设备上计算得到的 $\frac {\partial {loss}} {\partial w}$ 是不同的。这种差异会导致各设备上的模型训练状态不一致,进而影响模型的收敛性和性能。
为了解决这个问题,在反向传播过程中,我们必须对所有设备上的梯度进行AllReduce操作。AllReduce操作能够确保各个设备上的梯度信息进行汇总和平均,使得每个设备上的模型权重更新保持一致,从而保证整个分布式训练过程中模型的一致性和准确性。
适用范围:当数据集较大,模型较小时,由于反向过程中为同步梯度产生的通信代价较小,此时选择数据并行一般比较有优势。
34.什么是数据并行策略中的AllReduce操作?
简介:Allreduce操作是分布式训练中用于节点间同步参数的高效通信方法,确保深度学习训练的一致性并降低通信成本。
基本原理:先将所有节点的参数相加,然后再将结果广播到所有节点。
实现流程:
(1)在每个训练迭代中,每个节点使用自己的数据子集对模型进行训练。
(2)在每次迭代或一定数量的迭代后,每个节点将对自己模型参数的更新量(梯度)进行求和。
(3)每个节点将它的局部总和发送给一个指定的根节点。
(4)根节点收到所有其他节点的局部总和后,会将这些总和相加,得到一个全局的总和.
(5)根节点会将计算出的全局总和发送给所有其他节点。
(6)每个节点用接收到的全局总和减去自己原来的局部总和,得到新的参数值。
35.什么是模型并行策略?
当神经网络规模极为庞大时,数据并行方式下同步梯度的开销将显著增加,甚至可能出现网络规模超出了单个节点的存储能力。针对这一挑战,采用模型并行策略。
定义:模型并行一般指层内并行,就是将模型参数$x$ 进行切分,而每个设备上的数据 $w$ 相同。
层内并行:在同一个网络层内,参数可以被分割到不同的设备上,每个设备计算该层的一部分输出。在这种情况下,各设备上的计算通常是并行进行的,,然后汇总结果。
并行流程:
在分布式训练中,沿着第1维度将单层内的模型参数 $w$ 平均分配到两个计算设备上,每个设备仅负责存储和处理模型参数的一个子集。只有当所有计算设备上的这些子集模型参数拼接在一起时,才能构成完整的模型。
由于每个设备在执行前向传播和反向传播时都需要对整个数据集进行操作,因此在实施模型并行策略的过程中,输入数据必须在所有计算设备之间进行广播,确保每个设备都能获得完整的输入数据集以独立处理其分配到的模型部分。
36.什么是流水并行策略?
当神经网络过于巨大,无法在单个设备上存放时,还可以采用流水并行的方式。
定义:流水并行一般指层间并行,就是将模型的所有网络层分块并被放置在不同的设备上。每一个设备的输出将成为下一个设备的输入。各个设备之见采用“接力”的方式完成训练。
并行流程:
在分布式训练中,将模型分为4个模块( $T1$ ~ $T4$ ), 然后均分在两个设备(GPU0和GPU1)上进行运算。GPU0上完成前两层的计算后,它的输出被当作GPU1的输入,继续进行后两层的计算。
37.什么是混合并行策略?
在网络的训练过程中,可以综合运用数据并行、模型并行以及流水并行等策略。以GPT-3为例:
(1)将整个模型被划分为64个阶段,实现整体模型的流水并行策略;
(2)在每个阶段,采用6台DGX-A100主机,实现单阶段的数据并行策略;
(3)在每台主机上,采用8张GPU显卡实现单台机的模型并行策略。
38.描述评估LLM性能的一些技术。
以下是评估大型语言模型(LLM)性能的一些常见技术:
基于基准测试的评估
- 优点:标准化程度高,方便在不同模型间进行对比。
- 缺点:可能无法完全覆盖真实场景中的复杂情况。
- 通用语言理解评估基准(GLUE):
- 详情:它包含了多个自然语言理解任务,比如情感分析、文本蕴含、语义相似度等,涵盖了如MNLI(多体裁自然语言推理)、QQP(Quora问题对)等不同的数据集。模型在这些数据集上进行训练和测试,通过计算准确率、F1值等指标来衡量其在自然语言理解方面的性能。例如,在情感分析任务中,判断文本表达的是积极还是消极情感,模型预测准确的比例越高,则说明其在该任务上的理解能力越强。
- 适用场景:主要用于评估LLM对文本语义理解、推理等自然语言理解能力,广泛应用于比较不同模型在自然语言处理基础任务上的性能优劣。
- 超级GLUE(SuperGLUE):
- 详情:是GLUE基准的升级版,包含了更具挑战性的自然语言理解任务,像BoolQ(判断一个句子是否能回答给定的问题)、ReCoRD(基于知识的阅读理解任务)等。其任务的复杂度和难度更高,要求模型具备更强的语义理解、逻辑推理以及知识融合等能力,通过在这些任务上的表现来综合评估模型性能,指标同样有准确率、F1值等。
- 适用场景:旨在测试模型在更高级、更复杂的自然语言理解场景下的能力,用于筛选出在自然语言处理前沿研究领域表现出色的模型,比较先进模型之间的性能差异。
- 语言模型评估指标(LAMBDA):
- 详情:从语言生成的流畅性、语法正确性、语义合理性以及与给定上下文的相关性等多个维度,对模型生成的文本进行评估。通过人工标注或者利用一些自动评价工具,给生成的文本打分,综合衡量模型在语言生成任务中的整体质量。例如,对于一个故事生成任务,考察生成故事的情节连贯性、语言是否通顺等方面。
- 适用场景:常用于评估LLM在文本生成任务(如故事创作、对话生成等)方面的性能,关注模型输出文本的质量和符合人类期望的程度。
人工评估
- 优点:能考虑到诸多复杂、主观的因素,贴合实际使用场景中的感受。
- 缺点:耗时费力,成本较高,且具有一定主观性,评估结果可能不够稳定。
- 直接打分法:
- 详情:招募专业的标注人员或者普通用户,让他们根据预先设定的标准,对模型生成的文本在多个维度(比如内容质量、相关性、可读性等)进行打分,一般采用等级评分制(如1 - 5分)。例如,在评估一个智能写作助手生成的文章时,标注人员根据文章的立意、结构、语言表达等方面给出相应的分数,最后综合所有标注人员的打分情况来衡量模型性能。
- 适用场景:适用于各种文本生成任务,尤其是对文本质量要求较高、需要综合考量多个主观因素的情况,像文案创作、学术论文生成等领域。
- 排序法:
- 详情:向标注人员展示多个由不同模型或者同一模型不同版本生成的文本,让他们按照特定的要求(如质量高低、与主题的契合度等)进行排序。通过分析大量标注人员的排序结果,统计不同模型文本处于较优位置的频率等数据,来判断模型的相对性能。例如,对于几个对话生成模型生成的聊天回复,让标注人员根据回复的合理性、趣味性等因素进行排序,以对比各模型在对话场景下的表现。
- 适用场景:常用于对比多个模型或模型变体在特定任务上的优劣,在需要区分细微差异、选出更符合特定需求的模型时较为实用,比如在智能客服系统中选择性能更好的对话模型。
自动化评估
- 优点:高效、可快速批量评估,结果相对客观。
- 缺点:不能完全替代人工评估,可能无法准确捕捉到一些需要主观判断的质量问题。
- BLEU(双语评估替换分数):
- 详情:最初用于机器翻译任务,衡量生成的翻译文本与参考译文之间的相似度。它基于n-gram(连续的n个单词或字符组成的片段)的匹配情况来计算得分,n-gram匹配度越高,BLEU分数越高,说明生成的文本与参考文本越接近。例如,在将一段英文翻译成中文后,对比生成的中文译文和标准的中文参考译文,计算BLEU分数来评估翻译质量。现在也被拓展应用到其他文本生成任务的评估中。
- 适用场景:常用于评估文本生成任务中生成文本与给定参考文本的相似程度,尤其在机器翻译、摘要生成等有比较明确参考文本的场景应用较多。
- ROUGE(Recall-Oriented Understudy for Gisting Evaluation):
- 详情:主要用于评估自动文本摘要系统的性能,通过计算生成的摘要与参考摘要之间的召回率相关指标,来衡量摘要对原文关键信息的覆盖程度。比如有不同的摘要生成模型对一篇新闻文章生成摘要,通过对比它们与人工撰写的高质量摘要之间的ROUGE得分,判断各模型提取关键信息的能力。它有多个变种,如ROUGE-N(基于n-gram的召回率)、ROUGE-L(基于最长公共子序列的召回率)等,从不同角度评估摘要质量。
- 适用场景:是文本摘要任务评估的常用指标,用于衡量摘要生成模型能否准确提炼出原文的核心内容,也可部分应用于其他需要关注信息提取和文本浓缩的文本生成场景。
- Perplexity(困惑度):
- 详情:是一种基于概率的评估指标,衡量语言模型对测试数据的预测能力。简单来说,困惑度越低,说明模型对给定文本的概率分布预测越准确,也就意味着模型在语言建模方面表现越好。例如,将一个文本数据集输入到LLM中,计算模型输出的概率分布对应的困惑度值,以此来评估模型是否很好地学习到了语言的规律和模式。
- 适用场景:常用于评估语言模型本身的语言建模能力,在比较不同语言模型在同一数据集上的基础性能,或者研究模型在不同训练阶段的性能变化等场景中广泛应用。
基于任务的实际应用评估
- 优点:最贴合实际使用情况,能反映模型在真实需求中的价值。
- 缺点:评估环境复杂,难以精准归因性能好坏的具体原因,受外部因素影响大。
- 特定领域任务测试:
- 详情:针对具体的应用领域,如医疗领域的病历分析、法律领域的条文解读等,将LLM应用到相关的实际任务中,通过观察其在完成这些任务时的准确率、召回率、完成时间等具体指标,来评估模型性能。例如,在医疗领域,让模型辅助诊断疾病,根据其对病例中关键信息的提取和疾病判断的正确与否来衡量它在该领域的实用性。
- 适用场景:用于考察LLM在各个具体行业和专业领域中的应用能力,帮助筛选出适合特定业务场景的模型,推动LLM在垂直领域的落地应用。
- 用户体验评估:
- 详情:招募真实用户,让他们在实际使用环境中与搭载LLM的产品(如智能聊天机器人、智能写作助手等)进行交互,收集用户的反馈,比如满意度、易用性、是否解决问题等方面的评价,以此来综合评估模型在实际使用中的性能表现。例如,通过问卷调查、用户访谈等方式,了解用户在使用智能客服系统时,对其回复的及时性、准确性、友好性等方面的感受,进而判断模型的优劣。
- 适用场景:关注模型在面向最终用户时的实际体验,适用于各类以LLM为核心的消费级产品的性能评估,旨在优化产品以更好地满足用户需求。
39.在现实项目应用中,大规模部署LLM有哪些挑战?
在现实项目应用中,大规模部署LLM存在以下挑战:
- 数据方面:
- 数据质量和准确性:
- 数据噪声问题,训练数据中可能存在错误、不完整或不一致的信息,影响模型的准确性和可靠性。例如,在文本数据中可能存在拼写错误、语法错误等,这些错误可能会被模型学习到,从而影响生成文本的质量。
- 数据标注的准确性,对于有监督学习的LLM,准确的标注数据是训练的基础,但标注过程可能存在误差或主观性,导致模型学习到错误的模式。
- 数据隐私与安全:
- LLM的训练和部署通常需要大量的文本数据,其中可能包含用户的敏感信息,如个人身份信息、医疗记录、金融数据等。确保这些数据的隐私和安全,防止数据泄露和滥用,是大规模部署LLM的重要挑战。例如,如果医疗领域使用LLM来辅助诊断,患者的病历数据必须得到严格的保护。
- 在数据传输、存储和处理过程中,需要采取加密、访问控制、安全审计等多种安全措施,以保障数据的安全性。
- 数据稀缺性与不平衡性:在某些应用场景下,可能存在数据稀缺的情况,即缺乏足够的训练数据来训练一个性能良好的LLM。例如,对于一些新兴的领域或特定的行业问题,相关的数据可能较少。另外,数据的不平衡性也可能导致模型的偏差,例如某些类别的数据样本过多或过少,会影响模型对不同类别的学习和识别能力。
- 数据质量和准确性:
- 模型性能与计算资源方面:
- 模型规模与计算需求:LLM通常具有庞大的模型规模,需要大量的计算资源来支持训练和推理。大规模部署LLM需要强大的硬件基础设施,包括高性能的服务器、GPU集群等,这会带来高昂的成本。例如,训练一个像GPT-3这样的大型语言模型需要数千个GPU运行数周甚至数月的时间。
- 推理延迟与吞吐量:在实际应用中,用户对LLM的响应速度有较高的要求,但由于LLM的推理过程是复杂的计算过程,特别是对于较长的文本输入或复杂的任务,可能会导致较高的推理延迟。此外,在大规模部署时,需要同时处理大量的用户请求,如何保证系统的高吞吐量也是一个挑战。
- 模型压缩与优化:为了降低计算资源需求和提高推理速度,需要对模型进行压缩和优化。这包括模型量化、剪枝、知识蒸馏等技术,但这些技术可能会影响模型的性能和准确性,需要在性能和资源消耗之间进行权衡。
- 模型适应性与泛化能力方面:
- 领域适应性:LLM通常是在大规模的通用数据上进行训练的,在应用到特定领域时,可能会出现性能下降的情况。例如,在法律、医学等专业领域,需要模型对专业术语、法律条文、病历等特定的知识有深入的理解,这就需要对模型进行进一步的训练和优化,以提高其在特定领域的适应性。
- 任务适应性:不同的任务对模型的要求不同,例如文本生成、问答、情感分析等任务需要模型具有不同的能力和表现。在大规模部署LLM时,需要根据具体的任务需求对模型进行调整和优化,以提高其在特定任务上的性能。
- 持续学习与更新:现实世界中的数据是不断变化的,LLM需要不断地学习和更新,以保持对新数据的适应性。然而,大规模部署的LLM模型更新可能会涉及到大量的数据处理和模型重新训练,这需要耗费大量的时间和资源。
- 可解释性与可靠性方面:
- 模型可解释性:LLM通常是一个黑盒模型,难以解释模型的决策过程和生成结果的原因。这在一些对结果解释性要求较高的应用场景中,如医疗诊断、金融风险评估等,可能会带来问题。用户和监管机构可能对模型的决策过程和结果的可靠性存在疑虑,需要提高模型的可解释性。
- 模型可靠性与稳定性:在大规模部署时,模型的可靠性和稳定性至关重要。模型可能会受到各种因素的影响,如硬件故障、软件漏洞、网络问题等,导致模型的性能下降或服务中断。因此,需要建立完善的监控和容错机制,及时发现和解决问题,确保系统的稳定运行。
- 伦理与法律方面:
- 偏见与公平性:LLM的训练数据可能存在偏见和不平衡,这可能会导致模型在生成文本时产生偏见,对某些群体造成不公平的影响。例如,在招聘、贷款审批等场景中,如果使用存在偏见的LLM模型,可能会导致对某些候选人或申请人的不公平评价。
- 知识产权与版权:LLM生成的文本可能会涉及到知识产权和版权的问题。如果模型生成的文本与现有作品相似度过高,可能会侵犯他人的知识产权。此外,在使用LLM时,也需要遵守相关的版权法律法规,确保数据的合法使用。
- 责任界定:在使用LLM的过程中,如果出现错误的决策或不良的后果,很难确定责任的归属。是模型开发者的责任,还是用户的责任,或者是其他相关方的责任,需要建立明确的责任界定机制。
40.prefix LM 和 causal LM区别是什么?
Prefix LM(前缀语言模型)和Causal LM(因果语言模型)是两种不同类型的语言模型,它们的区别在于生成文本的方式和训练目标。
Prefix LM:Prefix LM会基于给定的前缀(即已有的部分文本序列)来预测下一个可能出现的词,适用于文本生成、机器翻译等任务。Prefix LM利用Attention Mask机制,使得其Encoder和Decoder可以共用同一个Transformer结构。在Encoder部分,使用Auto-Encoding(AE自编码)模式,允许前缀序列中的任意两个token相互可见;而在Decoder部分,则实行Auto-Regressive(AR自回归)模式,确保每个token只能看到之前已生成的tokens。
Causal LM:Causal LM根据历史历史Tokens来预测下一个Token,适用于文本生成,语言建模等任务。Causal LM只涉及Decoder部分,利用Attention Mask机制来实现Auto-Regressive(AR自回归)模式。
41.LLMs是否对输入本文的长度有限制?
LLMs 对输入文本的长度确实有限制,但这与通常意义上的“Encoder 模型宽度”(即隐藏层维度 d_model
或 H
)不是一回事。这个限制主要来自于 Transformer 架构本身处理序列长度 (Sequence Length, T
) 的方式,特别是其固定的上下文窗口 (Context Window)。
让我们来厘清几个概念:
- 模型宽度 (Hidden Dimension,
H
ord_model
): 这指的是模型内部表示每个 token 的向量维度(比如 768, 2048, 4096 等)。它决定了模型表示信息的丰富程度,不直接限制输入序列的长度。 - 上下文窗口大小 (Context Window Size,
T
orn_ctx
): 这指的是模型在一次前向传播中能够同时处理的最大 token 数量。例如,GPT-3 的早期版本是 2048 tokens,GPT-4 有 8k、32k 甚至 128k 的版本,Llama 2 是 4096,Claude 3 有 200k。这才是输入文本长度的直接限制因素。
为什么 Transformer 有固定的上下文窗口限制?
主要原因在于其核心的自注意力机制 (Self-Attention) 和位置编码 (Positional Encoding):
- 自注意力计算成本: 标准的自注意力机制需要计算序列中所有 token 对之间的注意力得分。如果序列长度为
T
,计算复杂度和内存占用都与T^2
成正比。当T
变得非常大时,这个二次方的增长会使得计算变得极其昂贵和缓慢,显存也难以承受。 - 位置编码: 原始 Transformer 使用绝对位置编码,这些编码通常被预定义或学习到最大长度
T
。虽然相对位置编码等变体更灵活,但它们仍然在特定的实现中隐含或显式地与一个最大处理长度相关联。
那么,LLMs 是如何“实现”处理看似超过其“原生”Transformer 模型窗口限制的文本的呢?
这里有几种情况和技术:
更大的原生上下文窗口: 最直接的方法就是训练具有更大上下文窗口的模型。像 GPT-4 (32k/128k)、Claude 3 (200k) 就是通过架构改进、优化和大规模训练实现的。但这仍然是一个有限的窗口,只是这个“限度”被大大提高了。它们内部仍然是基于(可能经过优化的)Transformer 结构。
滑动窗口注意力 (Sliding Window Attention): 一些模型(如 Mistral, Mixtral)并不让每个 token 都关注窗口内的所有其他 token。它们采用滑动窗口机制,即每个 token 只关注其前面固定数量(例如 4096 或 8192 个)的 token。这大大降低了计算复杂度(近似线性
O(T*k)
而不是O(T^2)
,其中 k 是窗口大小),使得模型可以处理更长的序列,即使其“理论”上下文窗口很大,实际的注意力计算也是局部的。分块处理 (Chunking / Segmentation):
这是在应用层面处理超长文本的常用方法,而不是模型架构本身的变化。
- 方法: 将长文档分割成多个能放入模型上下文窗口的小块 (Chunks)。
- 简单处理: 逐块处理,但会丢失跨块的上下文信息。
- 重叠处理: 让块之间有重叠,可以传递一些局部上下文。
- 摘要/状态传递: 处理完一个块后,生成一个摘要或提取关键信息,并将其作为下一个块的输入前缀,试图维持更长的上下文。这需要精心设计 Prompt 或额外的逻辑。
检索增强生成 (Retrieval-Augmented Generation, RAG):
这是目前处理超长文档或知识库最有效和流行的方法之一,它绕过了将所有文本放入上下文窗口的需求。
- 方法:
- 预处理: 将长文档分割成小块,计算它们的向量表示 (Embeddings),并存储在向量数据库中。
- 检索: 当用户提出问题时,先根据问题检索出数据库中最相关的几个文本块。
- 生成: 将用户的问题和检索到的相关文本块一起放入 LLM 的上下文窗口,让 LLM 基于这些信息生成答案。
- 优势: 模型只需要处理与问题最相关的少量信息,而不是整个长文档。这使得 LLM 可以有效地“利用”远超其上下文窗口大小的文档知识。
- 方法:
架构创新 (研究方向):
学术界一直在研究更高效的 Transformer 变体,试图克服
O(T^2)
的限制,例如:- 稀疏注意力 (Sparse Attention): 只计算部分重要的 token 对之间的注意力。
- 线性注意力 (Linear Attention): 将复杂度降低到
O(T)
。 - 递归或分层方法: 尝试将长序列的表示进行压缩或分层处理。
- (例如 Longformer, BigBird, Transformer-XL 等研究) 这些方法可能在特定模型或未来模型中被采用。
总结:
LLMs 处理长文本的能力并非无限,其核心仍然受限于 Transformer 的上下文窗口大小 T
。它们能够处理看似超长的文本,主要是通过以下方式的组合:
- 训练时就设定了更大的原生上下文窗口
T
(如 GPT-4 128k, Claude 3 200k)。 - 采用优化的注意力机制 (如滑动窗口) 来降低长序列的计算成本。
- 在应用层面使用策略 (如分块处理、RAG) 来绕过将所有内容一次性放入窗口的限制,尤其是 RAG,它让模型能“访问”长文档信息而无需“读取”全部。
因此,并不是模型宽度的问题,而是模型如何在其有限的序列处理长度 (上下文窗口) 内,通过架构优化或外部策略来应对更长的输入需求。
42.为什么需要领域的垂直模型?
1.领域的特定知识:特定领域的大模型需经过针对性训练以掌握行业知识和术语。
2.语言风格和惯用语:针对特定领域训练的大模型能更好地掌握其独特的语言风格和惯用语,从而生成更贴合该领域需求的文本。
3.领域需求的差异:不同领域对文本处理的需求各异,如金融领域侧重数字和统计数据,法律领域侧重条款和案例分析。
4.领域数据的独特性:在数据量较少的领域,通用大模型可能无法得到充分训练。而针对这些领域专门训练的大模型能更有效地利用有限数据,提升模型性能和效果。
43.中文分词有什么难点?
中文文本由于其独特的语言特性,存在以下难点:
缺乏明确分隔符:与英文等使用空格分隔单词的语言不同,中文文本中没有明显的词边界。
分词标准:中文分词缺乏统一的标准,不同的分词方法可能会导致不同的分词结果。比如组合词是否应该分开(“花草树木“ or “花” “草” “树木”)
切分歧义: 固有型歧义,分词粒度不同导致的多种切分结果。比如:”华夏子女“可以是”华夏子女“,也可以是“华夏”和“子女”两个词。偶发型歧义,相同字元的不同组合导致多种切分结果。比如:“行政处女职员”可以是“行政处”和“女职员”,也可以是“行政”,“处女”和“职员”。真歧义,真实存在歧义的句子。比如“人中人梦醒醒醒心不惊”可以是“人中人“ ”梦醒醒“ ”醒心不惊”,也可以是“人中人“ ”梦醒” “醒醒心” “不惊”。中文文本切分歧义频次约为每百字一次,偶发型与固有型占比12:1,真歧义出现概率较低。
生词:也叫未登录词,表示未被词典收录的词。未登录词对分词精度的影响远超歧义切分,识别难度很大。原因在于生词的创造十分迅速、长度不定且无固定边界标志、易与上下文构成切分歧义,且常含外来符号。
44.什么是基于词典的分词算法?
基于词典的分词算法通过一定的策略,将待匹配的字符串与一个庞大的词典进行对比。若匹配成功,则实现分词。根据不同的匹配策略,分词算法分为:最大匹配法(见Q21)和全切分路径选法。其中,全切分路径选择法通过N最短路径法和或者N元语法模型将所有可能的切分结果枚举出来,从中选择最优切分路径。
N最短路径法:将所有的切分结果组成有向无环图(切词结果作为节点,词和词之间的边赋予权重),找出权重和的极值路径作为最佳分词路径。例如,可以使用词频作为权重,选择总词频最高的路径作为最佳分词路径。对于句子“研究生命起源”,可能的切分结果有“研究生/命/起源”和“研究/生命/起源”。如果“研究生”的词频低于“研究”和“生命”,则“研究/生命/起源”这条路径的总词频更高,被选择为最佳分词路径。
N元语法模型:这种方法同样基于最短路径,但在构建路径时考虑了词的上下文关系。一元语法模型考虑词的前后一个词,二元语法模型则考虑前后两个词。根据语料库的统计结果,选择概率最大的路径作为最佳分词。例子:对于句子“北京大学生物学院”,一元语法模型可能会考虑以下几种切分方式:“北京大学/大学生/物学院”,“北京/大学生/物学院”,“北京大学/生物/学院”。该模型计算每种切分方式中每个词出现的概率,并尝试找出概率最高的切分作为最佳分词路径。
45.什么是基于统计的分词算法?
基于统计的分词算法将分词问题视为序列标注任务,其中语句中的每个字根据其在词中的位置被标注为B(词开始)、E(词结束)、M(词中间)或S(单字词)。例如,句子“网商银行是蚂蚁金服微贷事业部的最重要产品”经过标注后得到“BMMESBMMEBMMMESBMEBE”,对应的分词结果为“网商银行/是/蚂蚁金服/微贷事业部/的/最重要/产品”。通过统计分析方法获得序列标注结果后,即可实现分词。这类算法通常基于机器学习技术,包括HMM(隐马尔科夫模型)、CRF(条件随机场)、SVM(支持向量机)等。
46.什么是词性标注?难点在哪里?
词性作为词语基本的语法属性,是词语和语句的关键性特征。词性标注是自然语言处理中的一个基础任务,它涉及给文本中的每个词汇分配一个词性标签,比如名词、动词、形容词等。其目的是为文本提供更丰富的句法和语义信息。这是后续的语言理解和分析任务的基础,如句法分析、语义角色标注、情感分析等常见的中文标注集是ICTCLAS词性标注集。
中文词性标注面临形态变化少、一词多词性、词性标准不统一及未登录词处理等挑战。
形态变化少是指相较于英文,中文没有词性变化,不能从词的形态来识别词性。例如,英文中的“books”通过复数“-s”后缀可明确为名词,而中文的“书”无论在何种语境下形态都不变。
一词多词性是指中文词既可以做名词也可以做动词等。例如:“基础学科研究”和“研究基础学科”。
词性标准不统一是指LDC标注语料将汉语一级词性划分为33类,但北京大学语料库则划分为26类。
未登录词处理是指无法通过字典直接获取词性。例如:“skrrr”
47.为什么Decoder-only架构成为了大模型的主要框架?
避免Encoder的低秩问题:(1)Encoder-Decoder架构可能存在低秩问题,削弱模型表达能力,而Decoder-only架构无需引入双向注意力,避免了这一问题。(2)在同等参数量和推理成本下,Decoder-only架构因解码参数更多,更具优势。
更好的Zero-Shot性能:(1)Decoder-only模型在无标注数据下的Zero-Shot性能优于Encoder-Decoder模型,更适合大规模语料的自监督学习。(2)Encoder-Decoder模型需要多任务微调才能激发最佳性能,而Decoder-only模型无需额外标注数据即可表现优异。
更适合RLHF(人类反馈强化学习):RLHF依赖模型生成结果的排序,而非强监督信号,与Decoder-only的自监督学习范式更契合。
推理效率高,支持多轮对话:Decoder-only架构支持KV-Cache复用,对多轮对话更友好。
1. 低秩问题 (Low-Rank Bottleneck / Problem)
- 什么是秩 (Rank)? 在线性代数中,矩阵的秩大致衡量了其所能表示的信息的“维度”或“丰富度”。一个低秩矩阵意味着它的行或列是线性相关的,可以用更少的基础向量组合来表示,信息被压缩在一个较低维度的子空间里。
- 在 Encoder-Decoder 架构中指什么?
- 在标准的 Encoder-Decoder 架构(如原始 Transformer、BART、T5)中,Encoder 负责读取和理解整个输入序列,并将其压缩成一个固定大小或可变长度但有限的表示(通常是 Encoder 最后一层的输出序列)。
- Decoder 在生成输出序列的每一步时,需要通过交叉注意力 (Cross-Attention) 机制去“查询”Encoder 输出的这个表示,以获取与输入相关的信息。
- 低秩问题/瓶颈 指的是:Encoder 输出的这个中间表示可能不足以完全捕捉输入序列中所有丰富和复杂的细节。它就像一个信息的“瓶颈”,无论输入多么复杂,最终传递给 Decoder 的信息都被限制在这个中间表示的“表达能力”(秩)之内。如果这个表示的有效秩较低,那么一些重要的细微差别或长距离依赖关系可能在压缩过程中丢失了。
- 后果: 这可能导致 Decoder 在生成输出时无法充分利用输入信息,尤其是在需要精确复制、理解复杂关系或处理长输入的任务中,可能会削弱模型的整体表达能力和性能。
- 为什么 Decoder-Only 架构避免了这个问题?
- Decoder-Only 架构(如 GPT 系列)没有一个独立的 Encoder 和一个分离的中间表示。它只有一个 Decoder 模块。
- 在生成过程中,它通过自注意力 (Self-Attention) 直接关注已经生成的部分序列以及输入的 Prompt。信息在模型内部逐层传递和处理,没有一个明确的、可能造成信息损失的“Encoder 输出表示”作为中间步骤。
- 因此,它不存在 Encoder-Decoder 架构中特有的这种跨模块信息传递瓶颈。
- 关于第二点 (同等参数量下 Decoder-only 优势): 如果总参数量相同,Encoder-Decoder 需要将参数分配给两个不同的模块(Encoder 和 Decoder),而 Decoder-Only 可以将所有参数集中在一个更深的或更宽的 Decoder 上。这可能使得 Decoder-Only 的这个单一模块在生成任务上(解码能力)更强大,因为它拥有更多的参数专门用于解码过程。
2. KV Cache (Key-Value Cache)
- 背景: 这是在 Transformer 模型(尤其是 Decoder-Only 模型)进行自回归推理 (Autoregressive Inference),即逐个 token 生成文本时,用来加速计算的一种关键技术。
- 问题: 在生成第
t
个 token 时,标准的自注意力机制需要计算当前 token (t
) 与前面所有t
个 token (从 0 到t-1
) 之间的注意力分数。这意味着需要计算所有这些 token 的 Query (Q), Key (K), 和 Value (V) 向量。当生成第t+1
个 token 时,又需要计算 tokent+1
与前面所有t+1
个 token (从 0 到t
) 的注意力。你会发现,计算 token0
到t-1
的 Key 和 Value 向量这个工作在生成t
和t+1
时重复了!随着序列变长,这种重复计算会变得非常耗时。 - 什么是 KV Cache? KV Cache 就是用来存储并重用那些已经计算过的、属于过去 token 的 Key (K) 向量和 Value (V) 向量的内存区域。
- 工作方式:
- 当处理第一个 token (或 Prompt 中的 token) 时,计算它的 K 和 V 向量,并将它们存储在 Cache 中。
- 当生成下一个 token (比如第t个 token) 时:
- 只需要为当前这个新 token
t
计算其 Query (Q_t
), Key (K_t
), 和 Value (V_t
)。 - 将新的
K_t
和V_t
追加到 Cache 中。 - 然后,使用
Q_t
与 Cache 中存储的所有 Key 向量 (K_0
到K_t
) 计算注意力分数。 - 再用这些分数加权求和 Cache 中存储的所有 Value 向量 (
V_0
到V_t
)。
- 只需要为当前这个新 token
- 重复此过程,Cache 会随着生成序列的增长而变大。
3. KV Cache 的作用是什么?
- 核心作用:显著加速推理/生成速度。
- 通过避免为过去的 token 重复计算 Key 和 Value 向量(这些计算涉及与大的权重矩阵相乘,非常耗时),KV Cache 将每次生成新 token 的计算量从与整个序列长度
T
相关(需要为 T 个 token 计算 K, V)降低到只与新生成的 1 个 token 相关(只为新 token 计算 K, V)加上注意力计算本身(这部分仍然依赖于T
,但避免了大量的矩阵乘法)。
- 通过避免为过去的 token 重复计算 Key 和 Value 向量(这些计算涉及与大的权重矩阵相乘,非常耗时),KV Cache 将每次生成新 token 的计算量从与整个序列长度
- 使得长序列生成成为可能: 如果没有 KV Cache,每生成一个 token 都需要重新处理整个历史序列,生成长文本的速度将慢到几乎不可用。
- 代价:消耗额外的显存。 Cache 需要存储过去所有 token 的 K 和 V 向量(通常是在每一层都存)。Cache 的大小与
层数 × 序列长度 × 隐藏层维度
成正比。这也是为什么即使使用了 KV Cache,模型在推理时能处理的上下文长度仍然受限于 GPU 显存的一个重要原因。
48.什么是BERT模型?
BERT(Bidirectional Encoder Representations from Transformers)是一种基于双向 Transformer 编码器的语言模型。
其核心特点如下:(1)采用双向 Transformer 结构,同时考虑文本序列的左右上下文,实现更深入的语言理解。(2)通过 Mask Language Model (MLM)和 Next Sentence Predicton (NSP) 进行多任务训练,增强 了模型的表达能力。
输入编码向量(长度为512)由三个向量相加而成的,包括:(1)位置嵌入(Position Embedding):编码单词的位置信息,对于理解单词顺序至关重要。(2)WordPiece嵌入:将单词划分成一组有限的公共子词单元,确保单词的有效性和字符的灵活性。(3)分割嵌入(Segment Embedding):用于标识句子边界,例如在句子对中,第一个句子的嵌入值为0,第二个句子的嵌入值为1。
主要包括两个任务:(1)Masked LM(MLM):约15%的WordPiece Token在单词序列中被随机遮蔽。然后BERT尝试基于序列中其他未被 mask 的单词的上下文来预测被掩盖的原单词。(2)Next Sentence Prediction(NSP): 使用成对句子作为输入,并预测第二个句子是否是第一个句子的后续句子。
以下是BERT“过时”的主要原因及替代方案:
1. 模型规模与计算效率
- 问题:BERT的原始版本参数量较大(Base版约1.1亿,Large版3.4亿),推理速度较慢,且对硬件资源要求高。在移动端或嵌入式设备上的部署成本较高。
- 改进方向:
- 轻量化模型:如 DistilBERT(参数减少40%,保留97%性能)、TinyBERT(体积更小)、ALBERT(通过参数共享大幅压缩模型)。
- 蒸馏技术:利用知识蒸馏(Knowledge Distillation)将BERT的知识迁移至更小模型。
2. 上下文长度限制
- 问题:BERT的输入长度固定为512个token,无法直接处理长文档(如论文、法律文本)。
- 改进方向:
- 长文本模型:Longformer(稀疏注意力机制)、BigBird(线性复杂度注意力)、Transformer-XL(分段循环机制)等支持数千token的输入。
- 滑动窗口策略:通过局部注意力分段处理长文本。
3. 生成任务的局限性
- 问题:BERT仅包含编码器部分,适合分类、问答等理解任务,但无法直接用于文本生成(如翻译、摘要)。
- 改进方向:
- Seq2Seq架构:T5、BART等结合编码器-解码器的模型,既可理解又可生成。
- 生成增强模型:如 UniLM(统一语言模型框架)支持生成任务。
4. 预训练目标的改进
- 问题:BERT的Masked Language Model(MLM)随机掩码15%的词,可能导致预训练与微调阶段的分布差异。
- 改进方向:
- 动态掩码:如 RoBERTa取消NSP任务,改用动态掩码并延长训练时间。
- 去噪目标:T5将BERT的MLM扩展为文本到文本的去噪任务。
- 对比学习:SimCSE等模型通过对比学习优化句子表示。
5. 多语言与跨语言支持
- 问题:多语言BERT(mBERT)虽支持104种语言,但未显式建模跨语言对齐。
- 改进方向:
- 跨语言模型:XLM(Cross-lingual LM)、XLM-R(基于RoBERTa架构,使用更大规模多语数据)显著提升跨语言迁移能力。
- 单语模型专业化:如针对中文的 Chinese-BERT-wwm、MacBERT等针对性优化。
6. 实际应用需求的变化
- 低资源场景:在数据稀缺领域,BERT依赖大量标注数据,而Few-shot/Learning-free模型(如提示学习Prompt Tuning、LoRA微调)更灵活。
- 领域适配:BioBERT(生物医学)、Legal-BERT等垂直领域模型针对特定场景优化,超越通用BERT。
- 实时性要求:工业界需要更高效的模型(如Google的 TAPAS、阿里云的 PLUG),BERT的延迟难以满足。
49.你能否概括介绍一下ChatGPT的训练过程?
ChatGPT的训练过程主要包括以下几个步骤:
a.𝗣𝗿𝗲-𝘁𝗿𝗮𝗶𝗻𝗶𝗻𝗴:预训练,大型语言模型在来自互联网的广泛数据集上进行训练,此阶段使模型具备理解语言模式的能力,但尚未具备理解指令或问题的能力。
b.监督微调或者指令微调。模型将用户消息作为输入,模型通过最小化其预测与提供的响应之间的差异来学习生成响应,此阶段标志着模型从仅仅理解语言模式到理解并响应指令的转变。
c.采用人类反馈强化学习 (RHFL) 作为后续微调步骤。
详细介绍如下:
预训练阶段
- 数据收集:收集海量的文本数据,来源广泛,涵盖各种类型的文本,如新闻、小说、论文、社交媒体对话、客服对话、问答对话等,以提供丰富的语言知识和上下文关系.
- 数据预处理:对收集到的文本数据进行预处理,包括分词、标记化、去除噪声等操作。标记化是将文本转换为模型能够理解和处理的标记序列,还会进行清洗和规范化,如去除特殊字符、标点符号、HTML标签,以及应用停用词去除、词形还原和词干提取等文本清理技术,以简化文本并提高训练效果.
- 无监督学习:基于Transformer架构,使用大量的文本数据在无监督的方式下进行自回归预测任务,即根据前面的若干个词来预测下一个词,让模型学习语言的概率分布,从而掌握语言的基本规律和各种知识.
监督微调阶段
- 收集标注数据:从测试用户提交的prompt中随机抽取一批,由专业标注人员针对这些prompt给出高质量的答案,形成<prompt, answer>数据对.
- 有监督微调:使用上述人工标注好的数据对来微调预训练的GPT-3模型,使模型初步具备理解人类prompt中所包含意图,并根据该意图给出相对高质量回答的能力,让模型能够更好地适应特定的任务需求.
强化学习微调阶段
- 训练回报模型:随机抽样一批用户提交的prompt,使用经过监督微调后的模型为每个prompt生成多个回答,人工对这些回答按照相关性、富含信息性、是否包含有害信息等诸多标准进行综合排序。然后,以这些排序结果作为训练数据,采取pair-wise learning to rank模式训练回报模型RM,RM模型接受<prompt, answer>输入,输出评价回答质量高低的回报分数.
- 强化学习微调:利用训练好的RM模型,根据其打分结果来更新预训练模型的参数,而无需额外的人工标注数据,使模型的答案更接近人类的意图,进一步优化模型的生成策略,减少模型生成内容的偏差和不一致性,提高模型输出与人类期望的对齐程度.
50.大模型中的Reasoning和Inference有什么区别?
Reasoning
Reasoning(推理)是指通过逻辑推理、数学计算、逻辑判断等方式,从已知信息中推导出新的知识或结论。在自然语言处理中,Reasoning通常涉及到对文本内容的理解和分析,以便从文本中提取出有用的信息,并基于这些信息进行推理和判断。例如,在问答系统中,模型需要理解问题并从文本中找到相关的答案;在文本分类中,模型需要理解文本的内容并判断其所属的类别。
Inference
Inference(推断)是指根据已有的证据或信息,对未知事件或现象进行预测或判断。在自然语言处理中,Inference通常涉及到对文本内容的理解和分析,以便从文本中提取出有用的信息,并基于这些信息进行预测或判断。例如,在情感分析中,模型需要理解文本的情感倾向;在文本生成中,模型需要根据已有的文本内容生成新的文本。
区别
Reasoning和Inference都是对文本内容的理解和分析,但它们的侧重点不同。Reasoning更侧重于从已知信息中推导出新的知识或结论,而Inference更侧重于根据已有的证据或信息进行预测或判断。在实际应用中,Reasoning和Inference往往会结合使用,以实现对文本内容的全面理解和分析。
DeepSeek R1属于Reasoning模型
51.大模型中外推技术是什么?
LLM(大语言模型)的外推技术(Extrapolation Techniques)是指让模型在推理阶段处理比训练时更长的上下文(Context)或序列长度的技术。由于大语言模型(如GPT、LLaMA等)在训练时通常有固定的上下文窗口(如4096 tokens),但在实际应用中可能需要处理更长的输入(例如长文档、多轮对话),外推技术旨在扩展模型的上下文处理能力,而不需要重新训练整个模型。
核心问题与挑战
- 训练时固定长度限制:模型在训练时通常使用固定长度的窗口(如4096 tokens),对超出该长度的文本可能表现不佳。
- 位置编码的局限性:大多数模型依赖位置编码(如绝对位置编码、相对位置编码)来捕捉序列顺序,但这些编码在超出训练长度时可能无法泛化。
主要外推技术
以下是几种常见的LLM外推技术:
1. 位置编码优化
- 旋转位置编码(RoPE, Rotary Position Embedding)
通过旋转矩阵对位置信息进行编码,相比传统绝对位置编码更具灵活性。RoPE在理论上支持外推,但实际性能可能随长度增加而下降。 - ALiBi(Attention with Linear Biases)
在注意力机制中引入线性偏置(随相对距离衰减),使模型在训练时隐式学习对长距离依赖的泛化能力,外推效果较好。
2. 窗口扩展(Window Scaling)
- 在推理时通过调整注意力窗口(如缩放注意力分数的温度系数)或动态调整位置编码参数,使模型适应更长的序列。例如:
- NTK-aware Scaling:基于神经切线核(NTK)理论,对位置编码插值以平滑扩展上下文窗口。
- 动态NTK插值:动态调整RoPE的基频参数(base frequency),平衡短距离和长距离位置的分辨率。
3. 分块处理(Chunking)
- 将长文本分割为多个块(chunks),分别处理后再整合结果。例如:
- Transformer-XL:通过引入循环机制(recurrence)跨块传递隐状态,保留部分长距离依赖。
- 滑动窗口:局部注意力结合全局缓存,逐步处理长序列。
4. 微调适配(Fine-tuning)
- 在少量长文本数据上对模型进行微调,使其适应更长的上下文。例如:
- 位置插值微调(Position Interpolation):对位置编码进行线性插值,平滑过渡到更长序列。
- 渐进式扩展:逐步增加训练时的序列长度,让模型逐步适应。
外推技术的效果与权衡
- 优点:无需完全重新训练模型,成本较低;可快速适配长文本场景。
- 局限性:
- 外推性能通常弱于直接训练长上下文模型(如GPT-4的128k窗口)。
- 可能牺牲短文本的性能(外推过长时位置编码分辨率下降)。
- 分块处理可能导致上下文碎片化。
典型应用场景
- 长文本生成:生成小说、论文、长代码等。
- 多轮对话系统:保持长期对话历史的连贯性。
- 文档分析与摘要:处理超长PDF或书籍。
- 代码补全:理解大型代码库的上下文。
未来方向
- 更鲁棒的位置编码:如可学习的外推位置编码。
- 稀疏注意力机制:降低长序列的计算复杂度。
- 模型架构改进:如State Space Models(如Mamba)等替代Transformer的结构。
外推技术是当前LLM研究的热点方向,旨在突破模型对上下文长度的限制,推动其在长文本任务中的实用性。