Dwork Roth 2014 - Report Noisy Max and the Exponential Mechanism

Summary

Two ways to privately select the best item from a discrete set. Report Noisy Max adds to each of counts and returns only the argmax index: -DP though the count vector has sensitivity . The exponential mechanism samples with probability for an arbitrary utility : -DP, and with high probability the chosen element’s utility is within of optimal. Instantiating noisy max with Gumbel noise reproduces the exponential mechanism exactly.

Overview

“Differentially private selection”: the space of outcomes is discrete and the task is to produce a “best” answer. Adding noise directly to the value is wrong when value and utility are not on a common scale (pricing, structured outputs), and releasing all noisy counts wastes budget. The principle at work in Report Noisy Max is information minimization: release only the index of the winner, not the noisy counts.

Main Content

Report Noisy Max (pp. 34-37)

Example 3.4 - Most common medical condition (p. 35)

Setup. Which of conditions is (approximately) most common in respondents’ medical histories? For each condition, query whether each individual has ever received the diagnosis. An individual can have many conditions, so the vector of counts has high sensitivity (). Solution. Add noise to each count and publish only the index of the maximum (the noisy counts are not released; the “winning” count can be released at no extra privacy cost). The noise scale is independent of .

Report Noisy Max

Given counting queries: add independent noise to each count and return the index of the largest noisy count (ties ignored).

Claim 3.9 (p. 35)

Report Noisy Max is -differentially private.

The exponential mechanism (Sec. 3.4, pp. 37-41)

Motivation. Designed for situations where adding noise directly to the computed quantity “can completely destroy its value”, for example setting a price in an auction.

Example 3.5 - Pumpkins (p. 37)

Setup. An abundant supply of pumpkins and four bidders A, F, I, K; A, F, I each bid $1.00 and K bids $3.01. “What is the optimal price?” The text states: at $3.01 revenue is $3.01; at $3.00 and at $1.00 revenue is $3.00; at $3.02 the revenue is zero. Lesson. Adding a small amount of positive noise to the optimal price can drive revenue to zero, so noise must be added to the choice via a utility function, not to the optimal value. Arithmetic caveat (own check): revenue at a price is ; at $1.00 all four bidders buy, giving $4.00, which is the true revenue maximiser; the text’s “$3.00 at $1.00” appears to be a slip. The fragility at $3.02 (zero revenue) is unaffected.

Definition 3.4 - Exponential mechanism (pp. 37-38)

Given a range and a utility function mapping database/output pairs to scores, define the sensitivity of with respect to its database argument (it may be arbitrarily sensitive in ):

The exponential mechanism selects and outputs with probability proportional to .

Why the factor 2. The naive privacy loss is , but this overlooks the normalisation term, which can change when one person raises some utilities and lowers others. The actual mechanism reserves half the privacy budget for the normaliser. The range must be independent of the data (pumpkins: the price grid must not depend on actual bids, else some price has non-zero weight on one database and zero on a neighbour). The mechanism may be infeasible to implement if is super-polynomially large.

Theorem 3.10 (pp. 38-39)

The exponential mechanism preserves -differential privacy.

Theorem 3.11 - Utility of the exponential mechanism (pp. 39-40)

Fix a database and let with . Then

Corollary 3.12 (p. 40)

Since : . The returned element is inferior to optimal by more than an additive with only exponentially small probability.

Example 3.6 - Best of two (pp. 40-41)

Setup. Which of two conditions is more common? True counts are for condition A and for B. Utility is the count, . Exponential mechanism. Corollary 3.12 gives . Report Noisy Max is harder to analyse (it needs the probability- case where A’s noise is positive and B’s is negative). One-sided variant. Add one-sided exponential noise with parameter (monotonic utility) or (non-monotone) and report the argmax; then A is exponentially less likely than B in .

Theorem 3.13 (p. 41)

Report One-Sided Noisy Arg-Max, run with parameter , is -differentially private. (Proof “almost identical” to Report Noisy Max, losing a factor of 2 when the utility is not monotonic. A utility is monotonic if adding an element cannot decrease it, as with counting queries or revenue from a fixed price.)

Remark 3.1 - Gumbel max trick (p. 41)

Report noisy max with Laplace or exponential noise has guarantees similar to the exponential mechanism but yields distinct distributions. Instantiating it with Gumbel noise samples exactly from the exponential-mechanism distribution (folklore in machine learning).

Examples

Pumpkin pricing by the exponential mechanism (own simulation). Price grid (data independent), utility = revenue, (the maximum price: adding one bidder can add at most the price). The true optimum is revenue $4.00 at price $1.00.

mean revenue of sampled price$3.01 (revenue zero)
0.51.270.37
21.490.30
102.510.06

With only four bidders and the privacy-utility trade-off is harsh, since one bidder can swing revenue by up to the whole price range; accuracy improves with more bidders. Best-of-two numerics. With , the exponential-mechanism bound is ; a Monte Carlo of Report Noisy Max with Laplace noise gives an error probability near (much smaller than the loose bound); one-sided exponential noise gives , matching simulation ().

import numpy as np
rng = np.random.default_rng(0)
 
def exponential_mechanism(utilities, eps, sensitivity, rng=rng):
    """Sample index i with prob proportional to exp(eps*u_i/(2*sensitivity))."""
    logits = eps * np.asarray(utilities, float) / (2 * sensitivity)
    p = np.exp(logits - logits.max()); p /= p.sum()
    return rng.choice(len(p), p=p)
 
def exponential_mechanism_gumbel(utilities, eps, sensitivity, rng=rng):
    """Same distribution via report-noisy-max with Gumbel noise (Remark 3.1)."""
    scores = eps * np.asarray(utilities, float) / (2 * sensitivity) + rng.gumbel(size=len(utilities))
    return int(np.argmax(scores))
 
def report_noisy_max(counts, eps, rng=rng):
    return int(np.argmax(np.asarray(counts, float) + rng.laplace(0, 1/eps, len(counts))))
 
u = np.array([0, 3, 10, 10.5, 2])
a = np.bincount([exponential_mechanism(u, 1.0, 1.0) for _ in range(50_000)], minlength=5) / 50_000
b = np.bincount([exponential_mechanism_gumbel(u, 1.0, 1.0) for _ in range(50_000)], minlength=5) / 50_000
print(a.round(3), b.round(3))        # the two empirical distributions agree

Connections

  • Marketing measurement. Choosing the top-performing creative, geo or channel from many candidates without publishing every score is differentially private selection; the winner can be released at cost regardless of the number of candidates, while releasing all scores would cost sensitivity- noise. Compare the winner’s-curse problem: a naive “best of ” estimate is biased upward (Multiple Testing Corrections); privatising the selection adds noise but the selection bias remains if the winning noisy value is reported.
  • The pumpkin example is the pricing analogue of budget optimisation: noise on the decision (via utility) is safer than noise on an optimum that is brittle.

See Also