Differenzielle Privatsphäre: Vergleichen von Bibliotheken



Dieser Artikel ist ein praktischer, angewandter Vergleich. Es werden nicht alle Details der unterschiedlichen Privatsphäre erläutert. Wenn Sie diese Frage genauer untersuchen möchten, lesen Sie die Links am Ende des Artikels.

Das Versprechen des differenzierten Datenschutzes (genauer gesagt des ε-differentiellen Datenschutzes ) besteht darin, einen messbaren Weg zu finden, um den Datenschutz und die Genauigkeit von Daten bei der Veröffentlichung aggregierter Daten in privaten Datensätzen in Einklang zu bringen.

Angenommen, Sie haben einen Einstellungsregler:

  • Nehmen Sie es nach links - bewahren Sie die vollständige Privatsphäre von Personen, deren Daten sich im Datensatz befinden, und fügen Sie gleichzeitig den Informationen viel Rauschen hinzu, wodurch die Genauigkeit der aggregierten Statistiken verringert wird.
  • Bewegen Sie sich nach rechts - Sie erhalten die perfekte Genauigkeit der aggregierten Statistiken, zeigen jedoch private Informationen zu Personen aus dem Datensatz an.

Unter dem Strich kann der Schieberegler an einer beliebigen Stelle auf der Skala verschoben werden, wobei eine Waage für einen bestimmten Anwendungsfall ausgewählt wird.

Wie Daten konvertiert werden


ε-differentielle Privatsphäre ermöglicht es Ihnen, ein Gleichgewicht zwischen Privatsphäre und Genauigkeit zu finden, indem Sie einen positiven Wert von ε (epsilon) verwenden. Wenn ε klein ist, behalten wir mehr Privatsphäre bei, beeinträchtigen jedoch die Genauigkeit. Wenn ε groß ist, leidet die Privatsphäre aus Gründen der Genauigkeit. Der Wert von & epsi; variiert von 0 bis unendlich.

In differenziellen Datenschutzbibliotheken werden verschiedene Methoden verwendet, die den epsilon-Parameter als Eingabewert verwenden und zufälliges Rauschen hinzufügen, das umgekehrt proportional zu ε im Originaldatensatz ist . Das heißt, je kleiner das Epsilon ist, desto mehr Rauschen wird hinzugefügt.

Einige Bibliotheken verwenden zusätzliche Parameter und bieten Tools zur zufälligen Rauschunterdrückung an, z. B. die Wahrscheinlichkeitsdichte, aus der Zufallszahlen entnommen werden (Laplace-Verteilung, Normalverteilung usw.).

Einige Bibliotheken implementieren auch das Konzept des Datenschutzbudgets (Datenschutzbudget): Bei jedem Aufruf der Funktion verwendet die Bibliothek den vom Benutzer festgelegten Betrag des vorab zugewiesenen Budgets. Die theoretische Grundlage lautet wie folgt: Mit jeder Veröffentlichung neuer Daten ist es wahrscheinlicher, dass ein Angreifer Informationen über Personen aus dem Datensatz extrahiert. Mithilfe des Datenschutzbudgets kann die Bibliothek anstelle eines Werts einen Fehler zurückgeben.

Vergleich von Differential Privacy Libraries


Vergleichen Sie die drei Bibliotheken und ihre Arbeit mit einem bestimmten Datensatz mit denselben Methoden:


Wir werden sehen, wie sich die Größe des Datensatzes und das gewünschte Maß an Datenschutz (epsilon) auf die Genauigkeit auswirken. In jedem Fall werden wir die Ergebnisse vergleichen, die in verschiedenen Bibliotheken erhalten wurden.

Datensatz testen


Wir werden zufällig einen Datensatz generieren, der eine Spalte mit den Gewichten von Personen in Kilogramm enthält. Wir werden diese Informationen vertraulich behandeln, sie müssen geheim gehalten werden. Jedes Gewicht wird als reelle Zahl mit doppeltem Wert dargestellt.

Die Gewichte wurden gemäß der Normalverteilung erzeugt, bei der das durchschnittliche Gewicht im Datensatz 70 kg und die Standardabweichung 30 beträgt.

Für die Zwecke der Studie werden wir es ermöglichen, Datensätze unterschiedlicher Größe zu generieren.

Hier ist der Code zur Gewichtsgenerierung:

import random

def generate_weight_dataset(dataset_size):
    outpath = f"weights_{dataset_size}.csv"
    mu = 70  # mean
    sigma = 30  # standard deviation
    with open(outpath, "w+") as fout:
        for i in range(dataset_size):
            random_weight = random.normalvariate(mu, sigma)  # normal distribution
            random_weight = abs(random_weight)  # make sure weights are positive
            random_weight = round(random_weight, 1)  # round to 1 decimal digit
            line = f"{random_weight}"
            print(line, file=fout)

Bei einem Datensatz mit einer Größe von 10.600 sehen die generierten Daten folgendermaßen aus:


Der tatsächliche Durchschnitt sollte bei 70 liegen, da wir die Normalverteilung mit verwendet haben mean=70. Dies ist jedoch kein exakter Wert, da Gewichte zufällig generiert werden. Außerdem enthält unser Datensatz keine negativen Gewichte, und die Endwerte werden nach dem Dezimalpunkt auf eine Stelle gerundet. In diesem Fall betrug der tatsächliche Durchschnittswert 70,34812570579449 und die Standardabweichung 29,4838380395675765.

Bitte beachten Sie, dass wir dies alles getan haben, um den Datensatz wie einen Satz realer Daten aussehen zu lassen. Die Verteilung der Werte hat keinen Einfluss auf die Schätzungen, die wir diskutieren werden.

Bibliotheken verwenden


Schauen wir uns eine Möglichkeit an, Bibliotheken zu verwenden. Wir werden sie immer mit denselben Parametern vergleichen. In allen Fällen gibt es beispielsweise den gleichen Eingabe-Epsilon-Wert. Für Messungen verwenden wir den Durchschnittswert des Datensatzes. Alle betrachteten Bibliotheken implementieren Operationen wie Durchschnitt, Abweichung, Summe und andere unter Verwendung zufälliger Rauschadditionsmechanismen. Oft verwendet der Laplace-Mechanismus. Die Durchschnittswertsuchoperation wird willkürlich gewählt. Sie ermöglicht es uns, alle Operationen mit demselben Mechanismus zu testen.

Wir berechnen den Durchschnittswert der differenziellen Privatsphäre mithilfe der IBM Bibliothek (Python):

import diffprivlib.tools.utils

def dp_mean(weights, epsilon, upper):
    dp_mean = diffprivlib.tools.utils.mean(weights, epsilon=epsilon, range=upper)
    return dp_mean

upper = max(weights)
epsilon = 1.0
dpm = dp_mean(weights, epsilon, upper)

Das gleiche gilt für die Google-Bibliothek (C ++):

double dp_mean(std::list<double> weights, double epsilon, double lower, double upper) {
    std::unique_ptr<differential_privacy::BoundedMean<double>> mean_algorithm = 
    differential_privacy::BoundedMean<double>::Builder()
    .SetEpsilon(epsilon)
    .SetLower(0.0)
    .SetUpper(upper)
    .Build()
    .ValueOrDie();

    for (auto weight : weights) {
        mean_algorithm->AddEntry(weight);
    }
    double privacy_budget = 1.0;
    auto output = mean_algorithm->PartialResult(privacy_budget).ValueOrDie();
    return differential_privacy::GetValue<double>(output);
}

Bitte beachten Sie, dass wir für jede Nutzung der Google-Bibliothek ein gesamtes Datenschutzbudget von 1,0 verwenden. Die IBM Bibliothek akzeptiert diesen Parameter nicht.

Nun berechnen wir den Durchschnittswert des DP mit diffpriv (Sprache R):

library(diffpriv)

dp_mean <- function(xs, epsilon) {
  ## a target function we'd like to run on private data X, releasing the result
  target <- function(X) mean(X)

  ## target seeks to release a numeric, so we'll use the Laplace mechanism---a
  ## standard generic mechanism for privatizing numeric responses
  n <- length(xs)
  mech <- DPMechLaplace(target = target, sensitivity = 1/n, dims = 1)

  r <- releaseResponse(mech, privacyParams = DPParamsEps(epsilon = epsilon), X = xs)
  r$response
}

Wie Datenschutz die Genauigkeit beeinflusst


Die Genauigkeit des Durchschnittswerts kann gemessen werden, indem einfach die Differenz zwischen dem durchschnittlichen DP und dem tatsächlichen Durchschnitt berechnet wird.

Mal sehen, was mit der Genauigkeit des Durchschnittsgewichts passiert, wenn sich das Epsilon ändert. Da wir zufälliges Rauschen hinzufügen, führen wir 100 Läufe aus und berechnen den mittleren quadratischen Fehler, um zu überprüfen, ob die Bibliothek verzerrte Werte generiert.

Das Ergebnis sollte zeigen, dass der Fehler (die Differenz zwischen dem tatsächlichen Durchschnitt und dem durchschnittlichen DP) umgekehrt proportional zu Epsilon ist. Wenn epsilon groß ist, sollte der Fehler klein sein und umgekehrt. Ich habe Epsilon-Werte im Bereich von e ^ -10 bis e ^ 10 getestet (beachten Sie die logarithmische Skala).

Der Test verwendete einen Datensatz mit einer beliebigen konstanten Größe von 10.600 Zeilen.

Standart Fehler



In der Tat nimmt der Fehler mit zunehmendem Epsilon ab. Interessanterweise hat die Google-Bibliothek eine Standardfehlergrenze, wenn der Epsilon-Wert sehr klein ist. In den IBM- und diffpriv-Bibliotheken wird dies nicht beobachtet.

Der Grund dafür liegt im Quellcode-Snippet der Google-Bibliothek. In numerischen Mechanismen.h:

 //      . 
 //   privacy_budget   .  
  //     (0, 1],        .
  // ,         
  //    ,           0.5 ( 0.4,  0.6  ..).
  virtual double AddNoise(double result, double privacy_budget) {
    if (privacy_budget <= 0) {
      privacy_budget = std::numeric_limits<double>::min();
    }
    //  snapping-,  
    // (2012, "On Significance of the Least Significant Bits For Differential Privacy").
    double noise = distro_->Sample(1.0 / privacy_budget);
    double noised_result =
        Clamp<double>(LowerBound<double>(), UpperBound<double>(), result) +
        noise;
    double nearest_power = GetNextPowerOfTwo(diversity_ / privacy_budget);
    double remainder =
        (nearest_power == 0.0) ? 0.0 : fmod(noised_result, nearest_power);
    double rounded_result = noised_result - remainder;
    return ClampDouble<double>(LowerBound<double>(), UpperBound<double>(),
                               rounded_result);
  }

In bounded-mean.h:

   //  :    .
    double normalized_sum = sum_mechanism_->AddNoise(
        sum - raw_count_ * midpoint_, remaining_budget);
    double average = normalized_sum / noised_count + midpoint_;
    AddToOutput<double>(&output, Clamp<double>(lower_, upper_, average));
    return output;

Wenn Epsilon sehr klein ist (ungefähr weniger als 0,013), ist die Diskrepanz (gleich 1 / Epsilon) extrem groß und das hinzugefügte Rauschen ist Null. Daher gibt die Bibliothek einen durchschnittlichen DP zurück, der der Mitte des für den Durchschnitt verwendeten Bereichs entspricht. Dies wird durch den Beginn der roten Linie im Diagramm erklärt.

Diffpriv hat einen kleineren mittleren quadratischen Fehler, was eine bessere Genauigkeit im Vergleich zu zwei anderen Bibliotheken bedeutet, wenn dasselbe Epsilon verwendet wird. Um sicherzustellen, dass diffpriv das gleiche Maß an Datenschutz wie Wettbewerber bietet, muss ein niedrigerer Epsilon-Wert angewendet werden.

Standardabweichung


Die Standardabweichung des Fehlers für 100 Läufe sieht folgendermaßen aus:


In der Google-Bibliothek mit einem kleinen Epsilon-Wert ist die Abweichung ungefähr konstant und holt dann schnell die IBM-Bibliothek ein. Im Allgemeinen hat diffpriv eine geringere Standardabweichung als andere.

Wie sich die Größe des Datensatzes auf die Genauigkeit auswirkt


Wir sprechen über die Auswirkung des Durchschnittswerts des DP auf die Genauigkeit.

Eines der Risiken eines kleinen Datensatzes besteht darin, dass Einzelpersonen einen großen Einfluss auf den aggregierten Wert haben, der der Durchschnitt ist. Wenn sich also nur eine Person im Datensatz befindet, entspricht der perfekt genaue Durchschnittswert dem genauen Gewicht dieser Person. Lassen Sie uns sehen, wie Bibliotheken dazu beitragen, die Offenlegung einzelner Informationen beim Ändern der Größe von Datensätzen zu vermeiden.

Wir werden einen beliebigen konstanten Wert von epsilon 1.0 verwenden.

Standart Fehler



Wenn die Größe des Datensatzes abnimmt, nimmt der mittlere quadratische Fehler zu und umgekehrt. Es war erwartet. Wenn es nur wenige Personen gibt, möchte ich mehr Lärm hinzufügen, um die Offenlegung privater Daten zu vermeiden. Der Nachteil ist, dass für kleine Datensätze aggregierte Werte aufgrund der sehr geringen Genauigkeit völlig irrelevant werden können.

Bei diffpriv hängt der Standardfehler wesentlich stärker von Änderungen der Größe des Datasets ab. Das Muster ist jedoch wie in den beiden anderen Bibliotheken immer noch erkennbar: Wenn der Datensatz wächst, nimmt der mittlere quadratische Fehler ab. Dies gilt jedoch nur für Datensätze mit bis zu 30.000 Zeilen. Dann ändert sich der Fehler wenig. Achten Sie auch auf den abnormalen Abfall der Fehlergröße, wenn die Größe des Datensatzes 17 912 beträgt.

Standardabweichung


Sie könnten sich fragen, wie sich die Größe des hinzugefügten Rauschens über 100 Läufe für eine bestimmte Datensatzgröße geändert hat? Um dies zu beantworten, zeichnen wir die Standardabweichung des Fehlers für 100 Läufe für jede Datengröße.


Bei kleinen Datensätzen ist die Fehlerabweichung höher. Die Google-Bibliothek weist jedoch einen Peak mit einem Datensatz der Größe 6 auf. Kleinere und größere Datensätze weisen weniger Schwankungen auf. Die IBM Bibliothek beobachtet dies nicht, der Graph ist näher an der Linearität.

Auch hier hat diffpriv im Allgemeinen eine geringere Standardabweichung.

Fazit


Wir haben gesehen, dass die in drei verschiedenen Bibliotheken für unterschiedliche Privatsphäre ergriffenen Maßnahmen den ursprünglichen Erwartungen entsprachen. Unterschiedliche Implementierungen führen jedoch zu unterschiedlichen Ergebnissen, insbesondere in Grenzfällen, wie dies bei sehr kleinen Epsilon-Werten und der Google-Bibliothek der Fall ist. In der Praxis sollte dies nicht stören, da Benutzer keine sehr großen und sehr kleinen Datensätze sowie sehr kleine Epsilon-Werte verwenden. In solchen Situationen kann die Bibliothek jedoch eine Warnung ausgeben.

Das Verhalten von diffpriv unterscheidet sich deutlich von den beiden anderen Bibliotheken. Wir empfehlen daher, den epsilon-Wert sorgfältig auszuwählen.

Verweise



All Articles