https://zhuanlan.zhihu.com/p/210653076
https://zhuanlan.zhihu.com/p/212862132
一、概述
近日,Facebook 开源了一个新型库 Opacus,它支持使用差分隐私来训练 PyTorch 模型,扩展性优于目前的 SOTA 方法。同时,Opacus 库支持以最少代码更改来训练模型,且不会影响训练性能,并允许在线跟踪任意给定时刻的隐私预算。
Opacus 库开源地址:https://github.com/pytorch/opacus
Opacus 库的目标受众主要为以下两类人群:
- 机器学习从业者:可以使用该库轻松了解如何利用差分隐私训练模型,该库支持以最少代码更改来训练模型;
- 差分隐私科学家:Opacus 库易于实验和修复,这允许他们专注于更重要的事。
差分隐私是一个具备数学严谨性的框架,可用于量化敏感数据的匿名化。Facebook 在相关博客中表示,希望 Opacus 库能为研究人员和工程师提供一条更简单的途径,以便在 ML 中使用差分隐私,并加快该领域的 DP 研究。
Opacus 库提供了什么?
通过这个开源的高速库 Opacus,你可以得到:
- 速度:利用 PyTorch 中的 Autograd hook,Opacus 能够批量化计算每个样本的梯度。与依赖 microbatching 的现有 DP 库相比,Opacus 实现了一个数量级的加速。
- 安全性:Opacus 对其安全关键代码使用密码学安全伪随机数生成器 CSPRNG,在 GPU 上对整批参数进行高速处理。
- 灵活性:基于 PyTorch,工程师和研究人员可以通过将 Opacus 代码与 PyTorch 代码和纯 Python 代码进行融合和匹配,快速为其 idea 构建原型。
- 生产效率:Opacus 库附带教程、在训练开始前提示不兼容层的辅助函数,以及自动重构机制。
- 交互性:Opacus 可以追踪用户在任意给定时间所花费的隐私预算(DP 的核心数学概念),从而实现早停和实时监控。
Opacus 通过引入 PrivacyEngine abstraction 定义了一个轻量级的 API,它既可以追踪隐私预算,也能够处理模型梯度。该 API 无需直接调用,只需将其连接至标准 PyTorch 优化器。该 API 在后台运行,这使得利用 Opacus 进行模型训练变得非常简单。用户只需在训练代码开头添加以下代码即可:
model = Net()
optimizer = torch.optim.SGD(model.parameters(), lr=0.05)
privacy_engine = PrivacyEngine(
model,
batch_size=32,
sample_size=len(train_loader.dataset),
alphas=range(2,32),
noise_multiplier=1.3,
max_grad_norm=1.0,)
privacy_engine.attach(optimizer)# That's it! Now it's business as usual
训练结束,即得到一个标准的 PyTorch 模型,并且它没有部署私有模型的额外步骤或障碍:如果今天就想部署模型,你可以在使用 DP 训练模型后进行部署,且无需更改一行代码。
Opacus 库还包括预训练和微调模型、针对大型模型的教程,以及为隐私研究实验而设计的基础架构。
如何使用 Opacus 实现高速隐私训练?
Opacus 旨在保留每个训练样本的隐私,同时尽量不影响最终模型的准确率。Opacus 通过修改标准 PyTorch 优化器来实现这一点,以便在训练过程中实现(和度量)差分隐私。
具体来说,Opacus 的重点是差分隐私随机梯度下降(DP-SGD)。该算法的核心思想是:通过干预模型用来更新权重的参数梯度来保护训练集的隐私,而不是直接获取数据。通过在每次迭代中向梯度添加噪声,该库可以防止模型记住训练样本,同时还可以实现在 aggregate 中的学习。在训练过程的多个批次中,(无偏)噪声自然会被抵消。
但是,添加噪声需要一种微妙的平衡:噪声过多会破坏信号,过少则无法保证隐私。为了确定合适的规模,我们需要查看梯度范数。限制每个样本对梯度的影响非常重要,因为异常值的梯度大于大部分样本。但是异常值的隐私也需要得到保护,因为它们极有可能被模型记住。
因此,开发者计算 minibatch 中每个样本的梯度。开发者分别对每个梯度进行梯度裁剪,将其累积到一个梯度张量,然后再将噪声添加其中。
基于每个样本的计算是构建 Opacus 的最大障碍之一。PyTorch 的典型操作是利用 Autograd 计算整个批次的梯度张量,因为这对其他机器学习用例都有意义,并且可以优化性能。与之相比,基于每个样本的计算显然更具挑战性。
为了克服这一困难,开发者利用 Ian Goodfellow 2015 年提出的高效技术(参见论文《EFFICIENT PER-EXAMPLE GRADIENT COMPUTATIONS》),获取训练标准神经网络所需的全部梯度向量。
至于模型参数,则单独返回给定批次中每个样本的损失梯度,整个过程如下所示:
Opacus 工作流程图,其中计算了每个样本的梯度。
通过在运行各层时追踪一些中间量,Opacus 库支持使用适合内存的任何批量大小进行训练。这使得该方法比其他替代性 micro-batch 方法快了一个数量级。
此外,Opacus 库的安装和使用过程也比较简单,详情参见 GitHub 项目。
原文链接:https://ai.facebook.com/blog/in
二、安装使用
如何保护数据集隐私,是深度学习训练必须要解决的问题之一。
近日,Facebook开源了一个名为Opacus的高速库,该库可用于训练具有差分隐私的PyTorch模型。
差分隐私(Differential Privacy ,简称DP)是保护数据集隐私的重要工具。在此之前,谷歌、微软等也陆续开源了其核心产品使用的差分隐私库。
不同的是,与现有方法相比,Opacus具有可扩展性,支持大多数类型的PyTorch模型,并且只需对神经网络进行最少的代码更改。同时它允许客户端实时监控任何给定时间花费的隐私预算(Privacy Budget,DP中的核心数学概念)。
保护隐私的Opacus库
苹果在 2016 的开发者大会上首次提出了“差分隐私(DP)”的概念。即通过算法来打乱个体用户数据,让任何人都不能凭此追踪到具体的用户,但又可以允许机构成批分析数据以获得大规模的整体趋势用于机器学习。
换句话说,DP有效地限制了某些用于汇总数据集信息的算法。
Facebook在博客中称,他们通过计算精确答案并添加随机采样噪声来执行计数查询的差分隐私。以最简单的形式,可以使用从拉普拉斯分布中提取的噪声来实现隐私保护机制。
同时,他们在此基础上,引入差分私有随机梯度下降算法(Differentially Private Stochastic Gradient Descent,简称,DP-SGD),该算法通过小批量随机优化过程,使其具有差分私有性。
具体而言,Opacus库在保护数据隐私方面有以下特性:
-
速度:通过利用PyTorch中的Autograd Hook,Opacus可以计算成批的单个样本梯度,与微批量(Microbatching.)处理的现有DP库相比,实现了数量级的加速。
-
安全:Opacus对其安全关键代码使用加密的伪随机数生成器,在GPU上对整批参数进行高速处理。
-
灵活性:Opacus可以与Pythorch代码和纯Python代码相互混合和匹配,来快速构建工程师的想法原型。
-
生产力:Opacus附带教程,在训练开始前警告不兼容层的帮助函数,以及自动重构机制。
-
交互性:Opacus可以跟踪任何给定时间点花费的隐私预算,从而能够提早停止和实时监控。
Opacus通过引入Privacy Engine抽象定义了一个轻量级API,它既可以跟踪隐私预算,也可以处理模型的梯度。
同时,它的使用方法也非常简单,无需调用,用户只需要将Opacus附加到标准的PyTorch优化器上,并在训练代码的开头添加以下代码即可:
训练后,生成的就是一个标准的PyTorch模型,没有部署私有模型的任何额外步骤或障碍:在使用DP对其进行训练之后部署,无需更改任何代码。
另外,Opacus库还包括了经过预训练和微调的模型,用于大型模型的教程,以及用于隐私研究实验的基础结构。
高效训练的核心算法
Opacus能够在保护每个训练样本私密性的同时,限制对最终模型准确性的影响。它通过修改标准的PyTorch优化器来做到这一点。具体来说,是采用一种差分私有随机梯度下降的算法。
Facebook在博客中称,“该算法的核心思想是,我们可以通过干预模型来更新权重的参数梯度(而不是直接获取数据)来保护训练数据集的隐私。通过在每次迭代中将噪声添加到梯度中,可以防止模型记住其训练示例,同时仍可进行汇总学习,(无偏)噪声自然会在训练中看到的许多批次而抵消。
需要强调的是,由于PyTorch优化器可以查看参数梯度,因此,可以直接将噪声添加到其中,并允许任何人简单地训练差分私有模型,其代码如下:
此外,噪声的定量问题是这一解决方案的关键。因为过多的噪声会破坏信号,过少的噪声将无法保证隐私。
为了确定合适的比例,首先要查看小批量中梯度的最大范数。因为离群值比大多数样本具有更大的梯度,需要确保这些异常值的私密性。
通常研究人员会采用微批量(microbatch)的方法。该方法是在小批量处理中计算每个样本的梯度,分别裁剪梯度,将其累积回单个梯度张量,然后将噪声添加到总和中。该方法具有简单性和兼容性和特点,但计算每个样本的梯度,限制了训练的速度。
在这里,Opacus采用了另一种更高效的解决方案。该方案由谷歌于2015年提出,其论文为《EFFICIENT PER-EXAMPLE GRADIENT COMPUTATIONS》,对于所有ML样本而言,它可以计算整个批次的梯度向量,同时优化性能。
Facebook在论文中表示,他们在训练标准神经网络时,采用该方法获得了所有需要的梯度向量。该方法的不同之处在于,对于模型参数,可以单独返回给定批次中每个示例的损耗梯度,如下所示:
通过在运行各层时跟踪一些中间数量,可以使用适合内存的任何批次大小进行训练,这种方法比其他软件包中的微批量方法快一个数量级。
安装方法
目前,这款Opacus高速库已经在Github开源。所有机器学习从业者和差异隐私科学家都可以下载使用。
Github地址:https://github.com/pytorch/opacus
Facebook表示,他们希望通过开发Opacus之类的PyTorch工具,可以使对此类隐私保护资源的访问民主化,同时通过使用PyTorch的更快,更灵活的平台弥合了安全社区和通用机器学习工程师之间的鸿沟。
用户可以直接从Github安装最新版本,代码如下:
git clone
cd opacus
pip install -e .
另外,需要注意的是,要使用差分隐私训练模型,需要声明PrivacyEngine,并将其附加到优化器,再运行,例如:
引用链接:雷锋网雷锋网雷锋网