本文档假定您已经熟悉差分隐私,并且已经确定您希望使用 TF Privacy 在您的模型中实施差分隐私保证。如果您不熟悉差分隐私,请查看 概述页面。安装 TF Privacy 后,请按照以下步骤开始使用
1. 选择现有优化器的差分隐私版本
如果您当前正在使用 TensorFlow 优化器,您很可能希望选择一个名称为 DPKeras*Optimizer
的优化器,例如 [DPKerasAdamOptimizer
] 在 [TF Privacy
] 中。
或者,您可以尝试使用矢量化优化器,例如 [tf_privacy.VectorizedDPKerasAdamOptimizer
],以实现可能的加速(以每秒全局步骤衡量)。实验表明,使用矢量化优化器可以提供不一致的加速,但尚未完全了解。与以前一样,您很可能希望使用与您现在使用的优化器类似的优化器。这些矢量化优化器使用 Tensorflow 的 vectorized_map
运算符,该运算符可能无法与其他一些 Tensorflow 运算符一起使用。如果您的情况如此,请 在 TF Privacy GitHub 存储库中打开一个问题。
2. 计算输入小批量的损失
计算输入小批量的损失时,请确保它是一个向量,每个示例包含一个条目,而不是将其聚合为一个标量。这是必要的,因为 DP-SGD 必须能够计算单个微批量的损失。
3. 训练您的模型
使用 DP 优化器(步骤 1)和矢量化损失(步骤 2)训练您的模型。有两种方法可以做到这一点
- 在调用
Model.fit
之前,将优化器和损失作为参数传递给Model.compile
。 - 在编写自定义训练循环时,在矢量化损失上使用
Optimizer.minimize()
。
完成此操作后,建议您调整超参数。有关完整演练,请参阅 分类隐私教程
4. 调整 DP-SGD 超参数
所有 tf_privacy
优化器都接受三个额外的超参数
l2_norm_clip
或 \(C\) - 剪切范数(每个小批量计算的每个单个梯度的最大欧几里得 (L2) 范数)。noise_multiplier
或 \(σ\) - 标准差与剪切范数的比率。num_microbatches
或 \(B\) - 将每个小批量拆分的微批数量。
通常,有效标准差 \(σC / B\) 越低,训练后的模型在其评估指标上的性能就越好。
三个新的 DP-SGD 超参数具有以下影响和权衡
- 微批数量 \(B\):通常,增加此值会提高效用,因为它会降低噪声的标准差。但是,它会减慢训练速度(以时间衡量)。
- 剪切范数 \(C\):由于噪声的标准差随 \(C\) 缩放,因此最好将 \(C\) 设置为梯度范数的某个分位数(例如,中位数、第 75 个百分位数、第 90 个百分位数)。\(C\) 的值过大,会不必要地增加大量噪声。
- 噪声乘数 \(σ\):在三个超参数中,隐私量仅取决于噪声乘数。噪声乘数越大,获得的隐私就越多;但是,这也伴随着效用的损失。
这些关于效用、隐私和速度(以每秒步骤衡量)的权衡总结如下
按照以下建议找到最佳超参数
- 如上所述,将 \(C\) 设置为分位数。值 1.00 通常效果很好。
- 将 \(B\) 设置为 1,以实现最大训练速度。
- 进行实验以找到仍然可以提供可接受效用的 σ 的最大值。通常,观察到 0.01 或更低的值效果很好。
- 找到合适的 \(σ\) 值后,将 \(B\) 和 \(σ\) 同时按一个常数缩放,以实现合理的隐私级别。