Thực hiện quyền riêng tư khác biệt với quyền riêng tư của TensorFlow

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub Tải xuống sổ ghi chép

Tổng quat

Riêng tư khác biệt (DP) là một khuôn khổ để đo đảm bảo sự riêng tư được cung cấp bởi một thuật toán. Thông qua lăng kính của sự riêng tư khác biệt, bạn có thể thiết kế các thuật toán học máy để đào tạo các mô hình một cách có trách nhiệm trên dữ liệu riêng tư. Học với quyền riêng tư khác biệt cung cấp các đảm bảo có thể đo lường được về quyền riêng tư, giúp giảm thiểu rủi ro lộ dữ liệu đào tạo nhạy cảm trong học máy. Theo trực giác, một mô hình được đào tạo với sự riêng tư khác biệt sẽ không bị ảnh hưởng bởi bất kỳ ví dụ đào tạo đơn lẻ nào hoặc một tập hợp nhỏ các ví dụ đào tạo trong tập dữ liệu của nó. Điều này giúp giảm thiểu rủi ro lộ dữ liệu đào tạo nhạy cảm trong ML.

Ý tưởng cơ bản của cách tiếp cận này, được gọi là chuyển xuống dốc ngẫu nhiên riêng biệt (DP-SGD), là để sửa đổi các chuyển sắc được sử dụng trong giảm độ dốc ngẫu nhiên (SGD), nằm ở cốt lõi của hầu hết tất cả các thuật toán học sâu. Các mô hình được đào tạo với DP-SGD cung cấp các đảm bảo về quyền riêng tư khác biệt có thể chứng minh được cho dữ liệu đầu vào của họ. Có hai sửa đổi được thực hiện đối với thuật toán vani SGD:

  1. Đầu tiên, độ nhạy của mỗi gradient cần được giới hạn. Nói cách khác, bạn cần giới hạn mức độ mà mỗi điểm đào tạo riêng lẻ được lấy mẫu trong một minibatch có thể ảnh hưởng đến tính toán gradient và các cập nhật kết quả được áp dụng cho các thông số mô hình. Điều này có thể được thực hiện bằng cách cắt từng dốc tính trên mỗi điểm đào tạo.
  2. Tiếng ồn ngẫu nhiên được lấy mẫu và bổ sung vào gradient cắt bớt để làm cho nó không thể thống kê để biết có hay không một điểm dữ liệu cụ thể đã được bao gồm trong tập dữ liệu huấn luyện bằng cách so sánh các bản cập nhật SGD áp dụng khi nó hoạt động có hoặc không có điểm này dữ liệu cụ thể trong tập dữ liệu huấn luyện .

Đây sử dụng hướng dẫn tf.keras để đào tạo một mạng lưới thần kinh xoắn (CNN) để nhận ra chữ số viết tay với tôi ưu hoa DP-SGD cung cấp bởi thư viện Privacy TensorFlow. TensorFlow Privacy cung cấp mã bao bọc một trình tối ưu hóa TensorFlow hiện có để tạo một biến thể triển khai DP-SGD.

Thành lập

Bắt đầu bằng cách nhập các thư viện cần thiết:

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

Cài đặt TensorFlow Privacy.

pip install tensorflow-privacy
import tensorflow_privacy

from tensorflow_privacy.privacy.analysis import compute_dp_sgd_privacy

Tải và xử lý trước tập dữ liệu

Nạp MNIST bộ dữ liệu và chuẩn bị dữ liệu cho việc đào tạo.

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

Xác định các siêu tham số

Đặt các giá trị siêu tham số của mô hình học tập.

epochs = 3
batch_size = 250

DP-SGD có ba siêu tham số dành riêng cho quyền riêng tư và một siêu siêu âm hiện có mà bạn phải điều chỉnh:

  1. l2_norm_clip (float) - Tối đa Euclide (L2) chỉ tiêu mỗi gradient mà được áp dụng cho các thông số cập nhật mô hình. Siêu tham số này được sử dụng để ràng buộc độ nhạy của trình tối ưu hóa với các điểm đào tạo riêng lẻ.
  2. noise_multiplier (float) - Số lượng tiếng ồn lấy mẫu và thêm vào gradient trong đào tạo. Nói chung, nhiều tiếng ồn hơn dẫn đến quyền riêng tư tốt hơn (thường nhưng không nhất thiết phải trả giá bằng tiện ích thấp hơn).
  3. microbatches (int) - Mỗi lô dữ liệu được chia trong các đơn vị nhỏ hơn gọi là microbatches. Theo mặc định, mỗi microbatch phải chứa một ví dụ đào tạo. Điều này cho phép chúng tôi cắt các gradient trên cơ sở từng ví dụ thay vì sau khi chúng đã được tính trung bình trên minibatch. Điều này đến lượt nó làm giảm tác động (tiêu cực) của việc cắt bớt tín hiệu được tìm thấy trong gradient và thường tối đa hóa tiện ích. Tuy nhiên, chi phí tính toán có thể được giảm bớt bằng cách tăng kích thước của các microbatch để bao gồm nhiều hơn một ví dụ đào tạo. Sau đó, gradient trung bình trên nhiều ví dụ đào tạo này được cắt bớt. Tổng số ví dụ được tiêu thụ trong một lô, tức là, một bước giảm độ dốc, vẫn giữ nguyên. Số lượng các vi mạch phải chia đều kích thước lô.
  4. learning_rate (float) - hyperparameter này đã tồn tại trong vani SGD. Tỷ lệ học tập càng cao, mỗi cập nhật càng quan trọng. Nếu các bản cập nhật bị nhiễu (chẳng hạn như khi tiếng ồn cộng gộp lớn so với ngưỡng cắt), tốc độ học tập thấp có thể giúp quy trình đào tạo hội tụ.

Sử dụng các giá trị siêu tham số bên dưới để có được mô hình chính xác hợp lý (độ chính xác kiểm tra 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')

Xây dựng mô hình

Xác định một mạng nơ-ron tích tụ làm mô hình học tập.

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

Xác định trình tối ưu hóa và chức năng mất mát cho mô hình học tập. Tính toán tổn thất dưới dạng véc tơ tổn thất trên mỗi ví dụ chứ không phải là giá trị trung bình trên một minibatch để hỗ trợ thao tác gradient qua mỗi điểm huấn luyện.

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)

Đào tạo mô hình

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>

Đo lường mức độ đảm bảo quyền riêng tư khác biệt

Thực hiện phân tích quyền riêng tư để đo lường đảm bảo DP đạt được bằng một thuật toán đào tạo. Biết được mức DP đạt được cho phép so sánh khách quan của hai lần đào tạo để xác định cái nào trong hai lần bảo vệ quyền riêng tư hơn. Ở cấp độ cao, phân tích quyền riêng tư đo lường mức độ mà kẻ thù tiềm năng có thể cải thiện khả năng phỏng đoán của họ về các thuộc tính của bất kỳ điểm đào tạo cá nhân nào bằng cách quan sát kết quả của quy trình đào tạo (ví dụ: cập nhật mô hình và thông số).

Bảo lãnh này đôi khi được gọi là ngân sách riêng tư. Ngân sách bảo mật thấp hơn sẽ hạn chế chặt chẽ hơn khả năng cải thiện khả năng phỏng đoán của đối thủ. Điều này đảm bảo một sự đảm bảo quyền riêng tư mạnh mẽ hơn. Theo trực giác, điều này là do một điểm rèn luyện đơn lẻ khó có thể ảnh hưởng đến kết quả học tập hơn: ví dụ: thông tin có trong điểm đào tạo không thể được ghi nhớ bởi thuật toán ML và quyền riêng tư của cá nhân đã đóng góp điểm đào tạo này vào tập dữ liệu được giữ nguyên.

Trong hướng dẫn này, việc phân tích sự riêng tư được thực hiện trong khuôn khổ Renyi Differential Bảo mật (RDP), mà là một thư giãn của DP tinh khiết dựa trên nghiên cứu này được đặc biệt rất thích hợp cho DP-SGD.

Hai số liệu được sử dụng để thể hiện sự đảm bảo DP của thuật toán ML:

  1. Delta (\(\delta\)) - Bounds khả năng đảm bảo sự riêng tư không giữ. Một quy tắc chung là đặt nó nhỏ hơn nghịch đảo kích thước của tập dữ liệu đào tạo. Trong hướng dẫn này, nó được thiết lập đến 10 ^ -5 như dataset MNIST có 60.000 điểm đào tạo.
  2. Epsilon (\(\epsilon\)) - Đây là ngân sách riêng tư. Nó đo lường sức mạnh của đảm bảo quyền riêng tư bằng cách giới hạn xác suất của một đầu ra mô hình cụ thể có thể thay đổi bao nhiêu bằng cách bao gồm (hoặc loại trừ) một điểm đào tạo duy nhất. Một giá trị nhỏ hơn cho \(\epsilon\) hàm ý đảm bảo sự riêng tư tốt hơn. Tuy nhiên, \(\epsilon\) giá trị chỉ là một trên ràng buộc và một giá trị lớn có thể vẫn bình tốt sự riêng tư trong thực tế.

Tensorflow bảo mật cung cấp một công cụ, compute_dp_sgd_privacy , để tính toán giá trị của \(\epsilon\) được đưa ra một giá trị cố định của \(\delta\) và các siêu sau từ quá trình đào tạo:

  1. Tổng số điểm trong dữ liệu huấn luyện, n .
  2. Các batch_size .
  3. Các noise_multiplier .
  4. Số lượng epochs của đào tạo.
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)

Các báo cáo công cụ cho các siêu chọn ở trên, mô hình đào tạo có \(\epsilon\) giá trị 1,18.

Bản tóm tắt

Trong hướng dẫn này, bạn đã học về quyền riêng tư khác biệt (DP) và cách bạn có thể triển khai các nguyên tắc DP trong các thuật toán ML hiện có để đảm bảo quyền riêng tư cho dữ liệu đào tạo. Đặc biệt, bạn đã học được cách:

  • Kết hợp các trình tối ưu hóa hiện có (ví dụ: SGD, Adam) vào các đối tác riêng tư khác biệt của chúng bằng cách sử dụng TensorFlow Privacy
  • Điều chỉnh siêu tham số được giới thiệu bởi máy học riêng tư khác biệt
  • Đo lường đảm bảo quyền riêng tư được cung cấp bằng cách sử dụng các công cụ phân tích có trong TensorFlow Privacy