Implementar privacidade diferencial com privacidade do TensorFlow

Ver no TensorFlow.org Executar no Google Colab Ver fonte no GitHub Baixar caderno

Visão geral

Privacidade diferencial (DP) é uma estrutura para medir as garantias de privacidade fornecidas por um algoritmo. Através das lentes da privacidade diferencial, você pode projetar algoritmos de aprendizado de máquina que treinam modelos de forma responsável em dados privados. O aprendizado com privacidade diferencial fornece garantias mensuráveis ​​de privacidade, ajudando a mitigar o risco de exposição de dados de treinamento confidenciais no aprendizado de máquina. Intuitivamente, um modelo treinado com privacidade diferencial não deve ser afetado por nenhum exemplo de treinamento único ou pequeno conjunto de exemplos de treinamento em seu conjunto de dados. Isso ajuda a mitigar o risco de expor dados de treinamento confidenciais no ML.

A ideia básica dessa abordagem, chamada de gradiente descendente estocástico diferencialmente privado (DP-SGD), é modificar os gradientes usados ​​no gradiente descendente estocástico (SGD), que está no centro de quase todos os algoritmos de aprendizado profundo. Modelos treinados com DP-SGD fornecem garantias de privacidade diferencial comprovadas para seus dados de entrada. Existem duas modificações feitas no algoritmo SGD vanilla:

  1. Primeiro, a sensibilidade de cada gradiente precisa ser limitada. Em outras palavras, você precisa limitar o quanto cada ponto de treinamento individual amostrado em um minilote pode influenciar os cálculos de gradiente e as atualizações resultantes aplicadas aos parâmetros do modelo. Isso pode ser feito por recorte cada gradiente calculado em cada ponto de formação.
  2. Ruído aleatório é amostrado e adicionados aos gradientes cortadas para torná-lo estatisticamente impossível saber se ou não um ponto de dados específico foi incluído no conjunto de dados de treinamento, comparando as atualizações SGD se aplica quando se opera com ou sem esse ponto de dados particular no conjunto de dados de treinamento .

Isto usa tutoriais tf.keras para treinar uma rede neural convolutional (CNN) para reconhecer dígitos escritos à mão com o otimizador DP-SGD fornecido pelo TensorFlow biblioteca de Privacidade. A privacidade do TensorFlow fornece código que envolve um otimizador do TensorFlow existente para criar uma variante que implementa o DP-SGD.

Configurar

Comece importando as bibliotecas necessárias:

import tensorflow as tf
tf.compat.v1.disable_v2_behavior()

import numpy as np

tf.get_logger().setLevel('ERROR')
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/compat/v2_compat.py:101: disable_resource_variables (from tensorflow.python.ops.variable_scope) is deprecated and will be removed in a future version.
Instructions for updating:
non-resource variables are not supported in the long term

Instale a privacidade do TensorFlow.

pip install tensorflow-privacy
import tensorflow_privacy

from tensorflow_privacy.privacy.analysis import compute_dp_sgd_privacy

Carregar e pré-processar o conjunto de dados

Carregar o MNIST conjunto de dados e preparar os dados para o treinamento.

train, test = tf.keras.datasets.mnist.load_data()
train_data, train_labels = train
test_data, test_labels = test

train_data = np.array(train_data, dtype=np.float32) / 255
test_data = np.array(test_data, dtype=np.float32) / 255

train_data = train_data.reshape(train_data.shape[0], 28, 28, 1)
test_data = test_data.reshape(test_data.shape[0], 28, 28, 1)

train_labels = np.array(train_labels, dtype=np.int32)
test_labels = np.array(test_labels, dtype=np.int32)

train_labels = tf.keras.utils.to_categorical(train_labels, num_classes=10)
test_labels = tf.keras.utils.to_categorical(test_labels, num_classes=10)

assert train_data.min() == 0.
assert train_data.max() == 1.
assert test_data.min() == 0.
assert test_data.max() == 1.
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11493376/11490434 [==============================] - 0s 0us/step
11501568/11490434 [==============================] - 0s 0us/step

Defina os hiperparâmetros

Defina os valores dos hiperparâmetros do modelo de aprendizado.

epochs = 3
batch_size = 250

O DP-SGD tem três hiperparâmetros específicos de privacidade e um hiperamador existente que você deve ajustar:

  1. l2_norm_clip (flutuador) - O máximo Euclidiano (L2) de cada gradiente norma que é aplicado com os parâmetros de actualização do modelo. Este hiperparâmetro é usado para limitar a sensibilidade do otimizador a pontos de treinamento individuais.
  2. noise_multiplier (flutuador) - A quantidade de ruído amostrado e adicionado a gradientes durante o treino. Geralmente, mais ruído resulta em melhor privacidade (geralmente, mas não necessariamente, às custas de menor utilidade).
  3. microbatches (int) - Cada lote de dados são divididos em unidades mais pequenas chamadas microbatches. Por padrão, cada microlote deve conter um único exemplo de treinamento. Isso nos permite cortar gradientes por exemplo, em vez de depois de terem sido calculadas a média no minilote. Isso, por sua vez, diminui o efeito (negativo) do corte no sinal encontrado no gradiente e normalmente maximiza a utilidade. No entanto, a sobrecarga computacional pode ser reduzida aumentando o tamanho dos microlotes para incluir mais de um exemplo de treinamento. O gradiente médio nesses vários exemplos de treinamento é então cortado. O número total de exemplos consumidos em um lote, ou seja, um passo de gradiente descendente, permanece o mesmo. O número de microlotes deve dividir igualmente o tamanho do lote.
  4. learning_rate (float) - Este hiperparâmetro já existe no baunilha SGD. Quanto maior a taxa de aprendizado, mais importa cada atualização. Se as atualizações forem ruidosas (como quando o ruído aditivo é grande em comparação com o limite de corte), uma baixa taxa de aprendizado pode ajudar o procedimento de treinamento a convergir.

Use os valores de hiperparâmetros abaixo para obter um modelo razoavelmente preciso (95% de precisão do teste):

l2_norm_clip = 1.5
noise_multiplier = 1.3
num_microbatches = 250
learning_rate = 0.25

if batch_size % num_microbatches != 0:
  raise ValueError('Batch size should be an integer multiple of the number of microbatches')

Construir o modelo

Defina uma rede neural convolucional como o modelo de aprendizado.

model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(16, 8,
                           strides=2,
                           padding='same',
                           activation='relu',
                           input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPool2D(2, 1),
    tf.keras.layers.Conv2D(32, 4,
                           strides=2,
                           padding='valid',
                           activation='relu'),
    tf.keras.layers.MaxPool2D(2, 1),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(32, activation='relu'),
    tf.keras.layers.Dense(10)
])

Defina o otimizador e a função de perda para o modelo de aprendizado. Calcule a perda como um vetor de perdas por exemplo e não como a média em um minilote para suportar a manipulação de gradiente em cada ponto de treinamento.

optimizer = tensorflow_privacy.DPKerasSGDOptimizer(
    l2_norm_clip=l2_norm_clip,
    noise_multiplier=noise_multiplier,
    num_microbatches=num_microbatches,
    learning_rate=learning_rate)

loss = tf.keras.losses.CategoricalCrossentropy(
    from_logits=True, reduction=tf.losses.Reduction.NONE)

Treine o modelo

model.compile(optimizer=optimizer, loss=loss, metrics=['accuracy'])

model.fit(train_data, train_labels,
          epochs=epochs,
          validation_data=(test_data, test_labels),
          batch_size=batch_size)
Train on 60000 samples, validate on 10000 samples
Epoch 1/3
60000/60000 [==============================] - ETA: 0s - loss: 1.0431 - acc: 0.6637
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/engine/training.py:2470: UserWarning: `Model.state_updates` will be removed in a future version. This property should not be used in TensorFlow 2.0, as `updates` are applied automatically.
  warnings.warn('`Model.state_updates` will be removed in a future version. '
60000/60000 [==============================] - 93s 2ms/sample - loss: 1.0431 - acc: 0.6637 - val_loss: 0.4862 - val_acc: 0.8606
Epoch 2/3
60000/60000 [==============================] - 67s 1ms/sample - loss: 0.4733 - acc: 0.8779 - val_loss: 0.3887 - val_acc: 0.9063
Epoch 3/3
60000/60000 [==============================] - 67s 1ms/sample - loss: 0.4061 - acc: 0.9094 - val_loss: 0.3532 - val_acc: 0.9258
<keras.callbacks.History at 0x7f0bc449ffd0>

Meça a garantia de privacidade diferencial

Realize uma análise de privacidade para medir a garantia de DP alcançada por um algoritmo de treinamento. Conhecer o nível de DP alcançado permite a comparação objetiva de duas execuções de treinamento para determinar qual das duas preserva mais a privacidade. Em um nível alto, a análise de privacidade mede o quanto um adversário em potencial pode melhorar seu palpite sobre as propriedades de qualquer ponto de treinamento individual observando o resultado do procedimento de treinamento (por exemplo, atualizações e parâmetros do modelo).

Esta garantia é por vezes referido como o orçamento privacidade. Um orçamento de privacidade menor limita mais fortemente a capacidade de um adversário de melhorar sua suposição. Isso garante uma garantia de privacidade mais forte. Intuitivamente, isso ocorre porque é mais difícil para um único ponto de treinamento afetar o resultado do aprendizado: por exemplo, as informações contidas no ponto de treinamento não podem ser memorizadas pelo algoritmo de ML e a privacidade do indivíduo que contribuiu com esse ponto de treinamento para o conjunto de dados é preservado.

Neste tutorial, a análise de privacidade é realizada no âmbito de Privacidade Rényi Diferencial (RDP), que é um relaxamento da DP puro com base em este papel que é particularmente adequado para a DP-SGD.

Duas métricas são usadas para expressar a garantia DP de um algoritmo de ML:

  1. Delta (\(\delta\)) - limites a probabilidade da garantia de privacidade não segurando. Uma regra prática é defini-lo como menor que o inverso do tamanho do conjunto de dados de treinamento. Neste tutorial, ela é definida como 10 ^ -5 como o conjunto de dados MNIST tem 60.000 pontos de treinamento.
  2. Epsilon (\(\epsilon\)) - Este é o orçamento privacidade. Ele mede a força da garantia de privacidade limitando o quanto a probabilidade de uma saída de modelo específica pode variar incluindo (ou excluindo) um único ponto de treinamento. Um valor menor para \(\epsilon\) implica uma melhor garantia de privacidade. No entanto, a \(\epsilon\) valor é apenas um limite superior e um grande valor ainda podia média boa privacidade na prática.

Tensorflow Privacidade fornece uma ferramenta, compute_dp_sgd_privacy , para calcular o valor da \(\epsilon\) dado um valor fixo de \(\delta\) e as seguintes hiperparâmetros do processo de formação:

  1. O número total de pontos nos dados de treinamento, n .
  2. O batch_size .
  3. O noise_multiplier .
  4. O número de epochs de treinamento.
compute_dp_sgd_privacy.compute_dp_sgd_privacy(n=train_data.shape[0],
                                              batch_size=batch_size,
                                              noise_multiplier=noise_multiplier,
                                              epochs=epochs,
                                              delta=1e-5)
DP-SGD with sampling rate = 0.417% and noise_multiplier = 1.3 iterated over 720 steps satisfies differential privacy with eps = 0.563 and delta = 1e-05.
The optimal RDP order is 18.0.
(0.5631726490328062, 18.0)

Os relatórios de ferramentas que para os hiperparâmetros escolhidos acima, o modelo treinado tem uma \(\epsilon\) valor de 1,18.

Resumo

Neste tutorial, você aprendeu sobre privacidade diferencial (DP) e como implementar princípios de DP em algoritmos de ML existentes para fornecer garantias de privacidade para dados de treinamento. Em particular, você aprendeu a:

  • Envolva os otimizadores existentes (por exemplo, SGD, Adam) em suas contrapartes privadas diferenciadas usando o TensorFlow Privacy
  • Ajustar hiperparâmetros introduzidos pelo aprendizado de máquina diferencialmente privado
  • Meça a garantia de privacidade fornecida usando as ferramentas de análise incluídas no TensorFlow Privacy