wenzhu23333 / Differential-Privacy-Based-Federated-Learning

Everything you want about DP-Based Federated Learning, including Papers and Code. (Mechanism: Laplace or Gaussian, Dataset: femnist, shakespeare, mnist, cifar-10 and fashion-mnist. )
GNU General Public License v3.0
348 stars 55 forks source link

关于计算噪声机制中 scale 值的问题 #21

Closed Red9th closed 7 months ago

Red9th commented 7 months ago

作者您好,非常感谢您的分享。当阅读您的代码时,我遇到了一些理解上的困难,因为刚刚开始学习这部分内容,可能会有一些过于简单的问题,希望您能够谅解并给予指导。

以您代码中 Laplace 机制的部分为例:

  1. 关于敏感度的计算,在您发布的知乎文章中,推荐了 Federated Learning with Differential Privacy: Algorithms and Performance Analysis 这篇文章,其中敏感度的计算方式为 $\frac{2C}{m}$,而您的代码中有乘 lr,为什么需要乘 lr 呢?
  2. 客户端代码中调用 Laplace 函数的部分是 np.random.laplace(loc=0, scale=sensitivity * self.noise_scale, size=v.shape),其中 noise_scale = self.args.dp_epsilon / self.times,在上面那篇文章中,是让 scale >= c * sensitivity / epsilon。为什么需要将计算方式改为敏感度乘以 epsilon / times 而不是除以 epsilon 呢?

期待您的回复!

wenzhu23333 commented 7 months ago

作者您好,非常感谢您的分享。当阅读您的代码时,我遇到了一些理解上的困难,因为刚刚开始学习这部分内容,可能会有一些过于简单的问题,希望您能够谅解并给予指导。

以您代码中 Laplace 机制的部分为例:

  1. 关于敏感度的计算,在您发布的知乎文章中,推荐了 Federated Learning with Differential Privacy: Algorithms and Performance Analysis 这篇文章,其中敏感度的计算方式为 2Cm,而您的代码中有乘 lr,为什么需要乘 lr 呢?
  2. 客户端代码中调用 Laplace 函数的部分是 np.random.laplace(loc=0, scale=sensitivity * self.noise_scale, size=v.shape),其中 noise_scale = self.args.dp_epsilon / self.times,在上面那篇文章中,是让 scale >= c * sensitivity / epsilon。为什么需要将计算方式改为敏感度乘以 epsilon / times 而不是除以 epsilon 呢?

期待您的回复!

1、Federated Learning with Differential Privacy: Algorithms and Performance Analysis这篇文章是对参数添加噪声,而本仓库是对梯度添加噪声,添加的对象不一样,那么计算的敏感度是不同的,关于这种方式可以参考以下两篇文章:

[3] Y. Zhou et al., "Optimizing the Numbers of Queries and Replies in Convex Federated Learning with Differential Privacy," in IEEE Transactions on Dependable and Secure Computing, vol. 20, no. 6, pp. 4823-4837, Nov. 1, 2023, doi: 10.1109/TDSC.2023.3234599

[4] Y. Zhou, et al., "Exploring the Practicality of Differentially Private Federated Learning: A Local Iteration Tuning Approach" in IEEE Transactions on Dependable and Secure Computing, doi: 10.1109/TDSC.2023.3325889

2、本仓库的Epsilon是指训练T轮的每个客户端的全局Epsilon,不是单轮的Epsilon。换句话说,本仓库假设每个客户端只有Epsilon这么多的隐私预算,每次参与训练扣除相应的预算,扣除的方式是按照平均方式扣除。

Red9th commented 7 months ago

感谢您的回复。阅读这两篇文章后,我还是有一些困惑。

在 Optimizing the Numbers of Queries and Replies in Convex Federated Learning with Differential Privacy (以下简称 [1]) 中确实是在对梯度添加噪声,如图: image

但是在 [1] 中有提出一句话:

According to [13], it can be proved that $\frac{2ξ_1}{d_i}$ is the $l_1$-sensitivity of $\nabla F_i$ based on Assumption 1.

引用中的 [13] 就是 Federated Learning with Differential Privacy: Algorithms and Performance Analysis (以下简称 [2]),那么也就是 [2] 是对梯度即 $\nabla F_i$ 添加噪声。

而实际上在 [2] 中却是在对参数添加噪声,如图: image

我想知道为什么两者添加噪声的对象并不相同,但是 [1] 却从 [2] 中引用了 $\frac{2ξ_1}{d_i}$ 这个结果。

再进一步,在 [1] 中,虽然其是对梯度添加噪声,但是最后 Lapalace 分布的 Scale 值中也并没有 lr,如图: image

可以看到公式中并没有 $\eta$ 的身影。

这是为什么呢,是我看漏或看错什么地方了吗?

再次感谢您的开源,期待您的回复!

wenzhu23333 commented 7 months ago

感谢您的回复。阅读这两篇文章后,我还是有一些困惑。

在 Optimizing the Numbers of Queries and Replies in Convex Federated Learning with Differential Privacy (以下简称 [1]) 中确实是在对梯度添加噪声,如图: image

但是在 [1] 中有提出一句话:

According to [13], it can be proved that 2ξ1di is the l1-sensitivity of ∇Fi based on Assumption 1.

引用中的 [13] 就是 Federated Learning with Differential Privacy: Algorithms and Performance Analysis (以下简称 [2]),那么也就是 [2] 是对梯度即 ∇Fi 添加噪声。

而实际上在 [2] 中却是在对参数添加噪声,如图: image

我想知道为什么两者添加噪声的对象并不相同,但是 [1] 却从 [2] 中引用了 2ξ1di 这个结果。

再进一步,在 [1] 中,虽然其是对梯度添加噪声,但是最后 Lapalace 分布的 Scale 值中也并没有 lr,如图: image

可以看到公式中并没有 η 的身影。

这是为什么呢,是我看漏或看错什么地方了吗?

再次感谢您的开源,期待您的回复!

请注意你要计算敏感度的对象: 如果你要针对“梯度”计算敏感度,那么当然其得到的敏感度中没有lr这一项,相应的,你要在梯度使用之前添加相应Scale的噪声。 如果你针对“参数”计算敏感度,那么得到的敏感度中是含有lr这一项的,相应的,你要在参数使用之前添加相应的Scale的噪声。

前者在执行梯度下降时,会对噪声向量乘以lr,因此这两种方式本质上是等价的,如果你计算每个客户端上传时的噪声方差,你会发现这两种方式所得到的方差相同。

参考:https://yangwenzhuo.top/2022/05/03/%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%EF%BC%88%E5%9B%9B%EF%BC%89/