解密prompt系列27. LLM对齐经验之如何降低通用能力损失

前言

前面我们已经聊过众多指令微调的方案,这一章我们重点讨论下如何注入某一类任务或能力的同时,尽可能不损失模型原有的通用指令理解能力。因为在下游或垂直领域应用中,我们设计的推理任务风格或形式,往往很难通过prompt来稳定实现。这种情况下就会依赖微调来注入稳定的推理风格,但同时在部分场景下我们又需要模型微调前的通用指令理解能力。虽然理论上说有得必有失,但成年人真的不想做选择!这里我们讨论两种方案,来尽可能降低通用能力的损失,一种数据方案,一种训练方案。

Two Stage Finetune - ProMoT

  • Preserving In-Context Learning ability in Large Language Model Fine-tuning
  • TWO-STAGE LLM FINE-TUNING WITH LESS SPECIALIZATION AND MORE GENERALIZATION

先说训练方案,论文先是分析了模型在微调过程中能力损失的一个主要原因是Format Specialization,也就是模型过拟合了微调任务的输出格式。举几个例子

  • 下游是二分类任务的,微调之后即便丢掉分类任务的指令,模型的输出还是True/False,损失了对话和其他指令理解能力
  • 下游是摘要任务的,微调之后即便丢掉TL;DL的总结指令,你让模型翻译模型还是给你总结。这个在当前推出的一些长文本无敌的基座模型上可能会看到,他们后期的指令微调中指令分布都比较偏向于长文本的QA和总结,其他能力会略弱
  • 通过微调让模型学习拒绝回答的,你会发现你的模型可能在很多不该拒绝的场景也拒绝你

其实核心就是我们本想让模型学习条件生成能力,也就是在分类指令时分类,摘要指令下摘要,该拒绝的场景下再拒绝。但论文通过分析发现在传统微调任务中,模型是先无脑拟合输出格式,例如二分类的True/False,拒绝里的对不起,在微调后期才开始学习input和ouput之间的关系(Semantic Relation),例如何时该分类,何时该拒绝。

那能否把下游任务的Task Format先行注入到额外的参数中,之后把这部分信息喂给模型,让大模型微调直接学习Semantic Relation,这样在稳定注入新的Format的前提下,尽可能不影响其他input的推理格式。

论文提出了两阶段微调,第一阶段也使用了谷歌提出的Prompt Tuning用来学习Format,第二阶段再进行全量微调。如下
image

第一阶段Prompt Tuning,简单说就是冻结大模型,只微调Embedding层的一组虚拟Token,这一组虚拟Token学习的就是下游推理任务Format的任务表征。

这里可以反过来思考,之前有论文提出任务指令(prompt)其实可以压缩成一个Task Vector的任务表征用来引导模型给出不同的推理输出;那反过来我们想让模型学习一种推理风格/任务,其实就是构建该Format对应的Task Vector,以及Task Vector对应的任务指令的过程。只不过prompt tunning的prompt使用的是虚拟Token。

image

第二阶段Fine-tuning默认在输入层Embedding前拼接Prompt Embedding,b并冻结这部分Embedding,然后全量微调大模型, 让模型在已知输出格式的前提下,学习Input和Output格式之间的Semantic联系。之前有些疑惑这里为何要冻结prompt,后来又想了想应该是为了避免模型再把Task Format相关信息更新到模型内部参数中,但感觉不冻结的方式也值得测试下。

几个值得聊聊的细节

  1. 第一阶段微调能否用Lora,从Prompt实际学习的是推理格式的任务表征这个逻辑原理来说其实Adapter类的微调方案,似乎并不合理。论文测试后也发现Lora的效果并不好
  2. 能否把两个阶段合二为一,既加上一个虚拟Prompt,同时微调模型和prompt,论文测试后发现效果和SFT相差不多,都会有过拟合。毕竟这种微调方式无法引导模型把格式学到Prompt Embedding上。

效果上,论文在mT5模型上对比了SFT,Prompt-Tuning,和ProMoT在下游微调任务,和微调任务之外其他通用任务的能力对比。发现ProMoTe可以在分类,翻译,NLI,QA等任务微调上对比全量微调都有更好的效果。同时以分类任务为例,在分类任务上进行微调后,在QA等其他任务上相比基座模型能力也没有显著下降,作为对照组的SFT会有显著的通用能力的下降。

image

image

Dual-Stage Mixed Finetuning - DMT

  • How Abilities in Large Language Models are Affected by Supervised Fine-tuning Data Composition
  • Scaling Relationship on Learning Mathematical Reasoning with Large Language Models

DMT的论文主要探究了不同领域数据混合,以及混合训练策略对模型在多领域能力的影响。

1. 单领域Scaling curve

要想设计更合理的多领域混合训练策略,首先要确认不同领域样本模型学习的scaling curve。这个问题之前已经有很多论文讨论过,这里简单回顾下,如下图所示

image

  • 数学和代码等领域能力,会随样本量上升而持续提升,并且模型规模越大scaling curve越单调且陡峭。 这一点和我们的测试效果相似,数学和代码样本你就可劲加,加一点模型好一点,更多细节看上面Scaling的论文。
  • 通用指令能力,基本在1K(1/256的样本)的样本上效果就很好了,后续能力提升会比较慢,并且在不同规模的模型上差异相对有限。

2. 多领域混合Scaling curve

明确单一领域的scling curve之后,我们来看多领域的数据混合,这里会分别讨论数据混合中的两个要点:整体量级和混合比例

  1. 整体量级:和以上单领域实验相同的5种不同采样比例,直接对三个领域的数据进行混合,和上面的单领域实验结果进行对比。观察下图会发现在低资源上领域混合会有提升,但在更大的样本量级上单领域微调效果会略好 一个可能的解释是在小量级样本上会有彼此的能力迁移,而当单领域信息逐步提升后信息冲突会逐渐显现

image

  1. 混合比例:为了进一步探究以上全样本混合训练中出现的信息冲突的来源,作者进一步做了控制变量的实验。固定一个领域(math和code合成一个领域)的样本量改变另一个领域的样本量,看不同比例数据混合的影响。主要结论有
  • 主领域样本还是越多越好
  • 当领域样本差异(输出格式/输入分布)较大时,通用领域数据对特殊领域影响有限
  • 当样本存在相似性时混合会带来冲突,但冲突和数据比例没有显著单调性

image

3. 训练策略影响

论文实验了不同训练策略的影响,包括多领域联合训练,有序训练(Code->Math->General),以及先训练Math+Code再训练general的有序混合训练,。这几种策略之前也有很多论文做过测试,这里简单说下结论

  • 多领域联合训练:会更多学到特殊领域(Math+code),更多损伤通用能力。这块可以更多借用ProMoT的逻辑,因为特殊领域输出风格一致模型更容易学到,而通用领域输出风格更多样些
  • 有序训练和有序混合训练:只要是先训练领域能力再训练通用能力,因为灾难遗忘的原因,最终模型会把先学到的领域能力遗忘

image

在以上三种训练方案的基础上,论文提出了两阶段混合训练(DMT)如下

第一阶段是领域数据的训练,按照单领域scaling curve,这一部分的数据量越大效果越好,所以使用全量级的数学和代码进行训练。

第二阶段用于恢复通用能力,同时尽量避免有序训练带来的灾难遗忘。 这里使用了上面多领域混合的insight,领域数据的混合比例对通用能力影响较小;同时低资源混合带来的冲突较小。因为论文使用了1/256的领域数据和通用数据进行混合进行第二阶段的训练。在尽量避免第一阶段模型学到的能力丢失的基础上,帮助模型恢复通用能力。

效果上在LLaMA7B,13B,和33B的模型上,DMT的训练方案能在保留单领域训练绝大多数领域能力的基础上,保证模型通用能力不受损失,甚至略微有所提升。如果想要保留更多的领域能力,允许更多的通用能力损失,则可以适当提高第二阶段的领域数据占比,具体要数据集上case by case的测试。
image

最后

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。

因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

五、面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下。
在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

<think> 首先,用户的问题是关于解释代码:`chain = prompt | llm.bind_tools(tools)`。用户提供了几个引用,我需要参考这些引用来解释。 回顾引用: - 引用[1] 讨论了使用CustomPromptTemplate定义LLM prompt,以及创建工具和代理。 - 引用[2] 提到ChatPromptTemplate.from_messages的使用和PromptValue。 - 引用[3] 和[4] 讨论了Prompt技术如Chain-of-Thought。 用户的问题焦点是理解代码:`chain = prompt | llm.bind_tools(tools)`。这看起来像是LangChain框架中的代码,因为LangChain是一个流行的AI代理开发框架,它使用链式结构来组合组件。 在LangChain中: - `prompt` 可能是一个PromptTemplate对象,用于生成提示。 - `llm` 是一个语言模型实例。 - `bind_tools` 是LangChain中的一个方法,用于将工具绑定到LLM,以便LLM可以在生成响应时调用这些工具。 - `|` 操作符在LangChain中用于管道(pipe)操作,表示将一个组件的输出传递给下一个组件的输入。 所以,代码`chain = prompt | llm.bind_tools(tools)` 的意思是: - `prompt` 生成一个提示字符串。 - `llm.bind_tools(tools)` 将工具绑定到LLM,创建一个新的可调用对象。 - 管道操作符 `|` 将这两个组合成一个链:提示的输出作为输入传递给绑定工具的LLM。 在LangChain中,这创建了一个链,其中: 1. 提示模板用于基于输入生成提示。 2. 这个提示被传递给绑定工具的LLMLLM可以决定是否使用工具来生成响应。 参考相关引用: - 引用[1] 提到了`CustomPromptTemplate`和`LLMChain`,这类似于这里的`prompt`。 - 引用[2] 讨论了`ChatPromptTemplate.from_messages`,支持变量填充。 - 引用[3] 和[4] 提到了Prompt技术,但更侧重于推理方法如CoT。 用户提供了引用,所以我应该在回答中自然地引用相关部分。例如: - 解释`bind_tools`时,可以引用引用[1]中关于工具绑定的部分。 - 解释管道操作符时,可以引用LangChain的一般实践。 用户指令要求: - 所有行内数学表达式使用$...$格式。但这个问题不是数学相关的,所以可能不需要数学表达式。 - 独立公式使用$$...$$格式。同样,可能不适用。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在引用的段落末尾添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 回答结构: 1. **解释代码含义**:逐步解释每个部分和组合。 2. **引用相关引用**:自然地插入引用。 3. **生成相关问题**:在末尾添加相关问题。 确保回答真实可靠: - 基于我的LangChain知识:`bind_tools`是LangChain中的一个方法,用于允许LLM调用工具。管道操作符用于串联组件。 步骤解释: - `prompt`:可能是一个提示模板,定义了如何将输入转换为提示字符串。 - `llm.bind_tools(tools)`:`tools`是一个工具列表;`bind_tools`返回一个可调用对象,该对象可以处理提示并调用工具。 - `|`:组合成一个序列链。 在LangChain中,这等价于: ```python chain = prompt | llm.bind(tools=tools) ``` 或类似。 最终,链的输出是LLM的响应,可能包括工具调用。 现在,生成相关问题: - 基于这个主题,如LangChain的链、工具绑定、管道操作等。 相关问题: 1. 如何使用LangChain中的管道操作符组合组件? 2. `bind_tools`方法的具体作用是什么? 3. 在LangChain中如何定义和使用工具? 4. 这种链在AI代理中有什么应用? 5. 如何优化这种链的性能? 确保在回答中自然地添加引用标识。 </think> ### 解释代码 `chain = prompt | llm.bind_tools(tools)` 的含义 这段代码是LangChain框架中的一个常见模式,用于构建一个AI代理(Agent)的推理链。它通过管道操作符 `|` 将提示模板(prompt)与绑定工具的语言模型llm)串联起来,形成一个完整的处理流程。下面我将逐步分解代码的含义,确保解释清晰易懂。 #### 1. **`prompt` 组件** - `prompt` 通常是一个提示模板对象(例如 `PromptTemplate` 或 `ChatPromptTemplate`),用于定义如何根据用户输入生成结构化的提示文本。 - 在LangChain中,提示模板可以包含变量(如 `{input}`),这些变量在运行时被填充。例如,引用[2]中提到 `ChatPromptTemplate.from_messages` 方法支持定义系统消息、用户消息等角色,并自动填充变量[^2]。 - 作用:将原始输入(如用户查询)转换为一个格式化的提示字符串,作为语言模型的输入。 #### 2. **`llm.bind_tools(tools)` 组件** - `llm` 是一个语言模型实例(如OpenAI的GPT模型),负责生成文本响应。 - `bind_tools(tools)` 是一个方法,用于将外部工具(tools)绑定到语言模型上。这些工具是预定义的功能模块(如API调用或数据处理函数),允许LLM在生成响应时动态调用它们。 - `tools` 参数是一个工具列表,每个工具包括名称、描述和执行函数(func)。例如,引用[1]中展示了工具的定义方式,如 `Tool(name="查询产品名称", func=...)`,这些工具用于扩展LLM的能力[^1]。 - 作用:`llm.bind_tools(tools)` 返回一个新的可调用对象,该对象不仅能生成文本,还能在必要时触发工具调用(例如,当模型判断需要查询外部数据时)。 #### 3. **管道操作符 `|`** - 在LangChain中,管道操作符 `|` 用于串联多个组件,形成一个链(Chain)。它表示数据从左到右流动:左侧组件的输出作为右侧组件的输入。 - 在本代码中,`prompt | llm.bind_tools(tools)` 意味着: 1. 首先,`prompt` 处理输入数据(如用户查询),生成一个提示字符串。 2. 然后,这个提示字符串作为输入传递给 `llm.bind_tools(tools)`。 3. 最后,绑定工具的LLM生成响应,可能包括直接文本输出或工具调用结果。 - 这种设计类似于流水线,提升了代码的可组合性和灵活性。引用[1]中提到的 `LLMChain` 或 `LLMSingleActionAgent` 也采用了类似思想[^1]。 #### 4. **整体含义:创建一个处理链** - 代码 `chain = prompt | llm.bind_tools(tools)` 定义了一个完整的推理链: - 输入:用户查询或数据。 - 输出:LLM的响应,可能包含工具调用(如查询公司信息或产品描述)。 - 举例说明:假设用户输入是“复歌科技的产品是什么?”,链的工作流程如下: - `prompt` 将输入转换为提示:例如,“用户询问复歌科技的产品,请使用工具查询”。 - `llm.bind_tools(tools)` 接收提示,LLM判断需要调用“查询产品名称”工具。 - 工具执行后,返回产品描述,LLM整合结果生成最终响应。 - 这种链常用于AI代理开发,结合了提示工程和工具集成,以提高响应的准确性和功能性。引用[3]和[4]提到的Chain-of-Thought(CoT)等技术,也常通过类似链结构实现逻辑推理[^3][^4]。 #### 5. **实际应用场景** - 这种代码模式在AI代理中很常见,例如客服机器人、数据查询系统等,其中LLM需要动态调用外部工具来处理复杂任务。 - 优势:简化了代码结构,支持模块化扩展(如添加更多工具),并优化了LLM的决策过程。 总结来说,`chain = prompt | llm.bind_tools(tools)` 创建了一个高效的AI处理管道:提示生成 → 工具绑定LLM → 响应输出。这体现了LangChain框架的核心设计理念,即通过组合简单组件构建强大应用[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值