Confidentialité différentielle: comparaison des bibliothèques



Cet article est une comparaison pratique et appliquée. Il n'explique pas tous les détails de la confidentialité différentielle. Si vous souhaitez approfondir cette question, reportez-vous aux liens à la fin de l'article.

La promesse d'une confidentialité différentielle (plus précisément, la confidentialité ε-différentielle ) est de fournir un moyen mesurable d'équilibrer la confidentialité et la précision des données lors de l'agrégation publique de données dans des ensembles de données privés.

Disons que vous avez un curseur de paramètres:

  • prendre Ă  gauche - garder l'intimitĂ© totale des personnes dont les donnĂ©es se trouvent dans l'ensemble de donnĂ©es, mais en mĂŞme temps ajouter beaucoup de bruit Ă  l'information, rĂ©duisant l'exactitude des statistiques agrĂ©gĂ©es;
  • dĂ©placez-vous vers la droite - vous obtenez la prĂ©cision parfaite des statistiques agrĂ©gĂ©es, mais vous rĂ©vĂ©lez des informations privĂ©es sur les personnes de l'ensemble de donnĂ©es.

L'essentiel est que le curseur peut être traduit n'importe où sur l'échelle, en choisissant un équilibre pour un cas d'utilisation spécifique.

Comment les données sont converties


La confidentialité différentielle ε vous permet de trouver un équilibre entre la confidentialité et la précision en utilisant une valeur positive de ε (epsilon). Si ε est petit, nous conservons plus d'intimité, mais altérons la précision. Si ε est grand, la confidentialité en souffre par souci de précision. La valeur de ε varie de 0 à l'infini.

Les bibliothèques de confidentialité différentielle implémentent différentes techniques qui prennent le paramètre epsilon comme valeur d'entrée et ajoutent un bruit aléatoire inverse de ε aux valeurs de l'ensemble de données d'origine . C'est-à-dire que plus l'epsilon est petit, plus le bruit est ajouté.

Certaines bibliothèques utilisent des paramètres supplémentaires et proposent des outils de contrôle du bruit aléatoire, par exemple, la densité de probabilité à partir de laquelle des nombres aléatoires sont tirés (distribution de Laplace, distribution normale, etc.).

Certaines bibliothèques mettent également en œuvre le concept de budget de confidentialité (budget de confidentialité): à chaque appel de la fonction, la bibliothèque utilise le montant du budget préalloué défini par l'utilisateur. La base théorique est la suivante: à chaque publication de nouvelles données, il est plus probable qu'un attaquant extrait des informations sur les personnes de l'ensemble de données. Et avec l'aide du budget de confidentialité, la bibliothèque peut renvoyer une erreur au lieu d'une valeur.

Comparaison des bibliothèques de confidentialité différentielles


Comparez les trois bibliothèques et leur travail avec un ensemble de données donné en utilisant les mêmes méthodes:


Nous verrons comment la taille de l'ensemble de données et le niveau de confidentialité souhaité (epsilon) affectent la précision. Dans chaque cas, nous comparerons les résultats obtenus dans différentes bibliothèques.

Ensemble de données de test


Nous allons générer au hasard un ensemble de données contenant une colonne avec les poids des personnes en kilogrammes. Nous considérerons ces informations comme confidentielles, elles doivent être gardées secrètes. Chaque poids est représenté par un nombre réel à double valeur.

Les poids ont été générés conformément à la distribution normale, dans laquelle le poids moyen dans l'ensemble de données est de 70 kg et l'écart-type est de 30.

Aux fins de l'étude, nous allons permettre de générer des ensembles de données de différentes tailles.

Voici le code de génération de poids:

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)

Pour un ensemble de données de taille 10,600, les données générées ressembleront à ceci:


La moyenne réelle devrait être d'environ 70 car nous avons utilisé la distribution normale avec mean=70. Cependant, ce n'est pas une valeur exacte car les poids sont générés de manière aléatoire. De plus, il n'y a pas de pondération négative dans notre jeu de données et les valeurs finales sont arrondies à un chiffre après la virgule décimale. Dans ce cas, la valeur moyenne réelle était de 70,34812570579449 et l'écart-type était de 29,488380395675765.

Veuillez noter que nous avons fait tout cela juste pour que l'ensemble de données ressemble à un ensemble de données réelles. La distribution des valeurs n'affectera pas les estimations dont nous discuterons.

Utilisation de bibliothèques


Voyons comment utiliser les bibliothèques. Nous les comparerons toujours en utilisant les mêmes paramètres. Par exemple, dans tous les cas, il y aura la même valeur epsilon d'entrée. Pour les mesures, nous utiliserons la valeur moyenne de l'ensemble de données. Toutes les bibliothèques considérées implémentent des opérations telles que la moyenne, l'écart, la somme et d'autres en utilisant des mécanismes d'ajout de bruit aléatoire. Souvent utilisé le mécanisme de Laplace. L'opération de recherche de valeur moyenne est choisie arbitrairement, elle nous permet de tester toutes les opérations en utilisant le même mécanisme.

Nous calculons la valeur moyenne de la confidentialité différentielle à l'aide de la bibliothèque IBM (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)

La même chose avec la bibliothèque Google (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);
}

Veuillez noter que nous utilisons un budget de confidentialité complet de 1,0 pour chaque utilisation de la bibliothèque Google. Et la bibliothèque IBM n'accepte pas ce paramètre.

Maintenant, nous calculons la valeur moyenne du DP en utilisant diffpriv (langage 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
}

Comment la confidentialité affecte la précision


La précision de la valeur moyenne peut être mesurée en calculant simplement la différence entre le DP moyen et la moyenne réelle.

Voyons ce qui se passe avec la précision du poids moyen lorsque l'epsilon change. Puisque nous ajoutons du bruit aléatoire, nous allons exécuter 100 exécutions et calculer l'erreur quadratique moyenne pour vérifier si la bibliothèque génère des valeurs déformées.

Le résultat doit démontrer que l'erreur (la différence entre la moyenne réelle et la moyenne DP) est inversement proportionnelle à epsilon. Si epsilon est grand, l'erreur doit être faible et vice versa. J'ai testé des valeurs epsilon allant de e ^ -10 à e ^ 10 (notez l'échelle logarithmique).

Le test a utilisé un ensemble de données de taille constante arbitraire de 10 600 lignes.

Erreur standard



En effet, l'erreur diminue à mesure que epsilon augmente. Fait intéressant, la bibliothèque Google a une limite d'erreur standard si la valeur epsilon est très petite. Dans les bibliothèques IBM et diffpriv, cela n'est pas observé.

La raison en est l'extrait de code source de la bibliothèque Google. En numérique-mechans.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);
  }

Dans 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;

Lorsque epsilon est très petit (environ moins de 0,013), l'écart (égal à 1 / epsilon) sera extrêmement important et le bruit ajouté sera nul. Par conséquent, la bibliothèque renvoie un DP moyen équivalent au milieu de la plage utilisée pour la moyenne. Cela s'explique par le début de la ligne rouge sur le graphique.

Diffpriv a une erreur quadratique moyenne plus petite, ce qui signifie une meilleure précision par rapport à deux autres bibliothèques lors de l'utilisation du même epsilon. Pour garantir que diffpriv a le même niveau de confidentialité que ses concurrents, une valeur epsilon inférieure doit être appliquée.

Écart-type


L'écart type de l'erreur pour 100 exécutions ressemble à ceci:


À la bibliothèque Google, avec une petite valeur epsilon, l'écart est à peu près constant, puis rattrape rapidement la bibliothèque IBM. En général, diffpriv a un écart-type plus petit que les autres.

Comment la taille de l'ensemble de données affecte la précision


Nous parlons de l'effet sur la précision de la valeur moyenne du DP.

L'un des risques d'un petit ensemble de données est que les individus ont un impact important sur la valeur agrégée, qui est la moyenne. Ainsi, s'il n'y a qu'une seule personne dans l'ensemble de données, alors la valeur moyenne parfaitement précise sera égale au poids exact de cette personne. Voyons comment les bibliothèques aident à éviter la divulgation d'informations individuelles lors du redimensionnement des ensembles de données.

Nous utiliserons une valeur constante arbitraire d'epsilon 1.0.

Erreur standard



À mesure que la taille de l'ensemble de données diminue, l'erreur quadratique moyenne augmente, et vice versa. C'était prévu. S'il y a peu de gens, je veux ajouter plus de bruit pour éviter la divulgation de données privées. L'inconvénient est que pour les petits ensembles de données, les valeurs agrégées peuvent devenir complètement inutiles en raison de la très faible précision.

Quant à diffpriv, l'erreur standard dépend beaucoup plus des changements de taille de l'ensemble de données. Cependant, le modèle est toujours perceptible, comme dans les deux autres bibliothèques: à mesure que l'ensemble de données augmente, l'erreur quadratique moyenne diminue. Mais cela n'est vrai que pour les ensembles de données jusqu'à environ 30 000 lignes. Ensuite, l'erreur change peu. Faites également attention à la baisse anormale de la taille de l'erreur lorsque la taille de l'ensemble de données est de 17 912.

Écart-type


Vous pourriez vous demander comment la taille du bruit ajouté a changé sur 100 exécutions pour une taille de jeu de données donnée? Pour répondre à cette question, traçons l'écart-type de l'erreur pour 100 exécutions pour chaque taille de données.


Avec de petits ensembles de données, la variation d'erreur est plus élevée. Cependant, la bibliothèque Google a un pic avec un ensemble de données de taille 6. Les ensembles de données plus petits et plus grands ont moins de fluctuations. La bibliothèque IBM n'observe pas cela, le graphique est plus proche du linéaire.

Encore une fois, diffpriv a généralement un écart-type plus faible.

Conclusion


Nous avons vu que les mesures prises dans trois bibliothèques différentes de confidentialité différentielle étaient conformes aux attentes initiales. Cependant, différentes implémentations conduisent à des résultats différents, en particulier dans les cas limites, comme c'est le cas avec de très petites valeurs epsilon et la bibliothèque Google. En pratique, cela ne devrait pas interférer, car les utilisateurs n'utiliseront pas de très grands et très petits ensembles de données, ainsi que de très petites valeurs epsilon. Toutefois, dans de telles situations, la bibliothèque peut émettre un avertissement.

Le comportement de diffpriv diffère sensiblement des deux autres bibliothèques, nous vous recommandons donc de choisir soigneusement la valeur epsilon.

Références



All Articles