ヘルプKaggleにTensorFlowグレートバリアリーフを保護チャレンジに参加

TensorFlowプライバシーで差分プライバシーを実装する

TensorFlow.orgで表示 GoogleColabで実行 GitHubでソースを表示 ノートブックをダウンロード

概要

差分プライバシー(DP)は、アルゴリズムによって提供されるプライバシーの保証を測定するためのフレームワークです。差分プライバシーのレンズを通して、個人データのモデルを責任を持ってトレーニングする機械学習アルゴリズムを設計できます。差分プライバシーを使用した学習は、プライバシーの測定可能な保証を提供し、機械学習で機密性の高いトレーニングデータを公開するリスクを軽減するのに役立ちます。直感的には、差分プライバシーでトレーニングされたモデルは、データセット内の単一のトレーニング例またはトレーニング例の小さなセットの影響を受けないようにする必要があります。これは、MLで機密性の高いトレーニングデータを公開するリスクを軽減するのに役立ちます。

微分プライベート確率的勾配降下法(DP-SGD)と呼ばれるこのアプローチの基本的な考え方は、ほとんどすべての深層学習アルゴリズムの中核にある確率的勾配降下法(SGD)で使用される勾配を変更することです。 DP-SGDでトレーニングされたモデルは、入力データに対して証明可能な差分プライバシー保証を提供します。バニラSGDアルゴリズムには2つの変更が加えられています。

  1. まず、各グラジエントの感度を制限する必要があります。つまり、ミニバッチでサンプリングされた個々のトレーニングポイントが、勾配計算とモデルパラメーターに適用される結果の更新に影響を与える可能性がある量を制限する必要があります。これは、各トレーニングのポイントで計算された各勾配をクリッピングすることによって行うことができます。
  2. ランダムノイズ特定のデータポイントは、それが訓練データセットにおけるこの特定のデータポイントの有無にかかわらず動作する場合SGDが適用アップデートを比較することによって、トレーニングデータセットに含まれていたか否かを知るために、それは統計的に不可能にするためにサンプリングされ、クリッピングされた勾配に添加します。

このチュートリアルの用途のtf.keras TensorFlowプライバシーライブラリが提供するDP-SGDオプティマイザと手書き数字を認識するために、畳み込みニューラルネットワーク(CNN)を訓練します。 TensorFlow Privacyは、既存のTensorFlowオプティマイザーをラップして、DP-SGDを実装するバリアントを作成するコードを提供します。

設定

必要なライブラリをインポートすることから始めます。

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

TensorFlowプライバシーをインストールします。

pip install tensorflow-privacy
import tensorflow_privacy

from tensorflow_privacy.privacy.analysis import compute_dp_sgd_privacy

データセットをロードして前処理する

ロードMNISTのデータセットをし、訓練用のデータを準備します。

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

ハイパーパラメータを定義する

学習モデルのハイパーパラメータ値を設定します。

epochs = 3
batch_size = 250

DP-SGDには、3つのプライバシー固有のハイパーパラメータと1つの既存のハイパーアマタがあり、これらを調整する必要があります。

  1. l2_norm_clip (フロート) -更新モデルパラメータに適用される各勾配の最大ユークリッド(L2)ノルム。このハイパーパラメータは、オプティマイザの感度を個々のトレーニングポイントに制限するために使用されます。
  2. noise_multiplier (フロート) -サンプリングし、トレーニング中に勾配に添加するノイズの量。一般に、ノイズが多いほどプライバシーが向上します(多くの場合、必ずしもそうとは限りませんが、ユーティリティが低下します)。
  3. microbatches (INT) -データの各バッチはmicrobatchesと呼ばれる小さな単位に分割されます。デフォルトでは、各マイクロバッチには1つのトレーニング例が含まれている必要があります。これにより、ミニバッチ全体で平均化された後ではなく、例ごとにグラデーションをクリップできます。これにより、グラジエントで検出された信号に対するクリッピングの(負の)影響が減少し、通常は有用性が最大化されます。ただし、マイクロバッチのサイズを大きくして複数のトレーニング例を含めることにより、計算のオーバーヘッドを減らすことができます。次に、これらの複数のトレーニング例の平均勾配がクリップされます。バッチで消費される例の総数、つまり最急降下法の1ステップは同じままです。マイクロバッチの数は、バッチサイズを均等に分割する必要があります。
  4. learning_rate (フロート) -このハイパーはすでにバニラSGDに存在します。学習率が高いほど、各更新の重要性が高くなります。更新にノイズが多い場合(加法性ノイズがクリッピングしきい値と比較して大きい場合など)、学習率が低いと、トレーニング手順が収束するのに役立つ場合があります。

以下のハイパーパラメータ値を使用して、適度に正確なモデル(95%のテスト精度)を取得します。

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')

モデルを構築する

畳み込みニューラルネットワークを学習モデルとして定義します。

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)
])

学習モデルのオプティマイザーと損失関数を定義します。各トレーニングポイントでの勾配操作をサポートするために、ミニバッチの平均としてではなく、例ごとの損失のベクトルとして損失を計算します。

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)

モデルをトレーニングする

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>

差分プライバシー保証を測定する

プライバシー分析を実行して、トレーニングアルゴリズムによって達成されるDP保証を測定します。達成されたDPのレベルを知ることにより、2つのトレーニング実行を客観的に比較して、どちらがプライバシーを保護するかを判断できます。大まかに言えば、プライバシー分析は、潜在的な敵対者がトレーニング手順の結果(モデルの更新やパラメーターなど)を観察することにより、個々のトレーニングポイントのプロパティに関する推測をどれだけ改善できるかを測定します。

この保証は、時々 、プライバシーの予算と呼ばれています。プライバシー予算が低いほど、敵の推測を改善する能力がより厳しく制限されます。これにより、より強力なプライバシー保証が保証されます。直感的には、これは、単一のトレーニングポイントが学習の結果に影響を与えることが難しいためです。たとえば、トレーニングポイントに含まれる情報は、MLアルゴリズムでは記憶できず、このトレーニングポイントを提供した個人のプライバシーはデータセットは保持されます。

このチュートリアルでは、プライバシー分析はに基づいて、純粋なDPの緩和であるレーニイ差分プライバシー(RDP)の枠組みの中で行われる。この論文特によくDP-SGDに適しています。

MLアルゴリズムのDP保証を表すために、次の2つのメトリックが使用されます。

  1. デルタ(\(\delta\)) -保持していないプライバシーの保証の確率を境界。経験則では、トレーニングデータセットのサイズの逆数よりも小さくなるように設定します。 MNISTデータセットが60,000トレーニング点を有しているように、このチュートリアルでは、10 ^ -5に設定されています。
  2. イプシロン(\(\epsilon\)) -これはプライバシーの予算です。単一のトレーニングポイントを含める(または除外する)ことで特定のモデル出力の確率がどの程度変化するかを制限することにより、プライバシー保証の強度を測定します。値を小さく \(\epsilon\) より優れたプライバシーの保証を意味します。しかし、 \(\epsilon\) 値は、実際には唯一の上限と大きな値でしそれでも平均良いのプライバシーです。

Tensorflowプライバシーツール提供compute_dp_sgd_privacy値を計算するために、 \(\epsilon\) の固定値所与 \(\delta\) 及びトレーニングプロセスから次のハイパーました:

  1. 訓練データにおける点の総数、 n
  2. batch_size
  3. noise_multiplier
  4. epochs訓練の。
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)

ツールのレポート上で選択したハイパーために、訓練されたモデルが持っていること \(\epsilon\) 1.18の値を。

概要

このチュートリアルでは、差分プライバシー(DP)と、既存のMLアルゴリズムにDPの原則を実装して、トレーニングデータのプライバシーを保証する方法について学習しました。特に、次の方法を学びました。

  • TensorFlowプライバシーを使用して、既存のオプティマイザー(SGD、Adamなど)を差分プライベートのオプティマイザーにラップします
  • 差分プライベート機械学習によって導入されたハイパーパラメータを調整する
  • TensorFlowプライバシーに含まれる分析ツールを使用して提供されるプライバシー保証を測定します