趋近智
在联邦学习中,仅仅平均模型更新并不能本质上阻止关于单个客户端数据的信息泄露。梯度直接来源于数据,因此特别敏感。观察这些更新的攻击者,尤其是在多轮次中,可能会推断出训练数据集的属性。差分隐私(DP)提供了一个正式的框架,通过添加受控噪声来降低这种风险,从而难以判断特定个体的数据是否参与了训练过程。差分隐私机制专门应用于联邦系统中梯度更新的方法在此详细介绍。
其核心思想是在梯度用于更新全局模型之前对其进行扰动。这种扰动必须经过仔细校准,以提供可量化 (quantization)的隐私保障,通常表示为 -DP,同时最大限度地减少对模型收敛和最终准确性的负面影响。
在添加噪声之前,我们必须解决一个重要问题:梯度函数的敏感性。敏感性,在差分隐私的背景下,衡量的是当数据集中添加或移除一个数据点时,函数输出(此处为梯度)可能发生的最大变化。对于深度学习 (deep learning)模型,梯度范数( 范数,)会根据数据点和模型状态而有很大差异。理论上,它可能是无界的,这使得标准差分隐私机制无法校准噪声。
为了设定有限敏感性,我们引入梯度裁剪。在客户端发送其梯度 之前(或者在服务器聚合之前,这取决于差分隐私模型),其 范数会被限制在一个预设的阈值 内。
裁剪操作定义为:
如果原始梯度的范数 小于或等于 ,则梯度保持不变。如果范数超过 ,梯度向量 (vector)将被按比例缩小,使其范数恰好变为 。
选择裁剪阈值S: 选择一个合适的 值是一个实际考量。过小的 可能会过度扭曲范数较大的梯度,这可能导致训练速度变慢或产生偏差。过大的 可能需要添加更多噪声才能达到所需的隐私级别(因为敏感性更高)。常见的启发式方法包括在最初的几轮非隐私训练中计算梯度范数,并将 设置为观察到的范数的中位数或其他百分位数。
通过裁剪,我们确保在聚合中使用的任何梯度贡献的最大 范数是 。这种有界敏感性对于噪声的校准至关重要。
通过裁剪确定了已知的敏感性 后,我们现在可以添加噪声以实现差分隐私。对于像梯度这样的实值向量 (vector)输出,高斯机制常被采用。它将从零均值高斯分布中提取的噪声添加到(可能已求和的)裁剪梯度的每个分量中。
考虑中央差分隐私模型,其中服务器聚合来自 个选定客户端的裁剪梯度 并添加噪声。服务器首先计算裁剪梯度的和:
该和 对于添加或移除一个客户端的整个数据集(假设每个客户端基于其本地数据计算其梯度 )的 敏感性是 。这是因为更改一个客户端的数据最多只能使其裁剪梯度 的 范数改变 。
为了实现该和的 -差分隐私,高斯机制添加噪声 ,其中 是单位矩阵,噪声尺度 与隐私参数 (parameter) 、 以及敏感性 相关。一个常用的校准方式是:
服务器计算带噪声的和:
最后,服务器使用该带噪声和的平均值来更新全局模型:
这里, 是服务器端的学习率。
裁剪和噪声添加可以在不同的点发生,从而产生不同的隐私模型:
本地差分隐私(LDP): 每个客户端在将其梯度发送到服务器之前,先对其自身梯度进行裁剪并添加噪声。
中央差分隐私(CDP): 客户端裁剪其梯度并将裁剪后的梯度 发送到服务器(如果服务器不完全信任单个裁剪梯度,传输过程中可能会通过SMC或HE等加密保护)。服务器聚合这些裁剪梯度,然后向总和添加噪声 。
本地差分隐私和中央差分隐私之间的选择取决于特定的威胁模型以及对服务器的信任假设。当主要目标是保护最终模型或聚合更新免受推断时,通常偏好中央差分隐私,前提是服务器正确执行噪声添加。
我们来总结一下带有中央差分隐私的联邦平均(常被称为DP-FedAvg)的流程:
这是一个简化的Python代码示例(使用类似NumPy的语法),展示了中央差分隐私的核心客户端侧裁剪和服务器侧噪声添加:
import numpy as np
# --- 客户端侧 ---
def client_update(model_weights, local_data, learning_rate, clipping_threshold_S):
# 假设 compute_gradient 根据 local_data 和 model_weights 计算梯度 g
gradient = compute_gradient(model_weights, local_data, learning_rate)
# 裁剪梯度
gradient_norm = np.linalg.norm(gradient)
clipping_factor = min(1.0, clipping_threshold_S / (gradient_norm + 1e-6)) # 添加一个 epsilon 以增加稳定性
clipped_gradient = gradient * clipping_factor
return clipped_gradient
# --- 服务器侧 ---
def server_aggregate_and_noise(clipped_gradients, clipping_threshold_S, epsilon, delta, server_learning_rate, current_weights):
# 对来自 K 个客户端的裁剪梯度求和
# clipped_gradients 是一个 numpy 数组列表
gradient_sum = np.sum(clipped_gradients, axis=0)
num_clients = len(clipped_gradients)
# 根据 S、epsilon、delta 计算噪声尺度
# 简化版的 sigma 计算(实际计算涉及 sqrt(2*log(1.25/delta))/epsilon )
# 这仅为示例;实践中请使用专业的隐私核算库。
noise_multiplier = 0.5 # 占位符值,表示与 epsilon、delta 的关系
noise_std_dev = noise_multiplier * clipping_threshold_S
# 生成高斯噪声
noise = np.random.normal(0, noise_std_dev, gradient_sum.shape)
# 将噪声添加到总和
noisy_gradient_sum = gradient_sum + noise
# 更新全局模型(对带噪声的总和求平均)
new_weights = current_weights - server_learning_rate * (noisy_gradient_sum / num_clients)
return new_weights
# 示例用法
# S = 1.0 # 裁剪阈值
# epsilon = 1.0
# delta = 1e-5
# ... 从客户端获取裁剪后的梯度 ...
# new_global_weights = server_aggregate_and_noise(list_of_clipped_gradients, S, epsilon, delta, eta, global_weights)
注意: 从 计算
noise_multiplier(与 相关)需要使用隐私核算库(如TensorFlow Privacy、Opacus或Google的DP库)进行细致实现,以确保差分隐私保障成立,特别是在考虑多轮次的组合时。
添加噪声不可避免地会影响学习过程。更高的隐私(更小的 、更小的 )需要更多的噪声,这可能会阻碍收敛速度并可能降低模型的最终准确性。反之,减少噪声会提高准确性,但会削弱隐私保障。
隐私参数 (parameter) 与模型准确性之间的一个典型关系(在 和其他超参数 (hyperparameter)固定时)。随着 减小(隐私性更强),准确性由于噪声增加而趋于下降。
调整超参数 、、、学习率以及通信轮次是为特定应用找到隐私与效用之间可接受平衡的关键。多轮训练中隐私预算 的管理将在下一节关于组合定理中进行讨论。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•