大型语言模型 (Large Language Models, LLMs) 的发展日新月异。从最初的简单对话系统,到如今能够执行文本生成、语言翻译和代码编写等复杂任务的先进模型,LLM 技术实现了跨越式的进步。

然而这些模型的规模和计算需求也呈指数级增长。它们需要大量的计算资源、专用硬件设施以及可观的能源消耗。对于学术界和工业界中的大多数研究者和开发者而言,尤其是不在大型科技公司的从业者,LLM 模型的庞大规模构成了实际应用的重大挑战。

知识蒸馏 (Knowledge Distillation) 技术应运而生。其核心思想类似于专业技能的传承过程:不是要求学习者直接复制全部细节,而是着重于掌握关键技能和核心方法。在 LLM 领域,知识蒸馏的目标是将大型模型(教师模型)的知识和能力转移到更小、更易管理的模型(学生模型)中。传统知识蒸馏方法虽已存在多年,但在转移过程中往往会损失部分关键能力,导致精简后的模型在推理能力等方面表现欠佳。

Google Research 团队发表的论文《Distilling Step-by-Step!》提出了一种创新的知识蒸馏方法,不仅能有效减小模型规模,还能使学生模型在某些任务上超越其教师模型。这种方法引起了机器学习领域研究者的广泛关注,同时也引发了一些质疑:这种方法的效果是否可靠?我们是否真的能构建更小且更智能的模型?

"Step-by-Step Distillation" 方法的核心创新在于其对推理过程的重视。该方法不再将 LLM 视为简单的输入输出映射器,而是着重提取其解决问题的思维链 (Chain-of-Thought)。这就像在数学教学中,不仅要求学生得到正确答案,更要理解完整的解题步骤。通过提取这种推理过程,该方法为学生模型提供了更深层次的学习指导。

本文将深入剖析 "Step-by-Step Distillation" 方法的技术原理,通过数学推导理解其内在机制,并使用 Python 实现一个简化版本。我们将探讨这种方法的工作原理、成功要素以及潜在局限性。

大型模型的瓶颈:为什么需要知识蒸馏?

大型语言模型的规模是其强大能力的根本来源。 庞大的参数数量使它们能够完成各种复杂的任务。 这种规模也带来了一些瓶颈, 特别是在实际应用中。 这就像拥有一辆一级方程式赛车,虽然性能出色,但并不适合日常通勤。

运行这些大型模型需要大量的计算能力, 通常需要专门的硬件、大量的 GPU 以及高昂的电费。 这对基础设施提出了挑战, 并且成本高昂。 对于资源有限的小公司、研究人员,或者需要在手机或嵌入式系统等边缘设备上运行这些模型的情况,计算需求是一个巨大的障碍。

除了前期成本之外,延迟(模型生成响应所需的时间)也是一个关键因素。 大型模型虽然功能强大,但由于每次推理都涉及大量的计算,因此速度可能会较慢。 对于速度至关重要的实时应用程序,这种延迟是不可接受的。

LLM 知识蒸馏旨在解决这些问题。 知识蒸馏的本质是知识转移, 其目标是将大型、强大的 LLM(教师模型)的基本知识和能力提炼成更小、更高效的学生模型。 这类似于创建一种浓缩提取物, 通过仔细的过程缩小尺寸,同时保留甚至增强其关键品质。

知识蒸馏背后的核心动机是创建可以与大型模型相媲美,但计算成本显著降低且推理时间更快的较小模型。 这使得强大的 AI 更易于访问、更易于部署,并且更可持续。 能够在手机、智能家居设备或资源受限的应用程序中运行复杂的语言模型将极大地扩展 AI 的应用范围。

传统的知识蒸馏技术已经存在一段时间。 诸如知识蒸馏之类的方法,通常使用来自教师的“软标签”或试图模仿中间表示,已经显示出一些成功。 这些方法通常旨在训练学生复制教师的输出行为。 虽然这些方法确实可以缩小模型并提高效率,但它们通常会损失一些关键要素和智能。 这类似于复印一件杰作,虽然得到了一份副本,但细微的差别、深度和原始的活力通常会在翻译中丢失。 当涉及到捕捉 LLM 的复杂推理能力时,传统的知识蒸馏方法有时会失败。 它们教学生模仿答案,而没有真正理解其背后的推理。

“Distilling Step-by-Step” 提供了一种潜在的解决方案。 它不仅仅是使模型更小,而是通过专注于知识蒸馏推理过程,使它们更小更智能。

Distilling Step-by-Step 方法

“Distilling Step-by-Step” 核心创新在于视角上的根本转变。 这种方法不仅仅将大型语言模型视为输出答案的黑匣子,而是认识并利用 LLM 的推理能力。

这就像从简单地向老师索要答案,转变为要求他们展示解题步骤,解释他们的思考过程。 这些“思考过程”(通过思维链 (CoT) 等提示技术引出)在指导较小的模型更有效地学习方面非常有价值。 如果你正在学习下棋,仅仅记住获胜的步骤可能效果有限,但理解这些步骤背后的战略原因,理解象棋的基本原则,会让你成为一个更适应性更强、更优秀的棋手。“Distilling Step-by-Step” 试图将这种更深刻的理解,这种战略推理,传授给较小的学生模型。

该过程分为两个截然不同但又相互关联的阶段。

首先是推理过程提取阶段(Rationale Extraction Phase)。 在此阶段,使用思维链推理提示技术“采访”大型 LLM。 这种技术旨在引出 LLM 的一步一步的推理过程。 我们不仅仅问“答案是什么?”,而是问“你是如何得出这个答案的?你能一步一步地解释你的想法吗?”。 该研究论文利用了“少样本 (few-shot)” 思维链推理提示,这意味着向 LLM 提供一些输入-推理过程-标签三元组的示例来指导其生成。 这类似于在要求 LLM 解决一个新问题并解释其方法之前,向 LLM 展示一些已解决的示例。

例如,考虑一个简单的问题:“如果一列火车以 60 英里/小时的速度行驶 2 小时,它行驶了多远?”。 传统的 LLM 提示可能只会要求提供答案。 但是通过思维链推理提示,鼓励它生成中间推理步骤:“速度 = 60 英里/小时,时间 = 2 小时。距离 = 速度 x 时间。距离 = 60 英里/小时 x 2 小时 = 120 英里。” 输出不仅仅是“120 英里”,还有推理过程:“距离 = 速度 x 时间”和计算步骤。 这些推理过程是 LLM 推理的自然语言解释。

此阶段的输出是一个有价值的数据集。 对于每个输入,不仅有 LLM 预测的标签(答案),而且还有证明该标签合理的自然语言推理过程。 这类似于创建一个丰富的数据集,其中每个示例不仅仅是输入-输出,而是输入-推理-输出。

接下来是 多任务训练阶段(Multi-Task Training Phase)。 在此阶段,使用刚刚创建的数据集来训练较小的学生模型。 “多任务”体现在我们不仅仅训练学生预测最终标签,而是训练它同时做两件事:预测标签并生成推理过程。

这类似于教象棋学徒不仅要走获胜的步骤,还要解释为什么每个步骤在战略上都是合理的。 我们不仅仅要求学生模仿老师的答案,而是要理解和复制老师的推理过程。 该论文将此定义为一个多任务学习问题。 训练学生模型以最小化两个损失函数:一个用于标签预测准确性,另一个用于推理过程生成。 这两个任务都被赋予权重,促使学生学习“什么”(答案)和“为什么”(推理)。

研究人员使用了一种称为“任务前缀”的技巧。 在训练期间,当目标是标签时,他们在输入前加上“[label]”,当目标是推理过程时,他们在输入前加上“[rationale]”。 这明确地告诉学生:“对于这个输入,我希望你专注于预测标签”,然后,“对于这个输入,我希望你专注于生成推理”。 这有助于模型解开这两个任务,并学习有效地执行它们。

这种方法可能比传统的知识蒸馏甚至标准的微调更有效。 传统方法通常侧重于模仿教师的表面行为(输出)。 “Distilling Step-by-Step” 旨在捕捉更深层次的东西:潜在的推理过程。 通过强制较小的模型生成推理过程,我们实际上是在鼓励它学习对任务的更抽象、更可概括的理解。 它不仅仅是记住输入-输出对, 而是学习将输入连接到输出的原则。

这种对推理的关注是关键的区别因素,也是潜在数据效率提升的来源。 通过学习生成推理过程,较小的模型可能能够从更少的示例中更好地概括,并且可能在某些情况下超过教师 LLM 的性能。

Distilling Step-by-Step 背后的数学原理

本节将介绍 “Distilling Step-by-Step” 背后的数学机制。 我们将逐一分解公式,并探讨它们的含义、优势和潜在局限性。

使用思维链 (CoT) 提示提取推理过程

思维链推理提示是一种指导大型语言模型生成过程的方法, 其核心是影响 LLM 输出的概率分布。

将 LLM 视为一个函数,给定一个输入提示 P,它会生成一个输出序列 Y。 在标准提示中,我们的目标是最大化给定提示 P 的所需输出 y(标签)的概率。 我们可以将其表示为:

生成给定提示 P 的所需输出 y 的概率

CoT 提示改变了这一目标。 希望鼓励 LLM 不仅生成最终答案 y,而且生成导致 y 的中间推理过程r。 通过制作展示这种输入-推理过程-标签结构的提示来实现这一点,正如在示例三元组中讨论的那样。

虽然没有 CoT 提示的直接公式,但可以将其视为将 LLM 的生成条件设置为特定风格的输出,即包含显式推理步骤的输出。 这促使 LLM 的内部决策过程变得更加透明和循序渐进。

CoT 的有效性在于其涌现行为。 大型语言模型在正确提示时,表现出模仿思维链过程的能力,即使它们没有经过明确的训练来以这种方式生成推理过程。

需要注意的是,CoT 提示仍然具有一定的技巧性。 制作有效的提示需要直觉和实验。 不能保证生成的推理过程总是完美的,甚至完全准确。 它们是由一个模型生成的,虽然令人印象深刻,但并非万无一失。 这些推理过程的质量会影响后续知识蒸馏过程的有效性。 如果教师的推理有缺陷,学生也可能会学到有缺陷的推理。

尽管存在这些警告,CoT 提示提供了一种强大的方式来利用 LLM 的推理能力,并提取有价值的监督信号来训练较小的模型。 此阶段的输出是一个输入-推理过程-标签三元组 (xi , r ^i , y ^ i ) 的数据集,可用于下一阶段:多任务学习。

多任务学习目标

本节将介绍 “Distilling Step-by-Step” 的数学核心。 我们将从提取推理过程转变为在多任务学习框架中利用它们。 核心思想是训练学生模型同时执行两项任务:标签预测和推理过程生成。 这是通过组合损失函数来实现的。

标签预测损失

第一个任务是标签预测。 我们希望学生模型 f 能够准确地预测给定输入 x_i 的正确标签 y ^ i 。 为了衡量其表现,我们使用标准的交叉熵损失,表示为 L_label 。 对于 N 个示例的数据集,标签预测损失计算如下:

其中,ℓ( f(x_i) , y^i) 表示学生模型预测的标签概率分布 f(xi ) 与目标标签 y ^ i 之间的交叉熵损失。 当模型预测的概率偏离正确标签时,此损失函数会惩罚模型。 交叉熵损失是分类任务中一个完善的损失函数, 能够有效地引导模型做出准确的预测。 然而,交叉熵损失主要侧重于标签准确性,并不直接鼓励模型学习推理或生成解释。

推理过程生成损失

为了鼓励学生模型学习推理,我们引入了第二个任务:推理过程生成。 我们希望模型不仅预测标签,而且为输入 x_i 生成一个合理的推理过程 r ^i 。 同样使用交叉熵损失,但这次应用于推理过程中的标记序列:

推理过程交叉熵损失公式

其中,ℓ( f(xi ) , r ^i ) 是在标记序列上计算的交叉熵损失。 学生模型不仅会因不正确的标签而受到惩罚,还会因生成与教师生成的基本原理 r ^i 不同的推理过程而受到惩罚。 此损失函数直接鼓励模型学习为其预测生成人类可读的解释, 从而将教师 LLM 的“推理风格”注入到较小的学生中。 此损失函数基于模仿,要求学生模仿教师的推理过程,这可能并不总是最佳或最有效的推理形式。 学生模型可能存在其他替代方法,甚至更好的方法来得出正确的答案,但是此损失函数会使其偏向于复制教师的推理过程。

组合多任务损失:LL

为了训练学生模型同时执行这两项任务,我们将这两个损失函数组合成一个单一的联合损失函数:

组合损失函数

这是一个简单而优雅的组合。 我们将标签预测损失和推理过程生成损失相加,并乘以一个因子 λ。 在研究论文中,通常将 λ 设置为 1,从而使这两项任务同等重要。 加权因子 λ 使我们能够调整推理过程生成与标签预测的相对重要性。 如果我们想优先考虑标签准确性,可以减小 λ。 相反如果想强调学习推理和生成解释,可以增加 λ。 在实践中,将 λ 设置为 1 通常可以达到很好的平衡。

此组合损失函数驱动 “Distilling Step-by-Step” 中的多任务学习过程。 通过最小化此联合损失,可以激励学生模型精通预测标签和生成推理过程。 这是一种巧妙的方式,可以利用教师生成的基本原理中包含的丰富信息来指导较小、更高效且可能更具洞察力的学生模型的训练。

在 Python 中构建 Distilling Step-by-Step

本节将介绍如何使用 Python 代码实现 “Distilling Step-by-Step” 方法。 我们将参考 Google 研究人员发布的原始 GitHub 存储库

1、数据加载和预处理:

data_utils.py

首先需要一种加载数据的方法,将使用该方法来知识蒸馏我们的学生模型。 以下是

data_utils.py

文件的功能:

  • 从各种来源加载数据集: 无论是使用 Hugging Face load_dataset 方法还是从自定义 JSON 文件加载,DatasetLoader 基类(及其子类)都会对其进行管理。
  • 准备输入和目标: 例如,CQADatasetLoader 从问题及其多项选择答案构建一个组合输入字符串。 它还会删除不必要的列,以便下游训练仅看到重要的内容。
  • 集成 LLM 输出: 想要使用来自 LLM 的外部推理过程和标签吗? 加载器可以从 JSON 文件(用于 PaLM 或 GPT 预测)中读取这些内容,并将它们解析为结构化列。

以下是

DatasetLoader

类的代码:

 classDatasetLoader(object):
     def__init__(self, dataset_name, source_dataset_name, dataset_version, has_valid, split_map,
                  batch_size, train_batch_idxs, test_batch_idxs, valid_batch_idxs=None):
         self.data_root=DATASET_ROOT
         self.dataset_name=dataset_name
         self.source_dataset_name=source_dataset_name
         self.dataset_version=dataset_version
         self.has_valid=has_valid
         self.split_map=split_map
         # (Additional setup omitted for brevity…)
   
     defload_from_source(self):
         ifself.dataset_versionisNone:
             datasets=load_dataset(self.source_dataset_name)
         else:
             datasets=load_dataset(self.source_dataset_name, self.dataset_version)
         returndatasets
   
     defto_json(self, datasets):
         fork, vinself.split_map.items():
             datasets[v].to_json(f'{self.data_root}/{self.dataset_name}/{self.dataset_name}_{k}.json')
   
     # …plus methods for loading from JSON and parsing LLM/GPT outputs.

每个具体的加载器(例如

CQADatasetLoader

SVAMPDatasetLoader

等)都实现特定于数据集的逻辑。 例如,CQA 加载器的

_post_process

方法通过将问题与其答案选项组合在一起来构建输入字符串:

 defprepare_input(example):
     question=example['question']
     c_0=example['choices'][0]
     # …other choices...
     input=f'{question}\nAnswer Choices:\n(a) {c_0}\n(b) {example["choices"][1]}\n(c) {example["choices"][2]}\n(d) {example["choices"][3]}\n(e) {example["choices"][4]}'
     example['input'] =input
     example['label'] =example['answer']
     returnexample

这样管道就为多任务训练做好了准备, 模型既要学习预测答案,又要生成推理过程。

2、评估指标:

metrics.py
metrics.py

文件包含计算文本和方程预测准确性的函数。

  • 文本准确性: 简单地将解码的预测与标签进行比较。
  • 方程准确性: 评估字符串表达式(以受控方式使用 Python 的 eval)以查看计算出的答案是否匹配。

以下是方程准确性函数的代码:

 defcompute_equation_acc(preds, labels):
     preds= [eval_equation(pred) forpredinpreds]
     labels= [eval_equation(label) forlabelinlabels]
     returnnp.mean(np.array(preds) ==np.array(labels))
eval_equation

函数尝试安全地计算方程的结果:

 defeval_equation(equation):
     try:
         answer=eval(equation)
     except:
         answer=np.nan
     returnanswer

当任务不仅仅是分类,而是涉及更复杂的推理(例如数学问题解决)时,此模块至关重要。

3、多任务模型和训练器设置:

model_utils.py
model_utils.py

文件包含多任务模型和训练器的设置。 该管道通过使用任务前缀来区分预测(回答)和解释(生成推理过程)来支持多任务训练。 该代码使用一些 HuggingFace 类作为父类,并在其之上进行扩展。

自定义数据整理器

TaskPrefixDataCollator

采用一批示例,并将其拆分为两个字典:

  • 一个用于主要预测任务。
  • 一个用于解释(辅助)任务。
 classTaskPrefixDataCollator(DataCollatorForSeq2Seq):
     def__call__(self, features, return_tensors=None):
         features_df=pd.DataFrame(features)
         pred_features=features_df.loc[:, ~features_df.columns.isin(['aux_labels', 'expl_input_ids', 'expl_attention_mask'])].to_dict('records')
         expl_features=features_df.loc[:, ~features_df.columns.isin(['labels', 'input_ids', 'attention_mask'])].rename(
             columns={'aux_labels': 'labels', 'expl_input_ids': 'input_ids', 'expl_attention_mask': 'attention_mask'}).to_dict('records')
         pred_features=super().__call__(pred_features, return_tensors)
         expl_features=super().__call__(expl_features, return_tensors)
         return {
             'pred': pred_features,
             'expl': expl_features,
         }

自定义训练器

TaskPrefixTrainer

通过覆盖

compute_loss

方法来扩展 Hugging Face 的

Seq2SeqTrainer

。 这允许我们使用加权和(由参数

alpha

控制)来组合来自主要预测任务和辅助解释生成任务的损失:

 classTaskPrefixTrainer(Seq2SeqTrainer):
     def__init__(self, alpha, output_rationale, **kwargs):
         super().__init__(**kwargs)
         self.alpha=alpha
         self.output_rationale=output_rationale
   
     defcompute_loss(self, model, inputs, return_outputs=False):
         pred_outputs=model(**inputs['pred'])
         expl_outputs=model(**inputs['expl'])
         loss=self.alpha*pred_outputs.loss+ (1.-self.alpha) *expl_outputs.loss
         return (loss, {'pred': pred_outputs, 'expl': expl_outputs}) ifreturn_outputselseloss

这种设计将这两项任务融合在一起, 引导学生模型不仅学习答案,还要学习推理过程。

4、运行知识蒸馏管道:

rain.py
rain.py

文件是主要入口点,用于协调所有组件。 它解析命令行参数以选择数据集(CQA、SVAMP、ESNLI、ANLI1 甚至 ASDiv 用于数据增强)、要使用的 LLM 预测类型(PaLM 或 GPT)以及其他超参数。

步骤 1:数据集准备

根据所选数据集,实例化适当的加载器。 例如:

 ifargs.dataset=='cqa':
     dataset_loader=CQADatasetLoader()
 elifargs.dataset=='svamp':
     dataset_loader=SVAMPDatasetLoader()
 # …and so on.

步骤 2:集成 LLM 预测

如果要从 LLM 知识蒸馏,代码会加载外部推理过程和标签,并将它们添加为新列:

 datasets['train'] =datasets['train'].add_column('llm_label', train_llm_labels)
 datasets['train'] =datasets['train'].add_column('llm_rationale', train_llm_rationales)

步骤 3:标记化和任务前缀

使用预训练的标记器(例如,来自

google/t5-v1_1-base

),代码会对示例进行标记化。 对于任务前缀模型,它甚至会在输入文本前加上"predict:"和"explain:":

 deftokenize_function(examples):
     model_inputs=tokenizer(['predict: '+textfortextinexamples['input']], max_length=args.max_input_length, truncation=True)
     expl_model_inputs=tokenizer(['explain: '+textfortextinexamples['input']], max_length=args.max_input_length, truncation=True)
     model_inputs['expl_input_ids'] =expl_model_inputs['input_ids']
     model_inputs['expl_attention_mask'] =expl_model_inputs['attention_mask']
     # (Encode labels and rationales as targets)
     returnmodel_inputs

步骤 4:训练和评估

rain.py

调用

train_and_evaluate

函数(在

train_utils.py

中找到),传入标记化的数据集和指标函数。 此函数设置所有内容并启动训练。

5、训练循环:

train_utils.py
train_utils.py

文件包含训练循环的代码。

get_config_dir(args)

函数基于当前超参数构建用于保存检查点和日志的目录路径, 方便跟踪不同的运行。

T5 模型通过

T5ForConditionalGeneration.from_pretrained(args.from_pretrained)

加载。 如果需要,可以在 GPU 上并行化模型。

使用

Seq2SeqTrainingArguments

来指定训练参数(例如,学习率、批量大小、评估频率)。

根据我们是使用任务前缀模型还是标准模型,实例化自定义的

TaskPrefixTrainer

(支持双重损失)或普通的

Seq2SeqTrainer

最后使用以下命令启动训练:

 trainer.train()

从数据加载到模型训练的整个过程都体现了分步知识蒸馏理念:引导学生模型不仅学习正确的输出,还要学习其背后的推理。

实验结果:超越教师模型

"Distilling Step-by-Step" 方法在实践中是否有效? 它是否实现了创建更小、更高效的模型(可以与它们更大的教师模型相媲美,甚至超越它们)的目标? 研究论文 "Distilling Step-by-Step!" 提出了一些引人注目的实验证据。 本节将深入研究关键发现,重点关注数据效率和模型大小。

数据效率:用更少的资源学习更多

"Distilling Step-by-Step" 的一个关键优势是其改进的数据效率。 使用这种方法训练的较小模型可以达到与使用传统方法训练的模型相当甚至更好的性能,但使用的训练数据却显著减少。 这在大型语言模型领域非常重要,因为数据稀缺和数据注释成本可能成为主要瓶颈。

论文中的图 4 和图 5 以可视化方式展示了这种数据效率优势。 在这些实验中,研究人员将 "Distilling Step-by-Step" 与两种常见方法进行了比较:标准微调 (Fine-tuning)(当有人工标记的数据可用时)和 标准任务知识蒸馏(当只有未标记的数据可用时)。 他们使用不同数量的训练数据为每种方法训练了 220M T5-Base 模型,并评估了它们在几个 NLP 基准数据集上的性能。

结果表明在 e-SNLI、ANLI、CQA 和 SVAMP 等数据集上,"Distilling Step-by-Step" 在使用减少的数据集进行训练时,始终优于标准微调和标准任务知识蒸馏。 在某些情况下,收益非常显著。 例如在 e-SNLI 上,仅在完整数据集的 12.5% 上训练的 "Distilling Step-by-Step" 可以胜过在 100% 相同数据集上训练的标准微调。 这大大减少了实现相同性能水平的数据需求。

与标准任务知识蒸馏(使用未标记的数据)相比,"Distilling Step-by-Step" 再次显示出卓越的数据效率, 始终以更少的未标记数据实现了更好的性能。 例如,在 ANLI 数据集上,他们观察到 "Distilling Step-by-Step" 仅需要完整未标记数据集的 12.5% 即可超过在整个 100% 数据集上训练的标准任务知识蒸馏的性能。

这意味着,与传统方法相比,"Distilling Step-by-Step" 可以使用更少的数据来训练模型,同时保持甚至提高性能。

这种数据效率的提高可能归因于推理过程提供的更丰富的监督信号。 通过学习生成推理步骤,较小的模型不仅在记忆输入-输出映射,而且还在内化对任务的更可概括的理解。 这种更深入的理解使其能够有效地从更少的示例中学习,从而更好地泛化到看不见的数据。

数据效率的提高可能因任务和数据集而异。 该论文显示了他们在测试的基准上的令人印象深刻的结果,但对于某些任务,收益可能不太明显。 教师生成的推理过程的质量也起着至关重要的作用。 如果推理过程嘈杂或信息量不足,则数据效率优势可能会降低。

模型大小缩减:微型学生,卓越性能

除了数据效率之外,该研究论文还强调了显着模型大小缩减的潜力。 知识蒸馏的目标是创建更小、更易于部署的模型。 使用推理过程训练的较小模型不仅可以更高效,而且可以实现令人惊讶的高性能,有时甚至胜过大型教师 LLM 本身。

论文中的图 6 和图 7 说明了这一点。 研究人员比较了使用 "Distilling Step-by-Step" 和标准微调/知识蒸馏训练的不同大小的 T5 模型(从 220M T5-Base 到 11B T5-XXL)与使用少样本 (Few-shot) 思维链推理提示和 PINTO 调整的 540B 参数 PaLM LLM 的性能。 x 轴表示模型大小(以参数为单位),y 轴表示任务性能。

结果表明,"Distilling Step-by-Step" 始终优于所有模型大小的标准微调和知识蒸馏。 使用 "Distilling Step-by-Step" 训练的较小模型与大型 PaLM LLM 相比,性能非常出色。

在几种情况下,该论文表明,比 PaLM 小几个数量级的 T5 模型可以实现相当甚至更好的性能。 例如,在 ANLI 数据集(图 6)上,使用 "Distilling Step-by-Step" 训练的 770M 参数 T5-Large 模型超过了使用少样本思维链推理的 540B 参数 PaLM LLM 的性能。 这是一个小 700 多倍的模型,实现了更好的结果。 同样,在 e-SNLI 上,220M T5-Base 模型优于 PaLM,该模型大 2000 多倍。

这意味着,与大型 LLM 相比,"Distilling Step-by-Step" 可以使用更小的模型来实现更好的性能。

研究人员认为,通过知识蒸馏推理过程,"Distilling Step-by-Step" 正在创建不仅更小,而且对于他们接受训练的特定任务也更专业化专注的模型。 较大的 LLM 虽然用途广泛,但也是通用模型,可能携带大量对于特定任务而言并非绝对必要的 "额外权重"。 另一方面,经过知识蒸馏的、逐步训练的模型更精简、更针对任务进行了优化,并且可能在某些方面更有效地利用了手头任务的相关信息。

总结

"Distilling Step-by-Step" 不仅仅是模型压缩的又一个渐进式改进, 它代表了我们思考训练和部署强大语言模型方式的一个潜在重大转变。

此方法在以下几个关键方面显示出了令人印象深刻的优势:

  1. 显著的数据效率:能够以更少的训练数据实现相当或更好的性能,这在资源受限的环境中尤为重要。
  2. 大幅减小模型规模:创建了比原始教师模型小几个数量级但仍保持或超越其性能的模型。
  3. 推理能力的保持和增强:通过关注推理过程生成,保留了复杂推理能力。
  4. 改进的部署可行性:较小的模型规模意味着更低的计算需求和更快的推理速度。

这些优势的影响是深远的。 "Distilling Step-by-Step" 可能是普及对强大 AI 的访问的关键推动因素, 从而释放一波创新浪潮,使较小的公司、研究人员和个人能够利用高级语言 AI 的力量,而无需庞大的基础设施。

效率的提高可能具有显着的环境效益。 训练和运行大型 LLM 会消耗大量能源。 更小、更高效的模型,实现相当的性能,可以为更可持续的 AI 生态系统做出贡献。

然而,"Distilling Step-by-Step" 不是万能的灵丹妙药, 它具有需要认识到的局限性:

  1. 任务特异性:知识蒸馏后的模型可能在特定任务上表现出色,但缺乏大型 LLM 的通用性。
  2. 教师质量依赖:最终性能在很大程度上取决于教师模型生成的推理过程的质量。
  3. 计算成本权衡:虽然推理更快,但初始知识蒸馏过程可能仍然计算密集。
  4. 验证需求:在更广泛的任务和域中需要进一步的研究来验证这种方法的鲁棒性。

展望未来,这项研究开启了几个有趣的研究方向:

  1. 知识蒸馏方法的改进:探索新的技术来提取和利用推理过程。
  2. 跨域泛化:研究如何使知识蒸馏的模型在更多样化的任务中保持有效。
  3. 自动化和效率:开发更自动化和计算效率更高的知识蒸馏流程。
  4. 理论基础:深入理解为什么推理过程知识蒸馏如此有效。

"Distilling Step-by-Step" 代表了 LLM 研究中一个令人兴奋和有希望的方向。 它是朝着远离简单地扩展模型,而是朝着更细致的方法迈出的一步,这种方法不仅知识蒸馏知识,而且知识蒸馏推理过程本身。

从庞大、笨拙的 LLM 到更敏捷的模型的旅程才刚刚开始。 "Distilling Step-by-Step" 提供了一个引人入胜的路线图,表明强大 AI 的未来可能不仅仅在于规模,而在于为每个人提供更智能、更高效和更易于访问的智能。

参考

https://avoid.overfit.cn/post/446d1ae2fd6e4093b6c68643e7b882a0

作者:Cristian Leo


deephub
122 声望97 粉丝