Closed Red9th closed 7 months ago
作者您好,非常感谢您的分享。当阅读您的代码时,我遇到了一些理解上的困难,因为刚刚开始学习这部分内容,可能会有一些过于简单的问题,希望您能够谅解并给予指导。
以您代码中 Laplace 机制的部分为例:
- 关于敏感度的计算,在您发布的知乎文章中,推荐了 Federated Learning with Differential Privacy: Algorithms and Performance Analysis 这篇文章,其中敏感度的计算方式为 2Cm,而您的代码中有乘 lr,为什么需要乘 lr 呢?
- 客户端代码中调用 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这篇文章是对参数添加噪声,而本仓库是对梯度添加噪声,添加的对象不一样,那么计算的敏感度是不同的,关于这种方式可以参考以下两篇文章:
2、本仓库的Epsilon是指训练T轮的每个客户端的全局Epsilon,不是单轮的Epsilon。换句话说,本仓库假设每个客户端只有Epsilon这么多的隐私预算,每次参与训练扣除相应的预算,扣除的方式是按照平均方式扣除。
感谢您的回复。阅读这两篇文章后,我还是有一些困惑。
在 Optimizing the Numbers of Queries and Replies in Convex Federated Learning with Differential Privacy (以下简称 [1]) 中确实是在对梯度添加噪声,如图:
但是在 [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] 中却是在对参数添加噪声,如图:
我想知道为什么两者添加噪声的对象并不相同,但是 [1] 却从 [2] 中引用了 $\frac{2ξ_1}{d_i}$ 这个结果。
再进一步,在 [1] 中,虽然其是对梯度添加噪声,但是最后 Lapalace 分布的 Scale 值中也并没有 lr,如图:
可以看到公式中并没有 $\eta$ 的身影。
这是为什么呢,是我看漏或看错什么地方了吗?
再次感谢您的开源,期待您的回复!
感谢您的回复。阅读这两篇文章后,我还是有一些困惑。
在 Optimizing the Numbers of Queries and Replies in Convex Federated Learning with Differential Privacy (以下简称 [1]) 中确实是在对梯度添加噪声,如图:
但是在 [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] 中却是在对参数添加噪声,如图:
我想知道为什么两者添加噪声的对象并不相同,但是 [1] 却从 [2] 中引用了 2ξ1di 这个结果。
再进一步,在 [1] 中,虽然其是对梯度添加噪声,但是最后 Lapalace 分布的 Scale 值中也并没有 lr,如图:
可以看到公式中并没有 η 的身影。
这是为什么呢,是我看漏或看错什么地方了吗?
再次感谢您的开源,期待您的回复!
请注意你要计算敏感度的对象: 如果你要针对“梯度”计算敏感度,那么当然其得到的敏感度中没有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/
作者您好,非常感谢您的分享。当阅读您的代码时,我遇到了一些理解上的困难,因为刚刚开始学习这部分内容,可能会有一些过于简单的问题,希望您能够谅解并给予指导。
以您代码中 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 呢?期待您的回复!