以下是关于大模型微调课程(https://learn.deeplearning.ai/finetuning-large-language-models/lesson/1/introduction)的总结。
微调
为什么要微调LLMs?
微调是重要的,因为它允许我们将通用型模型(例如GPT-3)专门用于特定任务或领域。可以将其类比为将全科医生变成心脏病医生或皮肤科医生。微调使我们能够向模型提供更多数据,使其能够学习和适应特定用例或领域。
以下是为什么微调很重要的原因:
- 学习新信息: 微调允许模型从额外的数据中学习,增强其知识和专业知识。
- 一致性: 它有助于模型提供更一致和上下文相关的输出。
- 减少幻觉: 微调可以减少模型生成不正确或虚构信息的情况。
- 定制: 微调将模型定制为特定用例,使其对代码生成、客户支持或特定领域的内容非常相关。
比较微调和提示工程
提示工程涉及制定查询或提示,以指导模型的响应。虽然这是一种有用的技术,但它也有局限性:
- 提示的优点: 无需额外数据,前期成本低,无需技术专业知识。
- 提示的缺点: 数据容量有限,可能导致不正确的响应,难以处理更大的数据集。
另一方面,微调是提示的补充,并提供了多种优势:
- 微调的优点: 可以处理几乎无限量的数据,能够纠正先前学到的不正确信息,适用于企业和特定领域的用例。
- 微调的缺点: 需要更多高质量的数据,涉及前期计算成本,需要一些技术知识。
总之,提示适用于快速和通用的用例,而微调则适用于专业化、企业级的应用,其中精度和一致性至关重要。
微调自己的LLM的好处
微调自己的LLM提供了许多好处:
- 性能改进: 微调的模型更擅长避免不准确和在特定领域内保持一致性。
- 隐私: 在我们自己的环境中进行微调可以增强数据安全性并防止数据泄露。
- 成本控制: 微调可以降低每个请求的成本,优化可用性并减少特定应用程序的延迟。
- 审查: 我们可以实施自定义规则和审查以指导模型的行为。
预训练
-
预训练是微调之前的第一步,在这一步骤中,模型从完全随机的状态开始,没有关于世界的知识。
-
预训练的学习目标通常是下一个标记的预测,或者更简单地说,就是预测下一个词语。
-
在预训练期间,模型通过阅读大量的未标记数据,通常是从互联网上抓取的数据,来学习语言和知识。
-
这个过程通常被称为自监督学习,因为模型通过自己进行下一个标记的预测来进行训练。
-
预训练是资源密集且耗时的过程,需要大量的数据和计算资源。

微调的特点
-
微调是在预训练之后的步骤,用于将预训练模型定制为特定任务。
-
微调允许使用未标记数据或包含标签的数据,以适应不同的任务。
-
与预训练相比,微调需要的数据较少,因为模型在预训练期间已经获得了大量知识。
-
微调是将通用语言模型(LLM)转化为适用于特定应用程序的关键工具,例如聊天机器人或信息检索任务。
-
微调的任务通常与预训练相同,即下一个标记的预测。
微调的任务
- 微调任务通常包括文本输入和文本输出,适用于语言模型。
- 微调任务可以分为两大类:提取和扩展。
- 提取任务涉及将文本输入转化为更短的文本输出,例如关键词提取或路由任务。
- 扩展任务涉及将文本输入转化为更长的文本输出,例如生成代码、编写电子邮件或回答问题。
- 微调的成功取决于清晰定义任务、知道好的、坏的和更好的输出是什么,以及选择适当的数据格式。

数据集
- 预训练数据集通常包含大量的非结构化数据,从互联网上抓取而来。
- 微调数据集通常更加结构化,与任务相关,通常包含问题-答案对或指令-响应对。
- 结构化微调数据可以有助于任务清晰性和模型性能。
指令微调
- 指令微调涉及使用模板来引导模型的响应,以便更好地结构化输入和输出数据。
- 模板可以帮助模型生成适当的响应,并通常包括指示模型应该期望什么类型的问题或指令。
- 以下为通过模版构建指令微调的数据集数据准备
数据准备
数据准备的重要性
- 数据质量至关重要:为微调提供高质量的数据是关键,因为低质量的数据会导致模型输出垃圾结果。确保提供优质的输入数据,以获得有意义的输出。
- 数据多样性:数据应具有多样性,涵盖我们用例的各个方面。如果输入和输出都相同,模型可能会记住它们,而不是生成多样性的输出。
- 真实数据与生成数据:尽管可以使用生成数据,但实际数据通常更有效和有用,特别是对于涉及文本创作任务的情况。生成数据具有固定的模式,而真实数据更具多样性和真实性。
- 数据量大:通常情况下,数据量越大越好,但预训练已经处理了一部分问题,因此数据量不如数据质量、多样性和真实性重要。
数据准备步骤
数据准备涉及以下步骤:
- 收集指令-响应对:首先,我们需要收集指令和相应的数据对。这可以是问题-答案对或其他形式的对话数据。
- 连接数据对或添加提示模板:将数据对连接在一起,或者添加提示模板,以便将其传递给模型进行微调。
- 对数据进行token化:将文本数据转换为数字,以便模型处理。token化不仅仅是按词汇划分,它还依赖于字符出现的频率。
- 添加填充或截断数据:确保数据的长度适合输入模型,这通常需要填充或截断文本。模型操作的数据必须具有相同的长度。
标记化
- 标记化将文本转换为数字表示,这样模型可以处理它们。
- 标记化不仅仅是按词划分,还涉及字符的编码。
- 使用正确的标记化器与模型匹配很重要,否则模型可能无法理解数据。
数据集拆分
- 将数据集拆分为训练集和测试集是微调的关键步骤。
- 随机化数据集的顺序以增加模型的多样性。
代码1
import pandas as pd
import datasets
from pprint import pprint
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("EleutherAI/pythia-70m")
# 数据集读取与制作
filename = "lamini_docs.jsonl"
instruction_dataset_df = pd.read_json(filename, lines=True)
examples = instruction_dataset_df.to_dict()
if "question" in examples and "answer" in examples:
text = examples["question"][0] + examples["answer"][0]
elif "instruction" in examples and "response" in examples:
text = examples["instruction"][0] + examples["response"][0]
elif "input" in examples and "output" in examples:
text = examples["input"][0] + examples["output"][0]
else:
text = examples["text"][0]
prompt_template

本文是大模型微调课程总结,介绍了微调的原因、与提示工程的比较及好处,阐述了预训练和微调的特点、任务,强调数据准备的重要性及步骤。还说明了训练语言模型的过程、超参数,以及模型训练后的评估与分析方法,最后提及微调和高级训练方法。
最低0.47元/天 解锁文章
1057





