Privacidade diferencial: comparando bibliotecas



Este artigo é uma comparação prática e aplicada. Não explica todos os detalhes da privacidade diferencial. Se você deseja estudar essa questão mais profundamente, consulte os links no final do artigo.

A promessa de privacidade diferencial (mais precisamente, privacidade diferencial ε ) é fornecer uma maneira mensurável de equilibrar a privacidade e a precisão dos dados ao publicar dados agregados em conjuntos de dados privados.

Digamos que você tenha um controle deslizante de configurações:

  • leve-o para a esquerda - mantenha a privacidade completa das pessoas cujos dados estão no conjunto de dados, mas ao mesmo tempo acrescente muito ruído às informações, reduzindo a precisão das estatísticas agregadas;
  • mova para a direita - você obtém a precisão perfeita das estatísticas agregadas, mas revela informações privadas sobre as pessoas do conjunto de dados.

A conclusão é que o controle deslizante pode ser convertido em qualquer lugar da balança, escolhendo um saldo para um caso de uso específico.

Como os dados são convertidos


A privacidade com diferencial ε permite encontrar um equilíbrio entre privacidade e precisão usando um valor positivo de ε (epsilon). Se ε for pequeno, mantemos mais privacidade, mas prejudicamos a precisão. Se ε for grande, a privacidade sofrerá por uma questão de precisão. O valor de ε varia de 0 ao infinito.

As bibliotecas de privacidade diferencial implementam técnicas diferentes que tomam o parâmetro epsilon como um valor de entrada e adicionam ruído aleatório inverso a ε aos valores no conjunto de dados original . Ou seja, quanto menor o epsilon, mais ruído é adicionado.

Algumas bibliotecas usam parâmetros adicionais e oferecem ferramentas aleatórias de controle de ruído, por exemplo, a densidade de probabilidade da qual os números aleatórios são obtidos (distribuição de Laplace, distribuição normal, etc.).

Algumas bibliotecas também implementam o conceito de orçamento de privacidade (orçamento de privacidade): cada vez que você chama a função na biblioteca, é usado o valor definido pelo usuário do orçamento pré-alocado. A base teórica é a seguinte: com toda publicação de novos dados, é mais provável que um invasor extraia informações sobre pessoas do conjunto de dados. E com a ajuda do orçamento de privacidade, a biblioteca pode retornar um erro em vez de um valor.

Comparação de bibliotecas diferenciais de privacidade


Compare as três bibliotecas e seu trabalho com um determinado conjunto de dados usando os mesmos métodos:


Veremos como o tamanho do conjunto de dados e o nível de privacidade desejado (epsilon) afetam a precisão. Em cada caso, compararemos os resultados obtidos em diferentes bibliotecas.

Conjunto de dados de teste


Geraremos aleatoriamente um conjunto de dados contendo uma coluna com o peso das pessoas em quilogramas. Consideraremos essas informações confidenciais, elas devem ser mantidas em segredo. Cada peso é representado como um número real de valor duplo.

Os pesos foram gerados de acordo com a distribuição normal, na qual o peso médio no conjunto de dados é de 70 kg e o desvio padrão é 30.

Para os objetivos do estudo, possibilitaremos a geração de conjuntos de dados de tamanhos diferentes.

Aqui está o código de geração 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 um conjunto de dados de tamanho 10.600, os dados gerados terão a seguinte aparência:


A média real deve ficar em torno de 70 porque usamos a distribuição normal com mean=70. No entanto, esse não é um valor exato porque os pesos são gerados aleatoriamente. Além disso, não há pesos negativos em nosso conjunto de dados e os valores finais são arredondados para um dígito após o ponto decimal. Nesse caso, o valor médio real era 70.34812570579449 e o desvio padrão era 29.488380395675765.

Observe que fizemos tudo isso apenas para fazer o conjunto de dados parecer um conjunto de dados reais. A distribuição de valores não afetará as estimativas que discutiremos.

Usando bibliotecas


Vamos ver uma maneira de usar bibliotecas. Nós sempre os comparamos usando os mesmos parâmetros. Por exemplo, em todos os casos, haverá o mesmo valor de epsilon de entrada. Para medições, usaremos o valor médio do conjunto de dados. Todas as bibliotecas consideradas implementam operações como média, desvio, soma e outras usando mecanismos aleatórios de adição de ruído. Freqüentemente usado o mecanismo de Laplace. A operação de busca de valor médio é escolhida arbitrariamente, pois permite testar todas as operações usando o mesmo mecanismo.

Calculamos o valor médio da privacidade diferencial usando a biblioteca 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)

O mesmo com a biblioteca do 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);
}

Observe que usamos um orçamento de privacidade inteiro de 1,0 para todos os usos da Biblioteca do Google. E a biblioteca IBM não aceita esse parâmetro.

Agora calculamos o valor médio do DP usando diffpriv (idioma 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
}

Como a privacidade afeta a precisão


A precisão do valor médio pode ser medida simplesmente calculando a diferença entre o DP médio e a média real.

Vamos ver o que acontece com a precisão do peso médio quando o epsilon muda. Como adicionamos ruído aleatório, executaremos 100 execuções e calcularemos o erro quadrático médio para verificar se a biblioteca está gerando valores distorcidos.

O resultado deve demonstrar que o erro (a diferença entre a média real e a DP média) é inversamente proporcional ao epsilon. Se o epsilon for grande, o erro deverá ser pequeno e vice-versa. Testei valores epsilon variando de e ^ -10 a e ^ 10 (observe a escala logarítmica).

O teste usou um conjunto de dados de tamanho constante arbitrário de 10.600 linhas.

Erro padrão



De fato, o erro diminui à medida que o epsilon aumenta. Curiosamente, a biblioteca do Google tem um limite de erro padrão se o valor epsilon for muito pequeno. Nas bibliotecas IBM e diffpriv, isso não é observado.

O motivo disso está no snippet de código fonte da biblioteca do Google. Em numerical-engines.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);
  }

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

Quando o epsilon for muito pequeno (aproximadamente menor que 0,013), a discrepância (igual a 1 / epsilon) será extremamente grande e o ruído adicionado será zero. Portanto, a biblioteca retorna um DP médio equivalente ao meio do intervalo usado para a média. Isso é explicado pelo início da linha vermelha no gráfico.

O Diffpriv tem um erro quadrado médio menor, o que significa melhor precisão em comparação com outras duas bibliotecas ao usar o mesmo epsilon. Para garantir que o diffpriv tenha o mesmo nível de privacidade que os concorrentes, um valor menor de epsilon deve ser aplicado.

Desvio padrão


O desvio padrão do erro para 100 execuções é assim:


Na biblioteca do Google, com um pequeno valor de epsilon, o desvio é aproximadamente constante e rapidamente alcança a biblioteca da IBM. Em geral, o diffpriv tem um desvio padrão menor do que outros.

Como o tamanho do conjunto de dados afeta a precisão


Estamos falando do efeito sobre a precisão do valor médio do PD.

Um dos riscos de um pequeno conjunto de dados é que os indivíduos tenham um grande impacto no valor agregado, que é a média. Portanto, se houver apenas uma pessoa no conjunto de dados, o valor médio perfeitamente exato será igual ao peso exato dessa pessoa. Vamos ver como as bibliotecas ajudam a evitar a divulgação de informações individuais ao redimensionar conjuntos de dados.

Usaremos um valor constante arbitrário de epsilon 1.0.

Erro padrão



À medida que o tamanho do conjunto de dados diminui, o erro do quadrado médio aumenta e vice-versa. Era esperado. Se houver poucas pessoas, quero adicionar mais ruído para evitar a divulgação de dados privados. A desvantagem é que, para pequenos conjuntos de dados, os valores agregados podem se tornar completamente irrelevantes devido à precisão muito baixa.

Quanto ao diffpriv, o erro padrão depende muito mais das alterações no tamanho do conjunto de dados. No entanto, o padrão ainda é perceptível, como nas outras duas bibliotecas: à medida que o conjunto de dados cresce, o erro do quadrado médio diminui. Mas isso é verdade apenas para conjuntos de dados de até 30.000 linhas. Então o erro muda pouco. Além disso, preste atenção à queda anômala no tamanho do erro com o tamanho do conjunto de dados 17 912.

Desvio padrão


Você pode perguntar como o tamanho do ruído adicionado mudou em mais de 100 execuções para um determinado tamanho de conjunto de dados? Para responder a isso, vamos plotar o desvio padrão do erro para 100 execuções para cada tamanho de dados.


Com conjuntos de dados pequenos, a variação no erro é maior. No entanto, a Biblioteca do Google tem um pico com um conjunto de dados de tamanho 6. Conjuntos de dados menores e maiores têm menos flutuação. A biblioteca IBM não observa isso, o gráfico está mais próximo de linear.

Novamente, o diffpriv geralmente tem um desvio padrão mais baixo.

Conclusão


Vimos que as medidas tomadas em três bibliotecas diferentes de privacidade diferencial estavam alinhadas com as expectativas iniciais. No entanto, diferentes implementações levam a resultados diferentes, especialmente em casos de fronteira, como é o caso de valores epsilon muito pequenos e da biblioteca do Google. Na prática, isso não deve interferir, porque os usuários não usarão conjuntos de dados muito grandes e muito pequenos, bem como valores epsilon muito pequenos. No entanto, nessas situações, a biblioteca pode emitir um aviso.

O comportamento do diffpriv difere acentuadamente das outras duas bibliotecas, por isso recomendamos que você escolha cuidadosamente o valor epsilon.

Referências



All Articles