在这篇文章中,我将向大家展示如何将预训练的大语言模型(LLM)打造成强大的文本分类器。

但为什么要专注于分类任务呢?首先,将预训练模型微调为分类器,是学习模型微调的一个简单且有效的入门方式。其次,在现实生活和商业场景中,许多挑战都围绕文本分类展开,比如垃圾邮件检测、情感分析、客户反馈分类、主题标注等。

大神 Sebastian 的高效微调大语言模型实战指南!_数据集

将 GPT 模型转变为文本分类器

我的新书发布!

我非常激动地宣布,我的新书《Build a Large Language Model From Scratch》已经由 Manning 出版社正式发布,中文版也很快要跟大家见面(预计2月底)

大神 Sebastian 的高效微调大语言模型实战指南!_自然语言处理_02

在我的经验中,理解一个概念最深刻的方式就是从零开始构建它。这本书耗时近两年打磨,在书中我将带着你从头开始构建一个类似 GPT 的大语言模型,包括实现数据输入以及使用指令数据进行微调。我的目标是,在读完这本书之后,你能够深入、全面地了解 LLM 的工作原理。

大神 Sebastian 的高效微调大语言模型实战指南!_人工智能_03

本文主要内容

为了庆祝新书发布,我将分享书中一个章节的节选,带你一步步完成如何微调预训练 LLM,使其成为一个垃圾邮件分类器。

重要提示

书中关于分类任务微调的章节共有 35 页,内容较多,不适合一次性在文章中全部呈现。因此,本篇文章将聚焦于其中约 10 页的核心内容,帮助你了解分类微调的背景和核心概念。

此外,我还会分享一些书中未涉及的其他实验见解,并解答读者可能提出的常见问题。(需要注意的是,以下节选基于我的个人草稿,尚未经过 Manning 的专业编辑或最终设计。)

文章完整代码可以在https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb 中找到。

7 个关于训练 LLM 分类器的常见问题
  1. 我们需要训练所有层吗?
  2. 为什么选择微调最后一个 token,而不是第一个?
  3. BERT 和 GPT 在性能上有何区别?
  4. 我们是否应该禁用因果掩码(causal mask)?
  5. 增大模型规模会带来什么影响?
  6. 使用 LoRA(低秩适配)能带来哪些改进?
  7. 是否需要填充(padding)?

祝阅读愉快!

微调的不同类型

微调语言模型最常见的方式包括指令微调(instruction finetuning)分类微调(classification finetuning)

指令微调的核心是通过一组任务对语言模型进行训练,并使用具体的指令来提升模型理解和执行自然语言提示中任务的能力。下图(图 1)展示了这一过程的基本原理。

大神 Sebastian 的高效微调大语言模型实战指南!_数据集_04

图 1:两种不同指令微调场景的说明。上方的模型任务是判断给定文本是否为垃圾邮件,下方的模型则被赋予将英文句子翻译成德语的指令。

下一章将讨论图 1 中所示的指令微调内容。而本章则聚焦于分类微调,这个概念如果你有机器学习的背景,可能已经有所了解。

在分类微调中,模型被训练来识别一组特定的类别标签,例如“垃圾邮件”和“非垃圾邮件”。分类任务不仅限于大语言模型和电子邮件过滤,还包括从图像中识别不同植物种类、将新闻文章分类为体育、政治或科技等主题,以及在医学影像中区分良性和恶性肿瘤等。

重点在于,经过分类微调的模型只能预测它在训练中遇到过的类别。例如,它可以判断某件事物是否是“垃圾邮件”或“非垃圾邮件”,如图 2 所示,但除此之外无法对输入文本作出其他判断。

大神 Sebastian 的高效微调大语言模型实战指南!_垃圾邮件_05

图 2:使用 LLM 进行文本分类场景的说明。一个针对垃圾邮件分类微调的模型不需要额外的指令来处理输入。然而,与指令微调模型相比,它只能给出“垃圾邮件”和“非垃圾邮件”的回应。

与图 2 所示的分类微调模型相比,指令微调模型通常能够承担更广泛的任务。我们可以将分类微调模型看作是高度专业化的模型,而开发一个能很好地处理多种任务的通用模型通常比开发一个专门模型更具挑战性。

选择合适的方法

指令微调提高了模型根据用户特定指令理解和生成回应的能力。它更适合需要根据复杂用户指令处理各种任务的模型,从而提高模型的灵活性和交互质量。而分类微调则适用于需要将数据精确分类为预定义类别的项目,例如情感分析或垃圾邮件检测。

尽管指令微调用途更广,但它需要更大的数据集和更多的计算资源来开发擅长多种任务的模型。而分类微调则需要较少的数据和计算资源,但其用途仅限于模型训练时涉及的特定类别。

使用预训练权重初始化模型

由于这是一个节选,我们将跳过数据准备和模型初始化的部分,这些内容已经在前几章中进行了实施和预训练。根据我的经验,与纸质书相比,阅读较长的数字文章时保持专注可能会更具挑战性。因此,我会尽量让这部分节选内容紧紧围绕本章的关键要点。

为了给这部分节选提供一些背景信息,这段内容主要聚焦于将一个通用的预训练大语言模型转变为专门用于分类任务的模型所需的修改,如图 3 所示。

大神 Sebastian 的高效微调大语言模型实战指南!_语言模型_06

图 3:在这部分节选中,我们跳过步骤 1-5,直接进入第 6 步(从下一节开始)。

但在进行图 3 中提到的 LLM 修改之前,我们先简要了解一下我们正在使用的预训练 LLM。

为了简化讨论,我们假设已经设置好加载模型的代码,流程如下:

model = GPTModel(BASE_CONFIG)
load_weights_into_