Privacidad diferencial: comparación de bibliotecas



Este artículo es una comparación práctica y aplicada. No explica todos los detalles de la privacidad diferencial. Si desea estudiar esta pregunta más profundamente, consulte los enlaces al final del artículo.

La promesa de la privacidad diferencial (más precisamente, la privacidad ε-diferencial ) es proporcionar una forma medible de equilibrar la privacidad y la precisión de los datos cuando se agregan datos públicamente en conjuntos de datos privados.

Digamos que tiene un control deslizante de configuración:

  • llévelo a la izquierda: mantenga la privacidad completa de las personas cuyos datos están en el conjunto de datos, pero al mismo tiempo agregue mucho ruido a la información, reduciendo la precisión de las estadísticas agregadas;
  • mover hacia la derecha: obtiene la precisión perfecta de las estadísticas agregadas, pero revela información privada sobre las personas del conjunto de datos.

La conclusión es que el control deslizante se puede traducir a cualquier punto de la escala, eligiendo un balance para un caso de uso específico.

Cómo se convierten los datos


La privacidad diferencial ε le permite encontrar un equilibrio entre la privacidad y la precisión utilizando un valor positivo de ε (epsilon). Si ε es pequeño, mantenemos más privacidad, pero perjudicamos la precisión. Si ε es grande, la privacidad se ve afectada en aras de la precisión. El valor de ε varía de 0 a infinito.

Las bibliotecas de privacidad diferencial implementan diferentes técnicas que toman el parámetro epsilon como un valor de entrada y agregan ruido aleatorio inverso a ε a los valores en el conjunto de datos original . Es decir, cuanto más pequeño es el épsilon, más ruido se agrega.

Algunas bibliotecas usan parámetros adicionales y ofrecen herramientas de control de ruido aleatorio, por ejemplo, la densidad de probabilidad de la que se toman números aleatorios (distribución de Laplace, distribución normal, etc.).

Algunas bibliotecas también implementan el concepto del presupuesto de privacidad (presupuesto de privacidad): cada vez que se llama a la función, la biblioteca utiliza la cantidad de presupuesto preasignado establecido por el usuario. La base teórica es la siguiente: con cada publicación de nuevos datos, es más probable que un atacante extraiga información sobre las personas del conjunto de datos. Y con la ayuda del presupuesto de privacidad, la biblioteca puede devolver un error en lugar de un valor.

Comparación de bibliotecas de privacidad diferencial


Compare las tres bibliotecas y su trabajo con un conjunto de datos dado usando los mismos métodos:


Veremos cómo el tamaño del conjunto de datos y el nivel deseado de privacidad (epsilon) afectan la precisión. En cada caso, compararemos los resultados obtenidos en diferentes bibliotecas.

Conjunto de datos de prueba


Generaremos aleatoriamente un conjunto de datos que contenga una columna con los pesos de las personas en kilogramos. Consideraremos esta información confidencial, debe mantenerse en secreto. Cada peso se representa como un número real de doble valor.

Los pesos se generaron de acuerdo con la distribución normal, en la que el peso promedio en el conjunto de datos es de 70 kg y la desviación estándar es de 30.

Para los fines del estudio, haremos posible generar conjuntos de datos de diferentes tamaños.

Aquí está el código de generación de peso:

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)

Para un conjunto de datos de tamaño 10,600, los datos generados se verán así:


El promedio real debería ser alrededor de 70 porque usamos la distribución normal con mean=70. Sin embargo, este no es un valor exacto porque los pesos se generan aleatoriamente. Además, no hay pesos negativos en nuestro conjunto de datos, y los valores finales se redondean a un dígito después del punto decimal. En este caso, el valor promedio real fue 70.34812570579449, y la desviación estándar fue 29.488380395675765.

Tenga en cuenta que hicimos todo esto solo para hacer que el conjunto de datos parezca un conjunto de datos reales. La distribución de valores no afectará las estimaciones que discutiremos.

Usando bibliotecas


Veamos una forma de usar bibliotecas. Siempre los compararemos usando los mismos parámetros. Por ejemplo, en todos los casos habrá el mismo valor épsilon de entrada. Para las mediciones, usaremos el valor promedio del conjunto de datos. Todas las bibliotecas consideradas implementan operaciones tales como promedio, desviación, suma y otras utilizando mecanismos aleatorios de adición de ruido. A menudo se utiliza el mecanismo de Laplace. La operación de búsqueda de valor promedio se elige arbitrariamente, nos permite probar todas las operaciones utilizando el mismo mecanismo.

Calculamos el valor promedio de la privacidad diferencial utilizando la biblioteca de 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)

Lo mismo con la biblioteca de 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);
}

Tenga en cuenta que utilizamos un presupuesto de privacidad completo de 1.0 para cada uso de la Biblioteca de Google. Y la biblioteca de IBM no acepta este parámetro.

Ahora calculamos el valor promedio del DP usando diffpriv (lenguaje 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
}

Cómo la privacidad afecta la precisión


La precisión del valor promedio se puede medir simplemente calculando la diferencia entre el DP promedio y el promedio real.

Veamos qué sucede con la precisión del peso promedio cuando cambia el épsilon. Como estamos agregando ruido aleatorio, ejecutaremos 100 corridas y calcularemos el error cuadrado medio para verificar si la biblioteca está generando valores distorsionados.

El resultado debería demostrar que el error (la diferencia entre el promedio real y el promedio DP) es inversamente proporcional al épsilon. Si epsilon es grande, entonces el error debería ser pequeño, y viceversa. Probé valores de épsilon que van desde e ^ -10 hasta e ^ 10 (tenga en cuenta la escala logarítmica).

La prueba utilizó un conjunto de datos de tamaño constante arbitrario de 10.600 líneas.

Error estándar



De hecho, el error disminuye a medida que aumenta el épsilon. Curiosamente, la biblioteca de Google tiene un límite de error estándar si el valor de épsilon es muy pequeño. En las bibliotecas IBM y diffpriv esto no se observa.

La razón de esto radica en el fragmento de código fuente de la biblioteca de Google. En mecanismos-numéricos. 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);
  }

En acotado-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;

Cuando el épsilon es muy pequeño (aproximadamente menos de 0.013), la discrepancia (igual a 1 / épsilon) será extremadamente grande y el ruido agregado será cero. Por lo tanto, la biblioteca devuelve un DP promedio equivalente a la mitad del rango utilizado para el promedio. Esto se explica por el comienzo de la línea roja en el gráfico.

Diffpriv tiene un error cuadrado medio más pequeño, lo que significa una mejor precisión en comparación con otras dos bibliotecas cuando se usa el mismo épsilon. Para garantizar que diffpriv tenga el mismo nivel de privacidad que los competidores, se debe aplicar un valor épsilon más bajo.

Desviación Estándar


La desviación estándar del error para 100 ejecuciones se ve así:


En la biblioteca de Google, con un pequeño valor de épsilon, la desviación es aproximadamente constante y luego se pone al día rápidamente con la biblioteca de IBM. En general, diffpriv tiene una desviación estándar más pequeña que otras.

Cómo el tamaño del conjunto de datos afecta la precisión


Estamos hablando del efecto sobre la precisión del valor promedio del DP.

Uno de los riesgos de un pequeño conjunto de datos es que las personas tienen un gran impacto en el valor agregado, que es el promedio. Por lo tanto, si solo hay una persona en el conjunto de datos, el valor promedio perfectamente exacto será igual al peso exacto de esa persona. Veamos cómo las bibliotecas ayudan a evitar la divulgación de información individual al cambiar el tamaño de los conjuntos de datos.

Utilizaremos un valor constante arbitrario de epsilon 1.0.

Error estándar



A medida que disminuye el tamaño del conjunto de datos, aumenta el error cuadrático medio y viceversa. Era esperado. Si hay pocas personas, entonces quiero agregar más ruido para evitar la divulgación de datos privados. La desventaja es que para los conjuntos de datos pequeños, los valores agregados pueden volverse completamente irrelevantes debido a la muy baja precisión.

En cuanto a diffpriv, el error estándar depende mucho más de los cambios en el tamaño del conjunto de datos. Sin embargo, el patrón sigue siendo notable, como en las otras dos bibliotecas: a medida que crece el conjunto de datos, el error de la media cuadrática disminuye. Pero esto es cierto solo para conjuntos de datos de hasta aproximadamente 30,000 líneas. Entonces el error cambia poco. Además, preste atención a la caída anormal en el tamaño del error cuando el tamaño del conjunto de datos es 17 912.

Desviación Estándar


¿Podría preguntar cómo cambió el tamaño del ruido agregado en más de 100 ejecuciones para un tamaño de conjunto de datos dado? Para responder a esto, grafiquemos la desviación estándar del error para 100 ejecuciones para cada tamaño de datos.


Con conjuntos de datos pequeños, la variación en el error es mayor. Sin embargo, la Biblioteca de Google tiene un pico con un conjunto de datos de tamaño 6. Los conjuntos de datos más pequeños y más grandes tienen menos fluctuación. La biblioteca de IBM no observa esto, el gráfico está más cerca de lineal.

Nuevamente, diffpriv generalmente tiene una desviación estándar más baja.

Conclusión


Vimos que las medidas tomadas en tres bibliotecas diferentes de privacidad diferencial estaban en línea con las expectativas iniciales. Sin embargo, diferentes implementaciones conducen a diferentes resultados, especialmente en casos límite, como es el caso con valores muy pequeños de epsilon y la biblioteca de Google. En la práctica, esto no debería interferir, porque los usuarios no utilizarán conjuntos de datos muy grandes y muy pequeños, así como valores muy pequeños de epsilon. Sin embargo, en tales situaciones, la biblioteca puede emitir una advertencia.

El comportamiento de diffpriv difiere notablemente de las otras dos bibliotecas, por lo que le recomendamos que elija cuidadosamente el valor de epsilon.

Referencias



All Articles