Skip to content

Commit ce7ac32

Browse files
escanorlight11-svgGaijin-01
authored andcommitted
docs: Clarify scalar PLD scope for correlated multi-output Gaussian releases
1 parent d433f30 commit ce7ac32

1 file changed

Lines changed: 23 additions & 0 deletions

File tree

python/dp_accounting/dp_accounting/pld/privacy_loss_distribution.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1003,6 +1003,29 @@ def from_gaussian_mechanism(
10031003
"Connect the Dots" algorithm. See Sections 2.1 and 2.2 of supplementary
10041004
material for more details.
10051005
1006+
CORRELATED MULTI-OUTPUT RELEASES
1007+
If the mechanism releases k outputs jointly (M(D) = (f_1(D)+Z_1,...,f_k(D)+Z_k)
1008+
with independent noise Z_i ~ N(0, sigma^2) and coupling f_j(D) = c_j*f_1(D)),
1009+
and an adversary observes all outputs simultaneously, the exact epsilon-hockey-stick
1010+
divergence equals the scalar value at EFFECTIVE SENSITIVITY Delta_eff:
1011+
1012+
Delta_eff = Delta * np.linalg.norm(c_vec) # c_vec = [c_1, ..., c_k]
1013+
1014+
This follows from the joint PLRV L(x) = (Delta/sigma^2)*sum(c_j*x_j) - Delta^2*||c||^2/(2*sigma^2)
1015+
being Gaussian N(Delta_eff^2/(2*sigma^2), Delta_eff^2/sigma^2) under D.
1016+
1017+
Example (2-client FL with coupling c=0.5):
1018+
# INCORRECT for jointly observed outputs:
1019+
delta = from_gaussian_mechanism(sigma, Delta).get_delta_for_epsilon(eps)
1020+
1021+
# CORRECT:
1022+
import numpy as np
1023+
c_vec = [1.0, 0.5] # client coupling coefficients
1024+
Delta_eff = Delta * np.linalg.norm(c_vec)
1025+
delta = from_gaussian_mechanism(sigma, Delta_eff).get_delta_for_epsilon(eps)
1026+
1027+
See https://doi.org/10.5281/zenodo.20078486 for proof and experiments.
1028+
10061029
Args:
10071030
standard_deviation: the standard_deviation of the Gaussian distribution.
10081031
sensitivity: the sensitivity of function f. (i.e. the maximum absolute

0 commit comments

Comments
 (0)