Skip to content

Commit f5dd24e

Browse files
committed
docs:更新 AI 专栏
1 parent e76c775 commit f5dd24e

10 files changed

+1060
-49
lines changed

.vscode/.server-controller-port.log

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"port": 9146,
3-
"time": 1725701101976,
3+
"time": 1726209032396,
44
"version": "0.0.3"
55
}

docs/.vuepress/config.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -748,7 +748,7 @@ module.exports = {
748748
link: '/md/AI/00-rag-introduction-tool-to-eliminate-llm-hallucinations'
749749
},
750750
{
751-
text: 'Agent',
751+
text: 'Agent基础',
752752
link: '/md/AI/01-what-are-agents'
753753
},
754754
{
@@ -1550,6 +1550,7 @@ module.exports = {
15501550
"04-RabbitMQ & Spring整合开发",
15511551
"RabbitMQ消费端幂等性概念及解决方案",
15521552
"用了这么久的RabbitMQ异步编程竟然都是错的",
1553+
"08-RabbitMQ的七种队列模式",
15531554
"RabbitMQ的 RPC 消息模式你会了吗?",
15541555
"12-RabbitMQ实战-消费端ACK、NACK及重回队列机制",
15551556
]
@@ -1580,6 +1581,8 @@ module.exports = {
15801581
"02-MacOS下载安装启动ES和Kibana",
15811582
"03-核心概念之NRT Document Index 分片 副本",
15821583
"04-Kibana常见RESTful API操作",
1584+
"05-倒排索引与分词",
1585+
"07-整合进 SpringBoot 项目",
15831586
]
15841587
}],
15851588
"/md/ck/": [{
@@ -1902,7 +1905,7 @@ module.exports = {
19021905
]
19031906
},
19041907
{
1905-
title: "Agent",
1908+
title: "Agent基础",
19061909
collapsable: false,
19071910
sidebarDepth: 0,
19081911
children: [
@@ -1940,6 +1943,9 @@ module.exports = {
19401943
children: [
19411944
"00-introduce-to-LangGraph",
19421945
"langgraph-studio",
1946+
"methods-adapting-large-language-models",
1947+
"to-fine-tune-or-not-to-fine-tune-llm",
1948+
"effective-datasets-fine-tuning",
19431949
]
19441950
},
19451951
],
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# 如何微调:关注有效的数据集
2+
3+
本文关于适应开源大型语言模型(LLMs)系列博客的第三篇文章。在这篇文章中,我们将探讨一些用于策划高质量训练数据集的经验法则。
4+
5+
- [第一部分](http://www.javaedge.cn/md/AI/methods-adapting-large-language-models.html)探讨了将LLM适应于领域数据的普遍方法
6+
- [第二部分](http://www.javaedge.cn/md/AI/to-fine-tune-or-not-to-fine-tune-llm.html)讨论了咋确定微调是否适用于你的实际情况
7+
8+
## 1 介绍
9+
10+
微调LLMs是一门艺术与科学的结合,该领域的最佳实践仍在不断发展中。在本篇博文中,我们将突出微调的设计变量,并给出我们迄今为止所见的最佳实践的方向性指导,以在资源受限的情况下微调模型。我们建议使用下面的信息作为制定微调实验策略的起点。
11+
12+
## 2 全量微调 V.S 参数高效微调(PEFT)
13+
14+
都显示出在应用于新领域时改进了下游性能,无论在[学术](https://arxiv.org/pdf/2312.12148.pdf)环境中还是在[实际设置](https://www.sarvam.ai/blog/announcing-openhathi-series)。选择哪种取决于:
15+
16+
- 可用的计算资源(以GPU小时数和GPU内存衡量)
17+
- 除目标下游任务之外的任务表现(学习-遗忘权衡)
18+
- 人工标注成本
19+
20+
### 2.1 全量微调
21+
22+
更可能遭受两个问题:
23+
24+
- [模型坍缩](https://arxiv.org/html/2402.07712v1#bib.bib21):模型输出收敛到有限的一组输出,而原始内容分布的尾部消失了
25+
- [灾难性遗忘](https://ar5iv.labs.arxiv.org/html/2308.08747)
26+
27+
如该系列的[第一部分](http://www.javaedge.cn/md/AI/methods-adapting-large-language-models.html)所述,灾难性遗忘导致模型失去其能力。一些早期经验研究表明,[全量微调比PEFT更易出现上述问题](https://arxiv.org/abs/2405.09673),尽管还需要进一步研究。
28+
29+
### 2.2 PEFT技术
30+
31+
设计上作为微调的自然正则化器。PEFT通常需要相对较少的计算资源来训练下游模型,且对于数据集大小有限的资源受限场景更适用。
32+
33+
### 2.3 小结
34+
35+
某些情况下,全量微调在感兴趣的特定任务上表现更好,通常是牺牲了模型的一些原有能力。这种“学习-遗忘”的权衡在LoRA和全量微调之间的比较论文中进行了深入探讨[在此论文](https://arxiv.org/abs/2405.09673)中。
36+
37+
考虑到资源限制,PEFT技术可能比全量微调提供更好的性能提升/成本比率。如果在资源受限的情况下,下游性能至关重要,那么全量微调将是更有效的。无论在哪种情况下,关键在于创建高质量的数据集,同时牢记以下主要原则。
38+
39+
## 3 数据集策划
40+
41+
在文献中的微调实验中,数据集对于充分利用微调至关重要。这不仅仅是“质量更高和更多样例”的问题,你可以智能地投资于数据收集以提高资源受限微调实验的表现。
42+
43+
### 3.1 数据质量和数量
44+
45+
#### ① 质量至上
46+
47+
总体趋势是质量比数量更重要—即最好拥有一小套高质量数据,而非一大套低质量数据。质量的关键原则包括一致的标注、无错误、未标记的数据、噪声输入/输出以及与总体相比具有代表性分布。
48+
49+
微调时,[LIMA数据集](https://arxiv.org/abs/2305.11206)中的几千个精心挑选的例子比5万个机器生成的Alpaca数据集表现更好。[OpenAI微调文档](https://platform.openai.com/docs/guides/fine-tuning/common-use-cases)建议,即使是50到100个样例的数据集也可能有所作为。
50+
51+
#### ② 较难的语言任务需要更多数据
52+
53+
相对较难的任务,如文本生成和摘要,比简单的任务如分类和实体提取更难微调,且需要更多的数据。“较难”可指多种情况:输出中的更多标记、所需的人类能力等级更高、多个正确答案。
54+
55+
#### ③ 高效高质量数据收集
56+
57+
由于数据收集昂贵,建议以下策略以提高样本效率和降低成本:
58+
59+
- 观察失败模式:观察先前ML能力失败的例子,并添加针对这些失败模式的例子
60+
- 人机协作:这是一种更便宜的方式扩展数据标注。我们使用LLM自动化生成基础响应,人类标注者可以用来在更短时间内完成标注
61+
62+
### 3.2 数据多样性
63+
64+
简单来说,如果你过度训练模型以产生某种特定类型的响应,则即使这不是最合适的答案,模型也会偏向于给出那种响应。这里的经验法则是尽可能确保训练数据反映模型在现实世界中的行为方式。
65+
66+
- **重复:** 这已经被发现[是模型退化的根源](https://aclanthology.org/2022.acl-long.577.pdf),无论是微调还是预训练。通过去重实现的多样性往往能改善性能指标。
67+
- **输入的多样性:** 通过改写输入来实现多样性。在[微调SQLCoder2](https://defog.ai/blog/sqlcoder2-technical-details/)时,团队重新表述了伴随SQL查询的纯文本,以引入语法和语义多样性。类似地,[指令回译](https://arxiv.org/abs/2308.06259)已被用于人类编写文本,通过问LLM“这可能是对什么问题的回答?”来生成问答数据集。
68+
- **数据集的多样性:** 当微调更一般的下游任务——例如多语言适应——时,使用多样化的数据集已被证明可以改善模型遗忘原始能力与学习新能力之间的学习-遗忘权衡。为不同语言如[印地语](https://www.sarvam.ai/blog/announcing-openhathi-series)[奥迪亚语](https://arxiv.org/pdf/2312.12624.pdf)微调的模型使用了丰富的语言特定数据集与其他指令微调数据集,如[FLAN](https://github.com/google-research/FLAN)[Alpaca](https://github.com/tatsu-lab/stanford_alpaca)、Dolly等,以增加多样性。
69+
- **标准化输出:** 从输出中移除空格和其他格式花招已被证明是有帮助的。[SQLCoder2](https://defog.ai/blog/sqlcoder2-technical-details/)从生成的SQL中移除空格,让模型专注于学习重要的SQL概念,而不是像空格和缩进这样的花招。如果你希望回答中有特定的语气,“帮助台聊天机器人是...”,那么在每个例子中都加入这些内容。
70+
71+
## 4 基于LLM的数据管道
72+
73+
为了策划高质量多样化的数据集,数据管道经常使用LLM来减少标注成本。实践中观察到的技术:
74+
75+
- **评估:** 使用高质量数据集训练模型并利用它来标注你较大的数据集,以过滤出高质量的例子
76+
- **生成:** 用高质量的例子种子LLM并提示其生成类似的高质量例子。[合成数据最佳实践](https://arxiv.org/html/2404.07503v1)正在形成中
77+
- **人机协作:** 使用LLM生成一组初始输出,并用人来通过编辑或选择偏好来提高质量
78+
79+
## 5 调试你的数据集
80+
81+
- **评估你的数据集中的不良输出:** 如果模型在某些方面仍然表现不佳,添加直接展示给模型如何正确处理这些方面的训练例子。如果你的模型有语法、逻辑或风格问题,检查你的数据是否有同样的问题。例如,如果模型现在说“我会为你安排这次会议”(当它不应该这样做时),看看现有例子是否教会了模型说它可以做它不能做的事情。
82+
- **审视正负类平衡:** 如果数据中有60%的助手回应说“我无法回答这个问题”,但在推理阶段只有5%的回应应该这么说,那么你可能会得到过多的拒绝回应。
83+
- **详尽性和一致性:** 确保你的训练例子包含所有需要的回应信息。如果我们希望模型根据用户的个人特质赞美用户,并且训练例子中包含了对前面对话中没有提到的特质的助手赞美的例子,模型可能会学会虚构信息。确保所有的训练例子都是以预期的格式呈现,以便推理。查看训练例子中的一致性。如果多人创建了训练数据,那么模型的表现很可能受到人们之间一致性的限制。例如,在文本抽取任务中,如果人们只在70%的抽取片段上达成一致,模型很可能也无法做得更好。
84+
85+
## 6 结论
86+
87+
微调是LLMs开发的重要组成部分,需要在资源限制下取得微妙的权衡!
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# 改进大语言模型的方法
2+
3+
这是一篇关于适应开源大语言模型(LLMs)的三部系列博客的第一篇。本文探讨将LLM适应领域数据的各种方法。
4+
5+
- 第二部分讨论如何确定微调(fine-tuning)是否适合您的用例。
6+
- 第三部分探讨策划良好训练数据集的一些经验法则。
7+
8+
## 0 引言
9+
10+
大语言模型(LLMs)在多种语言任务和自然语言处理(NLP)[基准测试](https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard)中展示了出色的能力。基于这些“通用”模型的产品应用正在增加。本文为小型AI产品团队提供指导,帮助他们将LLM适应并整合到他们的项目中。首先,澄清围绕LLM的(常常令人困惑的)术语,然后简要比较现有的不同适应方法,最后推荐一个逐步流程图,助你识别适合你的用例的方法。
11+
12+
## 1 适应LLM的方法
13+
14+
### 1.1 预训练
15+
16+
预训练是从头开始。
17+
18+
使用数万亿数据tokens训练LLM的过程。该模型使用自监督(self-supervised)算法进行训练。最常见的训练方式是通过自回归预测下一个token(又称因果语言建模)。预训练通常需要数千小时的GPU(105 – 107 [[source1](https://research.nvidia.com/publication/2023-10_chipnemo-domain-adapted-llms-chip-design)[source2](https://arxiv.org/abs/2307.09288)]),并且分布在多个GPU上。预训练输出的模型被称为[基础模型](https://blogs.nvidia.com/blog/what-are-foundation-models/)
19+
20+
### 1.2 持续预训练
21+
22+
持续预训练(又称第二阶段预训练)涉及使用新的、未见过的领域数据对基础模型进行进一步训练。使用与初始预训练相同的自监督算法。通常所有模型权重都会参与其中,并且会将一部分原始数据与新数据混合进行训练。
23+
24+
### 1.3 微调(fine-tuning)
25+
26+
微调是使用带有注释的数据集以监督方式或使用基于强化学习的技术来适应预训练语言模型的过程。与预训练的主要区别:
27+
28+
- 使用带有正确标签/答案/偏好的带注释数据集进行监督训练,而不是自监督训练
29+
- 所需tokens数量较少(成千上万或数百万,而预训练需要数十亿或数万亿),主要目的是增强如指令跟随、人类对齐、任务执行等能力
30+
31+
理解微调的当前格局可以从两个维度进行:改变的参数百分比以及微调结果带来的新功能。
32+
33+
### 1.4 改变的参数百分比
34+
35+
根据改变的参数数量,微调分为:
36+
37+
- **全量微调**:顾名思义,它涵盖了模型的所有参数,包括像 XLMR 和 BERT(100 – 300M 参数)等小型模型上的传统微调,以及像[Llama 2](https://ai.meta.com/blog/llama-2/)、GPT3(1B+ 参数)等大型模型上的微调
38+
- **参数高效微调(PEFT)**:与微调所有LLM权重不同,PEFT算法只微调少量附加参数或更新预训练参数的子集,通常为1 – 6%的总参数
39+
40+
### 1.5 为基础模型添加的功能
41+
42+
微调的目的是为预训练模型添加功能,例如指令跟随、人类对齐等。[Chat-tuned Llama 2](https://arxiv.org/abs/2307.09288)是一个通过微调添加了指令跟随和对齐能力的模型示例。
43+
44+
### 1.6 检索增强生成(RAG)
45+
46+
企业也可以通过添加特定领域的知识库来适应LLM。RAG本质上是“基于搜索的LLM文本生成”。RAG使用一个根据用户问题检索到的动态提示上下文,并将其注入LLM提示中,从而引导其使用检索到的内容,而不是其预训练的(可能过时的)知识。[Chat LangChain](https://chat.langchain.com/)是一个基于RAG的LangChain文档问答聊天机器人。
47+
48+
### 1.7 上下文学习(ICL)
49+
50+
在ICL中,通过在提示中放置示例来适应LLM。研究表明,通过示例进行演示是有效的。示例可以包含不同种类的信息:
51+
52+
- 仅输入和输出文本——即少样本学习
53+
- 推理轨迹:添加中间推理步骤;参见[链式推理](https://arxiv.org/abs/2201.11903)(CoT)提示
54+
- 规划和反思轨迹:添加教LLM规划和反思其问题解决策略的信息;参见[ReACT](https://arxiv.org/abs/2210.03629)
55+
56+
还有多种修改提示的策略,[提示工程指南](https://www.promptingguide.ai/)中提供了详细的概述。
57+
58+
## 2 选择正确的适应方法
59+
60+
为了确定上述方法中的哪一种适合特定应用,应考虑各种因素:所需的模型能力、训练成本、推理成本、数据集类型等。以下流程图总结了如何选择合适的LLM适应方法:
61+
62+
![](https://my-img.javaedge.com.cn/javaedge-blog/2024/09/b5d6af3fdbf4f9d505f512b22b5196c6.png)
63+
64+
## 3 总结
65+
66+
创建基于LLM的系统是一个迭代过程。建议从简单的方法开始,并逐步增加复杂性,直到实现目标。上面的流程图为你的LLM适应策略提供了坚实的基础。

0 commit comments

Comments
 (0)