DLAI-私人数据大模型微调笔记-全-

DLAI 私人数据大模型微调笔记(全)

001:课程介绍 🎯

在本节课中,我们将要学习如何利用联邦学习技术,结合私有数据对大语言模型进行微调。我们将探讨这一方法的核心优势、面临的挑战以及解决这些挑战的关键技术。


假设您在一家拥有多个分支机构的医疗保健提供商工作,希望开发一个大语言模型来回答健康相关问题。用于训练模型的数据分布在各个地点,但隐私限制阻止您直接访问所有这些数据。

在之前的Flower Labs课程《介绍联邦学习》中,您可能已经了解到,联邦学习允许您将模型训练分发到数据所在的位置,而不是将数据集中到模型。在本课程中,您将学习如何将这个概念应用于微调大语言模型。

大语言模型通常具有数十亿个参数。在联邦学习中,您将模型分发到数据所在地,然后在每个训练迭代中与其他地点交换参数更新。这可能涉及大量数据的交换。

提升效率的关键技术 🔧

上一节我们介绍了联邦学习应用于大语言模型的基本概念,本节中我们来看看如何提升这一过程的效率。

完全正确。在本课程中,您将学习两种可以显著提高整个过程效率的技术。

以下是两种核心优化方法:

  1. 使用预训练模型进行微调:不要试图从头开始训练大语言模型,而是使用预训练模型,并使用私有数据进行微调。现在有许多优秀的开源大语言模型可以作为很好的起点,从而加快整个过程。
  2. 采用参数高效微调:您将进一步优化标准的微调方法,采用参数高效微调。在微调过程中,PEFT只需修改大语言模型权重的一小部分,而不是更新所有参数。在本课程中,您将看到,这可以仅用总参数量的 0.1% 来实现。

应对隐私泄露风险 🛡️

开发者担心的一个问题是,训练好的大语言模型是否可能泄露敏感的训练数据。例如,如果某人的个人信息(如家庭地址或信用卡号码)不知何故出现在训练数据中,大语言模型是否会泄露这些信息?

在本课程中,您将看到一些示例,说明即使是当前的开源大语言模型也可能恢复训练数据。然后,您将学习如何应用联邦学习和差分隐私技术,在微调大语言模型时最小化私有数据被曝露的风险。

在本课程示例中,每个医疗保健地点在训练过程中无需传输原始数据,这要归功于联邦学习。这为您打下了坚实的基础。通过差分隐私,模型更新已经添加了校准噪声,使数据恢复变得更加困难。

这种结合使得数据变得更加难以恢复。同时您还可以了解到,通过添加额外的方法(如加密),可以进一步增强数据的隐私保护,如果您的数据需要的话。

课程贡献者与展望 🙏

有很多人为创建这门课程作出了贡献。我想要感谢Flower Labs的哈维尔·费尔南德斯-马奎斯、普雷斯洛夫·亚历山德罗夫、高岩、鲁思·加林多,以及DeepLearning.ai的迪亚拉·埃扎丁和杰夫·路德维希。

第一课将介绍联邦大语言模型以及使用大语言模型进行联邦微调的主要优势。


本节课中我们一起学习了联邦微调大语言模型的课程概述。我们明确了其应用场景(如分布式医疗数据),回顾了联邦学习的基本原理,并介绍了提升效率的两种关键技术:基于预训练模型的微调参数高效微调。同时,我们也探讨了隐私泄露的风险及解决方案——结合联邦学习差分隐私来构建更安全的训练流程。下一节课,我们将深入探讨联邦大语言模型的具体优势。

002:利用私有数据构建更智能的大型语言模型

在本节课中,我们将要学习大型语言模型当前训练数据的局限性,以及如何通过联邦微调技术,安全地利用私有数据来显著提升模型的能力。

概述

大型语言模型的能力令人印象深刻,但一个关键限制在于,它们主要是在公开的互联网数据上进行训练的。世界上大量的有价值信息,如个人医疗记录、企业敏感数据或受监管的金融信息,并未被纳入训练过程。本节课将探讨这一现状,并介绍联邦大型语言模型微调如何帮助我们安全地利用这些私有数据,从而构建更强大、更专业的模型。

当前大型语言模型的训练数据限制

上一节我们概述了课程目标,本节中我们来看看大型语言模型当前训练数据的实际情况。

大型语言模型目前主要是在公开数据上进行训练的。这些数据包括互联网上的文本、网站内容、YouTube视频、大众媒体、博客、杂志文章以及部分社交媒体和留言板信息。这就是我们所知的、被嵌入到当前大型语言模型中的数据类型。

这种数据来源对模型能提供的回答类型有切实的影响。例如,当你询问“为游客在纽约计划一个有趣的星期六”时,模型基于公开的旅游信息,可能会给出一个合理的行程建议,比如从克林顿街面包店开始早餐,然后去高线公园跑步,最后观看尼克斯队的比赛。

然而,当你开始询问专业领域的问题时,情况就不同了。让我们尝试一个涉及医学的问题。如果你问:“我视力模糊,并且是糖尿病患者,我该怎么办?”一个基于公开数据训练的通用语言模型可能会给出不理想的答案,例如“也许吃些胡萝卜,因为它们已被认为能改善视力”。这个回答源于一个关于胡萝卜改善视力的都市传说,但对于一个严肃的医疗问题来说,这是非常不准确的。

因此,当我们向通用语言模型询问医疗或其他许多专业领域的问题时,得到的答案可能并不可靠。

未被纳入训练的数据世界

考虑到通用模型的局限性,我们自然会问,世界上还有哪些数据未被利用?事实上,大部分世界的数据尚未进入大型语言模型。

以下是目前普遍缺失于大型语言模型训练的数据类别:

  • 私有数据:例如个人手机、电子邮件中的数据。
  • 敏感数据:各种敏感信息,有些是私有的,有些则不是。例如图像数据、门铃摄像头数据、智能扬声器收集的音频等。
  • 受高度监管的数据:例如银行、金融机构持有的数据,以及医学和医院中的所有数据。
  • 分布式企业数据:存储在企业内部数千台计算机中的数据。
  • 物联网与设备数据:世界各地的孤立物联网设备、机器人、制造机器和工厂中产生的有价值信息。

如果我们能开始利用这些目前已知不在大型语言模型中的数据,我们预计模型的能力将获得显著进步。

领域特定语言模型的兴起

为了应对通用模型的不足,各种领域特定的语言模型应运而生。这些模型擅长处理特定任务。

其中一些模型基于非私有但更专业的数据集进行训练。例如,专注于烹饪的“Chef GPT”类模型会使用大量食谱信息进行训练;帮助学习语言或其他学科的模型也会使用相应的专业资料。

另一些模型则是基于特定领域的专有数据进行训练的,尤其是在医学领域。例如,Bio GPT 和 Gemini Glass AI 是经过医学数据训练的语言模型,它们在回答健康和医学相关查询方面能力显著增强。

一个著名的例子是 Bloomberg GPT。这是一个拥有500亿参数的模型,它广泛使用了彭博社内部的金融档案进行训练。这些财务文件赋予了 Bloomberg GPT 在金融领域的增强能力。

这个例子表明,一旦语言模型获得特定形式的数据,它们就能在相应领域中表现出色。

使用私有数据的主要障碍

既然领域特定模型效果显著,我们为什么不普遍使用私有数据来训练模型呢?原因有很多,但其中一个最大的问题是:大型语言模型会泄露它们训练数据的部分内容

当你考虑使用私密数据、受管制数据或分布式数据时,必须非常谨慎。例如,2023年12月《纽约时报》的一篇文章提到,有作者发现自己的电子邮件地址出现在了ChatGPT的公共模型中,因为该地址曾出现在其训练数据里。

因此,作为开发者,在处理和使用这类敏感数据构建大型语言模型时,必须极为小心。这意味着,你可能已经了解的传统方法,比如对大型语言模型进行常规的集中式微调,对于使用私有数据来说通常并不适用。

解决方案:联邦大型语言模型微调

那么,我们如何安全地利用私有数据呢?本课程将重点介绍一种传统微调的替代方法:联邦大型语言模型微调

这种方法的核心思想可以通过一个动画示意图来理解。假设有三家医院,每家都拥有高度私密的患者医疗记录。联邦微调的目标是将这些信息嵌入到模型中,但无需将数据复制到一个中心服务器。

以下是联邦微调的基本步骤:

  1. 数据始终保留在本地(如各家医院)。
  2. 在每个本地数据隔离部分上分别进行模型训练。
  3. 只将训练后更新的模型权重(而非原始数据)传输到一个中央服务器。
  4. 在中央服务器汇总来自各处的模型更新,整合成一个全局模型。

请注意,在此过程中,原始私密数据永远不必离开其所在地。这是保护数据隐私的基础构建模块。我们可以将这种方法与其他技术结合,以实现在利用各种私有数据的同时,提供对训练数据的隐私保护。

学习建议与课程总结

联邦大型语言模型微调方法使我们能够克服使用私有数据时的许多障碍,如隐私泄露风险、数据法规、硬件限制等。但这涉及很多概念,包括大语言模型微调和联邦学习。

因此,我建议您,如果尚未学习过联邦学习的基础知识,可以先查看相关的入门课程。这将帮助您更快地理解本课程后续的内容。当然,本课程本身也是独立完整的,您可以直接继续学习。

本节课中我们一起学习了以下三个核心要点:

  1. 数据缺口:世界上大部分数据(如私有数据、受监管数据、分布式数据)尚未被纳入大型语言模型的训练中,这限制了模型在医疗、金融等关键领域的能力。
  2. 核心障碍:这类数据未被广泛使用的最重要原因,是大型语言模型存在泄露训练数据的风险。这使得传统的集中式微调方法通常不可行。
  3. 解决方案联邦大型语言模型微调是一种让你能够利用私有数据,并在将其嵌入模型时保护信息隐私的方法。它还能帮助解决使用此类数据时遇到的其他相关障碍。

我们的目标是,通过安全地纳入更多新型的私有数据源,构建出更智能的大型语言模型,特别是那些能够准确回答特定领域(如医学)问题的专业模型。

003:集中式大语言模型微调 🏥

在本节课中,我们将学习如何使用私有医疗数据对一个大型语言模型进行集中式微调,并评估其性能提升。通过这个过程,我们可以直观地理解利用私有数据微调模型的价值,并为后续学习联邦学习方法打下基础。

场景介绍 🏢

在开始之前,让我们先介绍本课程将使用的场景。如下图所示,场景中有多个医疗机构(如动画底部的三座建筑)。每个机构都拥有高度敏感的医疗数据。我们的目标是利用这些数据微调一个大语言模型,以提升模型回答医疗问题的能力。

虽然我们使用的是医疗数据,但此基本场景可以广泛推广到法律、企业、金融等其他行业和应用。

本节课我们不会使用联邦学习。相反,我们将采用传统的集中式微调方法。如上图动画所示,数据会从各个医疗机构流出,汇集到中央服务器,在那里进行模型微调和更新。这正是我们接下来要在代码中实现的过程。

数据集介绍 📊

在进入代码之前,我们先了解一下将要使用的数据。为了提供一个私有数据的代表性示例,我们使用了 MedAlpaca 数据集。这是一个优秀的资源,包含了各种医疗领域的知识。关键的是,它包含了问答对

虽然评估大语言模型的回答质量可能是主观的,但由于这个数据集提供了标准问题和答案,我们可以更容易地评估模型性能,因为我们知道对于每个问题,什么是“正确”的离散答案。

通过使用这个完全开源在线的 MedAlpaca 数据集,我们可以将其作为私有数据如何有益于大语言模型的一个有力代理。你将能亲身体验到,当把这种方法应用到你自己领域的私有数据时,可以期望获得怎样的改进。

代码实践:环境准备与配置 ⚙️

现在让我们开始查看代码。首先,我们需要导入一些必要的包和工具函数。

# 导入必要的库
import transformers
from peft import get_peft_model, LoraConfig, TaskType
from utils import load_config, prepare_dataset

你会看到我们使用了 Hugging Face 的 transformers 库和 PEFT。PEFT 是一种参数高效微调的方法,我们将在下一节课详细解释。我们还从工具模块导入了一些函数,以保持代码整洁。

在本课程的笔记本中,我们将使用 Hydra 来管理配置文件,这是一个非常强大的工具。

接下来,让我们加载描述集中式微调如何执行的配置文件。

# 加载配置文件
cfg = load_config(‘configs/centralized_finetuning.yaml’)

以下是配置文件中几个关键部分:

  • 数据集:我们使用的是 MedAlpaca 数据集的“抽认卡问答”子集。
  • 模型:我们将使用来自 Eleuther AI 的 7000 万参数的大语言模型。
  • 训练方法:我们将使用 PEFT 和 LoRA 进行训练(下节课详解)。
  • 超参数:配置文件中的训练部分包含了典型超参数,如学习率、训练步数等。这些值已经过调整,以便在本笔记本中快速完成微调。

探索数据集与基准测试 🔍

在开始微调之前,我们先看看 MedAlpaca 数据集,并测试一下预训练模型的基线性能。

首先,使用 Hugging Face 的 datasets API 加载数据,并抽取 10% 的训练数据。这模拟了现实场景:假设你作为研究人员,只能访问分布在合作医院的总数据的 10%。

# 加载数据集并抽取10%
from datasets import load_dataset
dataset = load_dataset(cfg.data.name, split=‘train’)
small_dataset = dataset.train_test_split(test_size=0.9)[‘train’] # 取10%
print(f“数据集包含列:{small_dataset.column_names}”)
print(f“10% 子集包含 {len(small_dataset)} 个训练样本。”)

打印结果显示,这个子集包含近 3400 个训练样本,每个样本有“指令”(问题)和“响应”(答案)两列。让我们看一个例子(比如第10个样本):

指令:袢利尿剂如何影响血清钾、镁和钙水平?
响应:袢利尿剂通过抑制亨利袢升支粗段的Na-K-2Cl共转运体来增加这些电解质的排泄,可能导致低钾血症、低镁血症和低钙血症。

这是一个关于利尿剂的高度专业医学问题,数据集提供了技术性很强的理想答案。

现在,让我们了解一下我们的起点:一个未经微调的、预训练的大语言模型表现如何。我们首先通过 API 加载一个预训练的 70 亿参数的 Mistral 模型进行评估。

我们先问一个通用问题:“如何预测天气?”。模型给出了一个模糊但尚可接受的回答。

接着,我们用一个来自 MedAlpaca 的特定领域问题来“强测试”它:

提示(来自数据集):袢利尿剂如何影响血清钾、镁和钙水平?
模型回答:利尿剂是一种帮助身体排出多余水分和盐分的药物。袢利尿剂是其中一种,主要作用于肾脏的亨利袢…

观察发现,模型做出了很好的尝试,但它并没有直接回答所问的问题,而是主要提供了利尿剂的定义。这显然没有包含我们要求的具体信息。

相比之下,数据集中提供的真实答案(上文已列出)则直接、切中要害。这清楚地表明,预训练模型在回答特定领域问题方面能力有限。

实施集中式微调 🚀

既然我们已经看到预训练模型的局限,现在可以开始引入微调所需的代码了。

首先,让我们实例化模型、分词器并准备数据。

# 实例化模型和分词器
model = AutoModelForCausalLM.from_pretrained(cfg.model.name)
tokenizer = AutoTokenizer.from_pretrained(cfg.model.name)
# 对数据集进行标记化处理
tokenized_dataset = small_dataset.map(lambda x: tokenize_function(x, tokenizer), batched=True)

这里值得提一下模型的统计信息:我们即将使用 PEFT 微调的 7000 万参数模型,实际上只会修改约 17 万个参数,不到总参数的 0.3%。这种高效性是 PEFT 的优势之一。

所有组件(模型、数据集、分词器)都准备好后,就可以开始微调了。我们需要一个函数将所有部分整合在一起。

让我们看看 fine_tune_centralized 函数做了什么:

  1. 检测设备:自动检测使用 CPU 还是 GPU(CUDA)。
  2. 配置训练器:使用 Hugging Face 的 Trainer API,连接模型、数据、训练参数。
  3. 开始训练:执行微调。
  4. 保存检查点:仅保存微调后的参数(PEFT 适配器权重)。
def fine_tune_centralized(model, tokenized_dataset, cfg):
    # 设备检测
    device = torch.device(“cuda” if torch.cuda.is_available() else “cpu”)
    model.to(device)
    # 设置训练参数
    training_args = TrainingArguments(**cfg.training)
    # 初始化训练器
    trainer = Trainer(
        model=model,
        args=training_args,
        train_dataset=tokenized_dataset,
        tokenizer=tokenizer
    )
    # 开始训练
    trainer.train()
    # 保存模型(仅PEFT权重)
    trainer.save_model(cfg.output_dir)

现在,让我们运行微调。为了快速演示,我们只训练 5 个步骤,并使用小批量大小。

# 执行微调
fine_tune_centralized(model, tokenized_dataset, cfg)

训练过程中,你会看到损失值逐渐下降。大约一分钟后,微调完成。

评估微调后的模型 📈

关键问题来了:微调后的模型比我们开始时看到的未微调模型表现更好吗?

让我们在同一个医疗问题上再次测试。注意,这次测试的是已经在 10% MedAlpaca 数据上微调过的 70 亿参数模型。

提示(同一问题):袢利尿剂如何影响血清钾、镁和钙水平?
微调模型回答:袢利尿剂通过抑制肾脏亨利袢升支粗段的Na-K-2Cl共转运体,增加钾、镁和钙的排泄,可能导致这些电解质水平的降低(低钾血症、低镁血症、低钙血症)。

这次我们得到了一个好得多的答案!它直接回答了问题,准确解释了袢利尿剂会降低这些电解质水平,甚至提到了相应的医学术语。这与数据集中的真实答案非常吻合。

成功!我们看到了针对一个问题的明显改进。

系统性评估与结果可视化 📊

然而,要得出确切的结论,我们需要在大量问题上观察模型的系统性改进。在大量样本上提示模型并评估答案需要时间。

因此,我们预先离线进行了评估,并将结果保存下来以便可视化。当然,笔记本中也提供了生成这些结果的代码,你可以用自己的模型和数据运行它。

以下是我们评估结果的总结:

图表说明:

  • Y轴准确率。基于数据集中有明确对错的问答对进行评估。
  • 对比模型
    • 预训练模型:未经微调的 70 亿参数模型。
    • 微调模型:在 10% MedAlpaca 数据上微调后的同一模型。
  • 观察结果:准确率从略高于 30% 显著提升至接近 50%。请注意,这个提升仅使用了一小部分(10%) 的可用私有数据。

这个结果清晰地展示了,即使在有限的数据上进行微调,也能带来显著的性能提升。

课程总结 🎯

在本节课中,我们一起学习了如何采用一个通用的大语言模型,在私有医疗数据上对其进行集中式微调,并观察到了其在专业领域回答能力的显著提升。

我们通过代码实践了整个过程:

  1. 介绍了医疗私有数据微调的场景。
  2. 探索了 MedAlpaca 数据集。
  3. 测试了预训练模型的基线性能。
  4. 使用 PEFT-LoRA 方法高效地微调了模型。
  5. 评估了微调后模型的性能,并通过可视化确认了系统性改进。

这展示了利用通常无法获得的私有数据所能带来的巨大价值。然而,正如第一课所讨论的,使用集中式方法在敏感数据上微调大语言模型是危险的,因为模型可能记忆并复述训练数据。

那么,解决方案是什么?答案将是联邦学习。我们将在下一节课中深入探讨如何在不共享原始数据的前提下,利用联邦学习安全地微调大语言模型。

004:联邦大型语言模型微调 🧩

在本节课中,我们将学习如何利用私有数据对大型语言模型进行联邦微调。我们将了解这种方法的工作原理,如何克服隐私和效率等挑战,并最终动手构建一个联邦大型语言模型。

概述

为了将私有数据用于大型语言模型,联邦大型语言模型微调是最佳工具之一。本节将首先解释该方法的工作原理,然后指导你使用它来构建自己的联邦大型语言模型。

联邦学习基础

上一节我们介绍了利用私有数据微调大模型的需求,本节中我们来看看实现这一目标的核心技术——联邦学习。

联邦学习的核心思想是训练过程转移到数据所在的位置,而不是将数据集中到服务器。这通过一个动画进行了说明。在本节中,我们将从动画中展示的概览,深入到理解使这种学习方式得以实现的所有核心技术。

但在深入之前,让我们先与上一节课中使用的方法进行比较。回想一下,我们使用了集中式微调方法,这需要在微调开始之前将数据复制到服务器。动画展示了每个医院的数据必须先移动到服务器,然后才能开始微调。这就是本课程中两种方法的根本区别。

需要强调的是,本课程专注于大型语言模型、私有数据及其与联邦微调的关系。关于联邦学习的更广泛细节,请参考其他介绍性课程。

核心配方:三大组件

在我们即将看到的代码中,我们将使用一个执行联邦大型语言模型微调的基本配方。你可以将其想象成一个拼图,由三个主要部分组成:

  1. 联邦学习
  2. 参数高效微调
  3. 差分隐私

这三个部分共同构成了一个配方,使我们能够执行这种特定类型的微调,并获得我们讨论过的所有好处。

这个配方是基础性的。例如,你可以用垂直联邦学习替换联邦学习部分,用提示微调替换参数高效微调部分,或者研究差分隐私的不同变体。根据你的应用程序和数据需求,还可以添加额外的部分,例如支持分层联邦学习、执行模型压缩或包含同态加密。这些变化和添加是为了满足特定的隐私、准确性或架构需求。

现在,我们将首先解释这种大型语言模型微调技术的基本形式,并逐一剖析每个组件。

基础形式:无PEFT与差分隐私

为了建立深入的理解,让我们从联邦大型语言模型微调的最基本形式开始,一开始甚至不使用差分隐私或参数高效微调。它们将逐步被引入,这样你也能看到为什么它们是必需的。

我们从下图所示的场景开始,它使用了我们在前一课中描述的场景:利用来自许多不同医院的私有数据。在代码中,我们使用了Mistral 70亿参数基础模型,这就是为什么它被添加到了图中,位于服务器上方,作为待改进的全局模型。

在这种模式下进行微调的第一步是客户端选择。图中已经选择了两个客户端(由蓝色箭头指示)。根据设计,你可以让所有客户端在一轮训练中同时参与(完全参与),但选择客户端子集允许我们管理通信开销等问题。在这个例子中,这两个客户端将对本地可用的模型架构(即Mistral模型)进行标准训练。每个客户端根据其拥有的数据更新大型语言模型的权重。

下一步是,每个客户端更新后的模型权重将被发送到服务器,在那里进行聚合。来自客户端的更新被聚合,例如使用FedAverage方法,这是一种将所有模型更新直接平均在一起的方案。然后,这个平均后的更新应用于现有的Mistral模型,以根据本地客户端的数据对其进行微调。每个平均步骤称为一轮,需要完成多轮联邦学习,直到微调完成。

至此,我们已经描述了一种对大型语言模型进行联邦微调的完整方法。

挑战一:通信开销与PEFT解决方案

接下来是什么?你可能已经注意到可能存在通信开销问题。原因是大型语言模型比联邦学习通常使用的模型大得多。传输模型更新通常意味着在客户端和服务器之间传输整个模型。对于较小的架构,这可能没问题,但在大型语言模型领域,这可能很快失控。

作为参考,拥有70亿参数的Mistral模型本身可能约为27吉字节(取决于参数精度)。如果在多轮训练中,在多个客户端和服务器之间传输27吉字节的数据,所需的数据量和传输时间可能会变得不可接受地慢。这在非大型语言模型设置中通常不会如此突出。

那么我们该怎么办?这就是我们引入PEFT(参数高效微调) 的地方。PEFT将降低每轮从客户端到服务器必须发送的参数数量。

在下图中,左下角展示了典型的联邦拓扑结构,客户端与服务器交换模型更新。右侧则说明了PEFT如何极大地减少需要传输的数据量。

在PEFT中,关键思想是我们能够冻结模型的大部分权重。在客户端层面的图表中,模型的许多部分从黄色变为蓝色,表示这些权重被冻结,在本地模型更新期间实际上没有被更新。我们只需要传输那些被允许改变的权重。

有趣的是,即使将冻结参数的百分比调到极高水平(例如98%冻结,仅2%可改变),这种技术也被证明是有效的。基础模型仍然能够很好地适应并提取大量所需信息。通过这个过程,模型可以更新,但需要交换的数据量大大减少。

当我们查看代码时,你会看到具体的数字,了解这在多大程度上提高了性能。这里我们提到了两个重要因素:一是管理了在大型语言模型情况下变得尖锐的带宽问题;二是减少了所需的计算量,因为我们不必修改那么多参数。

挑战二:隐私与差分隐私解决方案

整个课程的一个重点领域一直是隐私。我们知道大型语言模型在某些情况下能够复述训练数据。因此,即使联邦学习的核心优势是数据无需传输,但这本身并不足够。所以我们要在拼图中加入最后一块:差分隐私

让我们深入了解在这种情况下差分隐私是关于什么的。对于更详细的解释,请查看我们关于联邦学习介绍的配套课程。这里我们简要勾勒出如何使用差分隐私。

再次观察左边的参考框架图,它展示了客户端如何与服务器通信。在右边,我们深入研究了通过引入差分隐私而发生的一些具体变化。

差分隐私引入了许多技术,用于掩盖个别训练样本的具体细节,以降低它们被泄露的机会。在客户端层面,我们在训练期间故意添加校准噪声。图中红线概念化地表示,通过减少模型误差获得的信号被故意添加了噪声。选择和应用噪声是为了在重要方面仔细掩盖信号。添加了这种噪声的模型更新然后与服务器共享,这些带噪声的模型更新增强了训练数据的隐私保护水平。

在这个特定应用中,合理的保护粒度是在个别训练样本层面。但根据不同的应用,你可能需要保护不同的实体(例如,以作者为粒度)。

从技术角度看,差分隐私试图实现什么?它展示了两个不同的模型LLM_ALLM_B,它们之间的唯一区别是,一个是用特定的训练实例训练的,另一个则没有。差分隐私通过添加噪声,试图使这两个模型产生无法区分的结果。通过这种方式,它提供了一种合理的否认形式,增加了获取底层训练数据的难度,有助于防止模型反刍训练数据等问题。

因此,差分隐私帮助我们提高训练数据的保护水平,它与“数据无需复制”这一核心优势协同工作,提供了一个更私密和安全的系统。

为了提供关于差分隐私如何工作及其与添加噪声关系的直觉,请看下面的图示。上图是原始图像,包含可能敏感的信息(人脸、背景文本)。下图是同一图像,但有策略地模糊了敏感区域(人脸、单词)。你仍然可以从添加了选择性噪声的图像中理解和学习宏观模式(例如房间人数、房间类型、活动类型)。这个额外的噪声使得识别某些特征(如人脸)变得更加困难。这希望能给你一个强烈的直觉,了解这个机制如何运作以保护单个训练样本,同时仍然允许我们学习对模型成功非常重要的宏观模式。

动手实践:代码实现

现在我们已经描述了所有协同工作以使联邦大型语言模型微调成为可能的各个部分。是时候转向代码了。

简要提醒一下,我们将回到我们喜欢的医疗场景,我们希望从许多不同的私有数据源中学习,以改进一个大型语言模型的通用骨干,使其能够以高得多的保真度回答非常具体的医疗问题。

在第三课中,你的主要目标将是学习如何对大型语言模型进行联邦微调。正如我们在前一节课的笔记本中看到的,很多时候我们将使用一个7000万参数的较小模型,但我们也会为你提供微调一个70亿参数模型所需的一切。

回想一下,在前一个笔记本中,你扮演了医院里的一位数据科学家,只能利用医院内可用的数据。但现在通过使用联邦学习,我们将允许这位数据科学家获取并利用他们周围许多不同医院的数据。通过这样做,让他们突破仅占总数据10%的障碍。我们将看到当你允许模型接触到越来越多的数据时会发生什么。

在这个特定的笔记本中,你将使用Flower模拟引擎来模拟一个有20个客户端的真实联邦学习系统,每个客户端代表一个不同的医院。

步骤1:导入必要的包

首先导入一些我们将需要的包和实用函数。这个笔记本还使用了Hugging Face Transformers库和PEFT。

以下是特别相关的导入:

  • flwr:用于运行Flower模拟引擎。
  • flwr_datasets:一个库,允许我们将MedAlpaca数据集分割成20个不相交的独立数据集,对应20家不同的医院。
  • 差分隐私模块:导入使客户端(Flower客户端)能够使用差分隐私的模块,以及一个在聚合后应用差分隐私的包装策略。
import flwr
from flwr_datasets import FederatedDataset
from flwr.server.strategy import FedAvg
from flwr.client import NumPyClient, ClientApp
# ... 其他导入,如 transformers, datasets, torch 等

步骤2:加载配置

接下来加载配置。其内容与我们在专注于集中微调方法的第二节课中使用的非常相似。它使用MedAlpaca数据集。在笔记本中运行时,我们使用的是7000万参数的较小版本。还包括一些通用的超参数。

在配置的下部,flower标签下有几个新条目:

  • num_clients:指定客户端数量。
  • num_rounds:指定联邦学习的轮次数量(这里设为2,以便快速完成)。
  • client_resources:调整模拟中使用的并行程度(例如,num_cpus=2代表分配给每个客户端的CPU核心数)。
  • dp部分:指定范数裁剪和噪声乘数参数,定义了在微调过程中对训练数据的保护程度。

步骤3:准备联邦数据集

现在开始将MedAlpaca数据集分割成20个不相交的集合。每个集合对应联邦中20家医院之一的本地数据集。一个客户端对应一家医院。

使用flwr_datasets工具包来协助下载、处理和分割数据集。数据集分割可能很复杂,尤其是在引入数据异质性时。flwr_datasets带有内置的分割方案,让你可以专注于架构和算法设计。

这里采用最简单的方法,使用IID划分器来分割数据,这意味着所有分区都通过从整个数据集中均匀抽样来构建。

运行代码后,可以检查第一个分区的元数据,并对每个数据分区进行可视化,显示每个分区拥有的训练数据量。你会发现所有20个分区都大约有1700个训练示例。

步骤4:加载分词器与预处理组件

与上一个笔记本类似,加载分词器和其他预处理大型语言模型输入所需的组件。

步骤5:定义客户端应用

在Flower中,客户端是使用客户端应用来定义的。客户端应用通过指定一个返回客户端对象的函数来构建。该对象知道如何做两件事:

  1. 实例化模型。
  2. 运行训练循环(每个客户端在联邦轮次中需要在本地做的事情)。

因为这个客户端将使用差分隐私,所以在客户端规范中会传递一个差分隐私模块(例如FixedClipping模块)。

步骤6:定义服务器策略

在服务器应用的核心,有一个策略。Flower策略负责抽样客户端、向客户端传达指令、从客户端接收模型更新、运行模型聚合以及其他记账项目。

在这个笔记本中,你将使用FedAvg,这是一种相对简单但在服务器级别聚合模型更新非常有效的方法。

为了增强差分隐私,你将使用一种包装策略,它维持联邦平均策略的行为,但也添加差分隐私所需的必要额外功能(即向聚合模型的结果添加校准噪声)。

现在策略准备好了,并且包含了差分隐私,你还可以通过指定希望运行模拟的轮数来实例化一个服务器应用程序(默认为2轮)。

步骤7:运行联邦模拟

现在,数据集、客户端应用程序和服务器应用程序都准备好了。你可以运行模拟函数来启动联邦学习过程。

运行模拟需要几分钟。你实际上是在用一个7000万参数的大型语言模型进行几轮微调,每轮涉及四个客户端。

随着模拟运行,它会生成信息日志,分为四个部分:

  1. 模拟初始化过程。
  2. 与两轮训练相关的日志。
  3. 模拟过程总结。

最有趣的一行是最后一行,它显示了每个客户端的平均训练损失。在这个例子中,没有进行集中评估,所以集中评估的损失为零。

步骤8:评估与结果分析

现在你已经对一个7000万参数的大型语言模型进行了联邦学习微调。为了看到改进,我们过渡到较大的70亿参数Mistral模型。我们离线对这个大模型进行了全面微调(使用完全相同的代码),保存了模型检查点,现在将其加载到系统中,并使用API进行推理,以了解在对私有医疗数据进行联邦微调后,它在回答医疗问题方面好了多少。

我们加载先前的模型检查点,并从MedAlpaca数据集中选择一个训练示例(例如第6个)作为问题提问。例如,问题是:“低血糖和高C肽水平的可能原因是什么?”微调模型的响应提到了“胰岛素瘤”这种情况。预期的黄金标准响应也指向了同样的问题。这表明模型响应相当好。

与上一节课类似,仅展示几个例子是不够的。我们进行了广泛的系统性分析,对大量不同问题进行推断,并将结果保存下来。现在我们来可视化这个分析的结果。

结果图1:不同数据访问范围下的准确率

  • Y轴:验证准确率。
  • 柱状图1(预训练):预训练的70亿参数Mistral模型在医疗问题上表现较差(略高于30%)。
  • 柱状图2(集中微调-10%数据):模拟一家医院的数据科学家,仅使用10%可用数据进行集中微调后的准确率。
  • 柱状图3(联邦微调):在本节课中,通过联邦制度让同一个Mistral模型接触20家不同医院的私有数据后,模型的准确率进一步提高,达到了更有用的水平。可以想象,如果向联邦网络中添加更多医院,准确率很可能继续提高。

结果图2:数据量相同时,联邦与集中方法的对比
我们重复了相同的分析,但这次为上一节课的集中微调方法提供了与本节课联邦方法相同数量的私有数据。结果显示,两种方法达到了相似的精度水平。然而,请记住,在现实世界的许多情况下,由于法规和无法将敏感数据复制到医院之外等障碍,那些本可通过集中方法使用的数据实际上无法被利用。联邦方法正是在这些场景下发挥作用。

步骤9:通信成本分析

在结束之前,让我们检查一下与较小模型(7000万参数)相关的通信成本。我们提供了一个compute_communication_cost函数,它使用Flower的系统配置来估计重要的通信因素。

运行该函数后,你会发现,多亏了PEFT,通信成本降低了300多倍。如果通信整个模型,仅在这个笔记本中进行的微调就会通信超过4吉字节的数据。但因为使用了PEFT,客户端和服务器只需要通信大约12兆字节的数据,非常令人印象深刻。

我们也查看了全规模70亿参数配置的输出。在这种情况下,使用PEFT的通信节省超过千倍。对于这个巨大的模型,一次更新只需要传输26兆字节(假设20 Mbps的链接,上传只需10秒)。这种开销在联邦学习下是可以承受的。

总结

本节课中我们一起学习了以下关键内容:

  1. 核心配方:我们使用的配方包括三个主要成分:联邦学习参数高效微调差分隐私。正是通过这些拼图块的合作,我们能够提供一种对大型语言模型进行联邦学习的方法。
  2. 方法优势:这种方法允许大型语言模型微调过程利用私有数据,同时尊重数据隐私,没有过高的通信开销,并且数据无需离开本地。
  3. 实践成果:在代码中应用这些概念后,我们看到微调后的大型语言模型通过接触现实中难以获得的私有数据,有了显著改进。模型能够对特定的高度技术性医疗问题做出比未微调时更恰当的回应。
  4. 性能对比:在这种设置下,联邦微调方法能够达到与集中式方法相似的精度水平,同时解决了集中式方法在数据隐私和法规遵从性方面的根本限制。
  5. 效率提升:通过PEFT技术,通信成本被降低了数百甚至上千倍,使得对大规模语言模型进行联邦微调变得可行。

通过本节课,你掌握了利用联邦学习框架对大型语言模型进行私密、高效微调的基本技能。

005:保护大型语言模型的隐私 🔒

在本节课中,我们将学习大型语言模型在处理私有数据时可能面临的数据泄露风险。我们将深入探讨一种常见的攻击方式——训练数据提取,并了解其工作原理。更重要的是,我们将学习如何使用联邦微调技术来增强大型语言模型的隐私保护能力,使其更难泄露训练数据。


大型语言模型存在多种已知的安全漏洞。这些漏洞范围广泛,例如需要保护模型权重、限制模型使用方式、用户去匿名化问题、训练算法中的后门攻击,以及系统内数据传输相关的攻击。当使用更敏感的私有数据时,所有这些风险都会变得更加严重和尖锐。

鉴于课程中涉及众多漏洞,我们专注于私有数据用户可能最关心、也是最重要的问题:训练数据能够被提取的风险。但重要的是要理解,存在一整个需要被考虑的漏洞全景图。


训练数据提取方法概览

在从大型语言模型中提取训练数据的特定领域内,已经有了很大的研究兴趣,并发明了各种各样的方法。上图仅展示了已发表学术论文中的一小部分,每一篇都描述了从大型语言模型中提取训练数据的独特方法。显然,由于我们正在研究私有敏感数据的使用,这种类型的攻击更加令人担忧。

所以在本节课中,我们将深入研究这些提取方法的基本原理。目的是让你了解它们是如何运作的,从而更好地理解它们所带来的风险。

攻击的一般框架

现在让我们来看看这些提取数据方法的一般框架。你可以将这些攻击的运作方式分解为两个不同的阶段。

第一阶段:生成候选响应
大型语言模型必须能够产生可能是实际训练数据示例的响应。这个过程本身有各种各样不同的形式,人们已经发明了促使模型更有可能生成实际训练数据示例的方法。例如,人们想出了巧妙的提示,比如提供一个起始标记、一个空字段,或者一个包含可能引导大型语言模型产生敏感数据片段的关键字的字符串。在后续代码中,我们使用一个非常基本的方法——仅用一个空字符串提示,即使这样也能成功。但一般来说,第一步围绕着不同的策略来提示模型生成一长串候选示例,希望这些示例包含训练数据。

第二阶段:成员资格测试
一旦完成了第一步,这类方法中的第二步执行可以被视为一种成员资格测试。这一步试图测试每个单独的候选示例,并执行一个过程,通过这个过程你可以决定候选示例实际上是否是模型训练集的一部分。如果你不能准确地执行这一步,进行这些训练数据提取攻击实际上是不可行的,因为你可以提示模型生成很多响应,但你需要能够可靠地理解这个示例是否真的在训练集中,才能真正取得进展。


深入理解成员资格测试

让我们深入研究这第二步——成员资格测试。我们将用三个关键概念来理解它是如何工作的。

关键概念一:使用度量标准

我们要理解的第一个关键想法是度量标准的使用。我们在接下来的代码中将要使用的度量标准是困惑度。这是一种“惊讶”的度量,可以为大型语言模型产生的整个序列计算困惑度。根据困惑度值,你可以判断模型对产生这个序列有多“惊讶”。

困惑度的计算基于序列中每个标记被模型单独产生的归一化概率。因此,对模型来说不令人惊讶的序列往往是训练示例。这背后的直觉是,模型能够产生的大型语言模型训练示例往往是模型已经记住的示例。一个被记住的示例被产生,对模型来说不会是一个令人惊讶的示例。因此,通过计算困惑度,我们能够量化那种惊讶程度,并指示该序列、该示例是否真的是训练数据。

关键概念二:计算单个标记的概率

并非所有人都知道,但实际上可以询问一个大型语言模型,并让它为你生成一个单个标记产生或不产生的概率。这是我们如何总体计算困惑度的一个构建块。

我之前说过,困惑度是基于序列中所有单个标记的归一化概率。所以我们现在需要考虑如何生成单个标记的概率。这样做的方式是,对于给定序列,当你提示模型时,如果你在该序列中屏蔽后面的标记,你可以确定序列中下一个标记将是产生的那个的概率。

例如,我们有一个片段:“玛丽住在 172 号坦尼森街”。我们用前面的片段“玛丽住在 172”提示模型,然后屏蔽序列的其余部分。我们检查模型的权重以确定出现的单词的概率,并看看接下来的单词“坦尼森”在下一个“街道”中的概率是多少。这使我们能够确定那些后续标记的概率。

通过对序列中单个标记或单词的这些概率计算,我们然后可以计算困惑度。

关键概念三:设定阈值进行判断

成员资格测试的最后一步是采用我们现在已经检查过如何计算的这个困惑度示例。然后我们检查困惑度的值以确定它是否足够低以表明模型是否惊讶。根据这个困惑度水平以及我们认为惊讶是否发生的水平,我们然后可以标记该示例是否真的是实际训练示例。

对于确定这种类型的阈值,即困惑度水平,以确定模型是否恰好同意这个训练候选者确实是来自训练数据集的一个例子,有各种各样不同的方法。


实践:代码演示训练数据提取

那么现在你理解了深入并执行这些训练数据提取方法之一所需的所有核心概念,我们现在要跳入代码中,亲眼看到它的发生。

在这第四课中,你将学习大型语言模型如何泄露训练数据,并观察到在联邦大型语言模型微调下微调的模型对这种特定漏洞具有显著更强的抵抗力。就像我们在以前的笔记本中所做的那样,当某些步骤需要时,我们将在7000万参数的大型语言模型和更大的70亿参数模型之间交替。但你看到的所有代码都可以应用于任何一个。此外,我们将使用与这个医疗数据集场景一致的相同模型和相同场景。

第一步:导入必要的包

第一步,一如既往,让我们导入一些重要的包和实用函数,当你在这个笔记本中执行代码时我们将需要它们。

这些导入中的大多数实际上是为你编写的实用程序,以帮助并简化你执行这些攻击中的一些以及评估从不同版本的微调大型语言模型中提取训练数据有多难的任务。

第二步:尝试从微调模型中提取数据

在下一节中,你将逐步看到我们之前在幻灯片中描述的可以用于从大型语言模型中提取训练数据的简单方法。那么让我们开始吧。

你将首先使用在第2课中基本上在MedAlpaca上微调的大型语言模型工作。这是你将首先尝试从中提取训练数据的模型。所以让我们加载它。回想一下,这个模型是Mistral 7B大型语言模型。

提取训练数据的第一步是生成可能的候选例子。 这是通过提示模型来完成的。如前所述,已经开发了各种各样聪明的方法来以这样一种可能产生包含部分训练数据的响应的方式提示模型。那么让我们尝试一些这些方法的简单变体。

评估函数使用fireworks.ai服务在Mistral 7B参数大型语言模型上调用提示。并且正如我们在代码中看到的,即使使用空提示进行提示,也会产生一个可能是训练数据的有趣响应。看起来这个响应确实可能来自描述特定VPN服务好处的网站或其他材料。因此,可以想象这实际上是训练数据的一个例子。

你可以尝试不同的提示。

那么让我们试试一些。你可能想尝试的一个是简单地用一个前缀、一个带有电子邮件地址冒号的句子来提示它,然后看看模型是否会吐出一个电子邮件地址。作为另一个例子,你可以用一个名字的片段“彼得·W”来提示。如果你这样做,你可以看到响应给你的文本实际上可能来自一个网站上的传记,这可能是潜在地用于模型的训练数据。

所以主要在这里,我们看到了你可以用来生成一系列可能是或不是训练数据的候选例子的所有不同类型的简单提示。显然下一步将是决定你是否能够确定这些是否实际上是训练数据样本。

如果我们看这个最后的例子,我们在这里使用这个名字的片段“彼得·W”,并且我们似乎得到了一个是传记片段的响应,可能会很容易认为即使这是训练数据,这也是无害的。但请记住,我们正在看我们想要在私有数据上进行训练的例子。所以对于这个Mistral模型,如果这碰巧是训练数据,那么如果我们训练Mistral不是用公共网络数据,而是实际上用敏感私有数据进行训练,例如,像人力资源记录,那么这个传记很有可能直接来自某人的实际人力资源记录,比如某个特定公司的彼得的员工档案。

第三步:计算候选示例的困惑度

现在我们已经看到了你如何生成一些可能是训练数据的候选例子,下一步是为这些候选者中的一些计算困惑度。记住,我们不知道这些响应中的任何一个是否真的是训练数据。

困惑度为我们所做的是衡量大型语言模型能够多好地预测这些单词序列。低困惑度表明模型对产生的序列不感到惊讶。这可以是一个信号,表明该序列可能是实际训练数据的一个记忆片段。另一方面,高困惑度表明该序列不太可能由大型语言模型生成,因此在训练数据中以前不太可能被模型实际观察到。

你可以使用和以前一样的评估函数,但将第二个可选参数设置为真,这样当我们提示模型时我们可以注意到可能性。然后你可以使用计算困惑度函数根据你在代码中看到的那些收集到的可能性来计算困惑度。这里的困惑度值相当低,但请记住,困惑度和其他类似的此类度量标准只是表明该示例是训练数据的指示。

第四步:分析困惑度阈值

现在让我们更仔细地看看这些困惑度值。如前所述,当困惑度较低时,那么数据更有可能来自实际训练数据。但多低才算低呢?好的阈值是多少?让我们看两个例子。

这是一个来自Mistral 70亿参数模型的响应示例,很可能是实际训练数据。这是因为我们可以在一个很可能被Mistral爬取的实际网站上找到这个文本片段,或者至少在Mistral使用的数据集中,并进入了这个模型的训练数据。

现在让我们看一个不同的例子。让我们看看这个句子的困惑度。

这个句子来自《卫报》的一篇新闻文章。《卫报》是英国的一家主要报纸。实际上,这篇文章发表于2024年5月9日,所以这太新了,不可能已经包含在Mistral 7B模型的训练集中。

所以你在这里看到的是一个困惑度值,极有可能实际上不可能在Mistral模型的训练集中。这样你就可以开始对这个特定模型进行校准,以及对于它们来说困惑度需要达到什么水平才完全不可能是训练数据。

然后如果我们看前面的例子,我们看到一段实际上很可能是训练数据集一部分的文本,我们可以开始看到当示例确实是训练数据时困惑度值的倾向。请注意,在不是训练数据的例子中,困惑度高出六倍。

需要注意的是,在这两种情况下,我们都为你提供了指向时光机的URL,所以即使一些链接如新闻文章不太可能持久,但无论你何时观看本课程,你都能够访问这些,并且看到这些实际的网站示例,至少看起来很有可能数据被爬取并是Mistral模型的一部分,并且我们能够从Mistral模型中提取出来。在第二个例子中,我们从互联网上获取了一个我们知道几乎不可能出现在Mistral内部的文本片段,然后验证了这个特定片段的困惑度值。

第五步:应用于私有数据与微调模型

鉴于你现在已经学到和看到的,你可以将此方法应用于代表性私有数据、MedAlpaca数据集以及我们到目前为止构建和训练的微调模型。

首先,加载在中央进行微调的大型语言模型。你在第二课就这么做过。然后你可以尝试回答这个问题:我们能否从这个微调模型中提取来自MedAlpaca数据集的问题?

在这里你可以看到你可以再次计算困惑度,然后使用未微调的同一个大型语言模型进行归一化。你会观察到归一化后的困惑度非常低,这表明数据很可能来自训练数据集,在这种特殊情况下我们知道这是真的,因为这个模型实际上是在我们获取计算困惑度的提示文本的训练集上进行训练的。所以这是一个可以从集中训练的大型语言模型中提取的提示文本的例子。

第六步:比较联邦微调与集中微调

在本课程中我们研究的核心之一是如何使用带有大型语言模型微调的联邦学习,使其更难以提取训练数据。那么让我们通过开始比较第二课和第三课的微调模型,即中央微调的模型和使用联邦方法微调的模型,来看看哪个更难以提取医学羊驼数据,当然在整个课程中这一直是我们的私有数据代表。

到目前为止你在这个笔记本中探索的技术已经很好地打包成一个名为MIA_test的单一函数。这个测试将一系列可能的训练示例(这些候选者)作为输入,然后帮助我们根据困惑度来决定它们是否是模型训练数据的一部分。

最初,你将针对集中微调模型运行此测试,然后接下来你将针对联邦版本运行此测试。

从结果中,你可以看到我们在这里使用的三个例子中的两个,每个例子都来自医学羊驼数据。你可以看到三个中的两个被识别为来自集中模型的训练数据。我们当然再次知道它们是这个模型训练集的一部分,因为我们自己在这个数据集上对它们进行了微调,所以我们意识到该函数返回成员资格为真,以表示该示例被认为是训练集的一部分。

所以总的来说,在三个例子中我们试图从集中微调模型中提取,然后在这三个例子中我们能够这样做两个。

另一方面,让我们看看联邦模型。从结果中我们可以看到我们试图提取的每个候选者都被报告为假。该算法,这种基于困惑度的技术不确定这个特定的训练示例是否是训练集的一部分。所以在联邦模型下,这种方法无法识别这些示例是训练数据,因此试图提取训练数据的人将无法知道模型的哪个响应(可能有很多记忆的训练数据)或只是对提示的典型大型语言模型响应。无法区分它。

所以在这个小实验中,我们看到集中式模型三次尝试中有两次成功,而联邦情况下三次尝试都为零成功,这表明在提供的隐私方面可能有了一些显著的改进。

第七步:大规模实验验证

但接下来自然要问的问题是,在更大的实验中这是否还成立?如果是这样,那么我们可以开始认为该陈述将更普遍地成立。为了回答这个问题,你可以在更大的规模上进行前面的实验,不仅涉及三个示例,还涉及我们在整个课程中一直使用的MedAlpaca数据集的很大一部分。

分析这个新实验结果的标准方法是使用受试者工作特征曲线。所以当我们在更多示例上以更大规模应用这种提取训练数据的方法时,受试者工作特征曲线将告诉我们对于集中式模型和联邦模型,真阳性和假阳性可以被检测得有多好。

让我们从这个7000万参数的小模型开始并进行这个分析,你将通过一个配置开始这样做。

在这个配置中有几件值得注意的事情是两个数据集是如何设置的。受试者工作特征曲线将需要指定阳性和阴性数据集。这就是在这个配置文件中已经完成的。在一种情况下你使用MedAlpaca医疗抽认卡,在另一种情况下使用BigBio PubMed问答来满足阳性和阴性数据集的这些要求。这个配置使用了10个示例,每个样本索引从0到9。你可以很容易地调整配置以使用更多的数据和验证。在这个配置中,训练设置在0到10之间,验证设置在15到25之间。你也可以用你喜欢的任何模型替换这个模型,并通过简单地更改这个配置来使用其他数据集。

进行整个这个分析将意味着等待相当长的时间。所以我们希望你能够看到我们对大量示例进行这种分析的结果。所以我们已经为你离线完成了。我们早些时候已经完成了,并像我们在本课程的许多早期课程中所做的那样保存了输出。让我们加载这个输出。你将使用一个叫做plot_MIA_results的函数。

这需要前面提到的分析所保存的输出,并将信息呈现为一条ROC曲线,该曲线比较了联邦和集中式模型相对于仅仅使用随机选择来决定候选示例是否是训练数据集一部分的第三种情况。

从这个图中立即跃入你眼帘的一个重要信息是,对于用这条红线表示的集中微调模型,训练数据提取系统地比用蓝色表示的联邦微调模型更容易。在这个图中,黑色是随机机会。现在ROC曲线衡量提取过程的效果如何。曲线的面积表示这个过程实际上能够多么成功以及以多么少的错误被应用并且能够正确识别训练示例。这个过程越准确,它就越向左上角移动。你可以看到这对于对应于集中微调模型的红色曲线是这样发生的。

在这条ROC曲线中,y轴是真阳性率。x轴是假阳性率。那么让我们考虑在这个图中显示的几个数据点。该图显示,我们使用的MedAlpaca数据集部分中大约83%的候选示例在集中设置下被正确分类。这比在联邦微调模型下可以看到发生的成功率高大约30%,联邦微调模型仅以63%的成功率成功。

但请记住,这些曲线的形状,我们得到的百分比,都取决于调整。你可以通过改变诸如差异隐私的关键变量和我们在前一节课中看到的描述的联邦LLM微调配方的其他成分的选项,来选择如何增加和降低这些曲线。通过改变这些值,你能够降低或减少你收到的隐私保护量。你可能想要这样做的原因是,在微调期间,随着你增加隐私保护水平,对所得模型的保真度往往会有相应的影响。

第八步:在大型模型上的实际应用

在这个笔记本的最后一部分,让我们更详细地看看你到目前为止一直在使用的困惑度方法在Mistral 70亿参数模型上实际上是如何工作的。这很有趣,因为Mistral是一个广泛使用的、非常大规模的语言模型,我们知道它是在公共数据上训练的。所以我们可以执行并检查提取这种训练数据有多容易,因为这在某种程度上可以作为尝试提取私有数据的一个代理,在这个例子中,假设你实际上无法访问任何训练数据。你只是想识别用于训练模型的敏感数据,或者在这种情况下,用于训练模型的公共数据。

因为你没有任何训练数据,所以会生成各种各样的训练示例候选。所以需要生成大量候选并测试它们的困惑度。并且就像在这个特定的笔记本中已经发生过几次的那样,为了避免你等待,这个过程又一次在离线状态下进行。我们从Mistral模型生成了相当多的候选。然后该生成的输出已为我们保存以便检查。

提取用于存储输出。

所以这个提取变量,即mi_config,配置并指定行为、要检查的模型等等。然后这里再次有趣的是这不是一个玩具模型。然而我们所描述的程序被认为运行良好。评估和展示被用于提取这些例子中的一些。

第一个例子显示模型能够产生甚至是现有网站的整段内容。

在第二个例子中,我们可以看到在模型中找到电子邮件地址,并且这些与训练数据相对应。

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-priv-dt-llm-ft/img/2b670b1eb6a4616ac

006:6. 结论 🎯

在本节课中,我们将一起回顾并总结利用联邦学习技术,结合私有数据对大型语言模型进行微调的核心内容。


恭喜你完成本课程。通过本课程的学习,你了解了利用联邦学习技术,借助私有数据使大型语言模型变得更智能的潜力。特别是,你学习了这种方法如何帮助你处理将联邦学习与大型语言模型结合时,所出现的关键隐私和效率问题。

现在,你已经在大型语言模型与联邦学习的道路上迈出了第一步。接下来可以做什么呢?你可以通过访问 flower.ai 网站,或在 x.com 上关注 @flowerlabs 来获取更多信息。你也可以加入 Flower 社区的 Slack 频道,与数千名志同道合的人工智能研究人员和工程师交流,探索关于这个主题的更多内容、新配方、新方法以及示例。

我特别建议你查看 FlowerTuneFlowerTune 排行榜,以及我们称为 FlowerLLM 的新大型语言模型预训练技术。

最后,感谢令人惊叹的 Flower 社区。我十分期待看到你们所有人即将构建出的卓越的联邦大型语言模型应用。


本节课总结:本节课我们一起回顾了联邦学习结合私有数据微调大模型的潜力与挑战,并为你指明了后续深入学习和实践的方向与资源。

posted @ 2026-03-26 08:17  布客飞龙II  阅读(23)  评论(0)    收藏  举报