deeplearning.ai吴恩达大模型微调课程笔记

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

以下是关于大模型微调课程(https://learn.deeplearning.ai/finetuning-large-language-models/lesson/1/introduction)的总结。

微调

为什么要微调LLMs?

微调是重要的,因为它允许我们将通用型模型(例如GPT-3)专门用于特定任务或领域。可以将其类比为将全科医生变成心脏病医生或皮肤科医生。微调使我们能够向模型提供更多数据,使其能够学习和适应特定用例或领域。

以下是为什么微调很重要的原因:

  1. 学习新信息: 微调允许模型从额外的数据中学习,增强其知识和专业知识。
  2. 一致性: 它有助于模型提供更一致和上下文相关的输出。
  3. 减少幻觉: 微调可以减少模型生成不正确或虚构信息的情况。
  4. 定制: 微调将模型定制为特定用例,使其对代码生成、客户支持或特定领域的内容非常相关。

比较微调和提示工程

提示工程涉及制定查询或提示,以指导模型的响应。虽然这是一种有用的技术,但它也有局限性:

  • 提示的优点: 无需额外数据,前期成本低,无需技术专业知识。
  • 提示的缺点: 数据容量有限,可能导致不正确的响应,难以处理更大的数据集。

另一方面,微调是提示的补充,并提供了多种优势:

  • 微调的优点: 可以处理几乎无限量的数据,能够纠正先前学到的不正确信息,适用于企业和特定领域的用例。
  • 微调的缺点: 需要更多高质量的数据,涉及前期计算成本,需要一些技术知识。

总之,提示适用于快速和通用的用例,而微调则适用于专业化、企业级的应用,其中精度和一致性至关重要。

微调自己的LLM的好处

微调自己的LLM提供了许多好处:

  1. 性能改进: 微调的模型更擅长避免不准确和在特定领域内保持一致性。
  2. 隐私: 在我们自己的环境中进行微调可以增强数据安全性并防止数据泄露。
  3. 成本控制: 微调可以降低每个请求的成本,优化可用性并减少特定应用程序的延迟。
  4. 审查: 我们可以实施自定义规则和审查以指导模型的行为。

预训练

  • 预训练是微调之前的第一步,在这一步骤中,模型从完全随机的状态开始,没有关于世界的知识。

  • 预训练的学习目标通常是下一个标记的预测,或者更简单地说,就是预测下一个词语。

  • 在预训练期间,模型通过阅读大量的未标记数据,通常是从互联网上抓取的数据,来学习语言和知识。

  • 这个过程通常被称为自监督学习,因为模型通过自己进行下一个标记的预测来进行训练。

  • 预训练是资源密集且耗时的过程,需要大量的数据和计算资源。
    请添加图片描述

微调的特点

  • 微调是在预训练之后的步骤,用于将预训练模型定制为特定任务。

  • 微调允许使用未标记数据或包含标签的数据,以适应不同的任务。

  • 与预训练相比,微调需要的数据较少,因为模型在预训练期间已经获得了大量知识。

  • 微调是将通用语言模型(LLM)转化为适用于特定应用程序的关键工具,例如聊天机器人或信息检索任务。

  • 微调的任务通常与预训练相同,即下一个标记的预测。

微调的任务

  • 微调任务通常包括文本输入和文本输出,适用于语言模型。
  • 微调任务可以分为两大类:提取和扩展。
  • 提取任务涉及将文本输入转化为更短的文本输出,例如关键词提取或路由任务。
  • 扩展任务涉及将文本输入转化为更长的文本输出,例如生成代码、编写电子邮件或回答问题。
  • 微调的成功取决于清晰定义任务、知道好的、坏的和更好的输出是什么,以及选择适当的数据格式。
    请添加图片描述

数据集

  • 预训练数据集通常包含大量的非结构化数据,从互联网上抓取而来。
  • 微调数据集通常更加结构化,与任务相关,通常包含问题-答案对或指令-响应对。
  • 结构化微调数据可以有助于任务清晰性和模型性能。

指令微调

  • 指令微调涉及使用模板来引导模型的响应,以便更好地结构化输入和输出数据。
  • 模板可以帮助模型生成适当的响应,并通常包括指示模型应该期望什么类型的问题或指令。
  • 以下为通过模版构建指令微调的数据集数据准备

数据准备

数据准备的重要性

  1. 数据质量至关重要:为微调提供高质量的数据是关键,因为低质量的数据会导致模型输出垃圾结果。确保提供优质的输入数据,以获得有意义的输出。
  2. 数据多样性:数据应具有多样性,涵盖我们用例的各个方面。如果输入和输出都相同,模型可能会记住它们,而不是生成多样性的输出。
  3. 真实数据与生成数据:尽管可以使用生成数据,但实际数据通常更有效和有用,特别是对于涉及文本创作任务的情况。生成数据具有固定的模式,而真实数据更具多样性和真实性。
  4. 数据量大:通常情况下,数据量越大越好,但预训练已经处理了一部分问题,因此数据量不如数据质量、多样性和真实性重要。

数据准备步骤

数据准备涉及以下步骤:

  1. 收集指令-响应对:首先,我们需要收集指令和相应的数据对。这可以是问题-答案对或其他形式的对话数据。
  2. 连接数据对或添加提示模板:将数据对连接在一起,或者添加提示模板,以便将其传递给模型进行微调。
  3. 对数据进行token化:将文本数据转换为数字,以便模型处理。token化不仅仅是按词汇划分,它还依赖于字符出现的频率。
  4. 添加填充或截断数据:确保数据的长度适合输入模型,这通常需要填充或截断文本。模型操作的数据必须具有相同的长度。

标记化

  • 标记化将文本转换为数字表示,这样模型可以处理它们。
  • 标记化不仅仅是按词划分,还涉及字符的编码。
  • 使用正确的标记化器与模型匹配很重要,否则模型可能无法理解数据。

数据集拆分

  • 将数据集拆分为训练集和测试集是微调的关键步骤。
  • 随机化数据集的顺序以增加模型的多样性。

代码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 
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Saber_Alpha

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值