ใช้ความเป็นส่วนตัวที่แตกต่างกับ TensorFlow Privacy

ดูบน TensorFlow.org ทำงานใน Google Colab ดูแหล่งที่มาบน GitHub ดาวน์โหลดโน๊ตบุ๊ค

ภาพรวม

ความแตกต่างของความเป็นส่วนตัว (DP) เป็นกรอบสำหรับการวัดการค้ำประกันความเป็นส่วนตัวที่มีให้โดยขั้นตอนวิธีการอื่น คุณสามารถออกแบบอัลกอริธึมแมชชีนเลิร์นนิงที่ฝึกโมเดลบนข้อมูลส่วนตัวอย่างมีความรับผิดชอบผ่านเลนส์ของความแตกต่างของความเป็นส่วนตัว การเรียนรู้ด้วยความเป็นส่วนตัวที่แตกต่างกันให้การรับประกันความเป็นส่วนตัวที่วัดได้ ช่วยลดความเสี่ยงในการเปิดเผยข้อมูลการฝึกอบรมที่ละเอียดอ่อนในการเรียนรู้ของเครื่อง ตามสัญชาตญาณแล้ว โมเดลที่ได้รับการฝึกด้วยความเป็นส่วนตัวที่แตกต่างกันไม่ควรได้รับผลกระทบจากตัวอย่างการฝึกอบรมเดี่ยวๆ หรือตัวอย่างการฝึกอบรมชุดเล็กๆ ในชุดข้อมูล ซึ่งช่วยลดความเสี่ยงในการเปิดเผยข้อมูลการฝึกที่ละเอียดอ่อนใน ML

แนวคิดพื้นฐานของแนวทางนี้ เรียกว่า differentially private stochastic gradient descent (DP-SGD) คือการปรับเปลี่ยนการไล่ระดับสีที่ใช้ใน stochastic gradient descent (SGD) ซึ่งอยู่ที่แกนหลักของอัลกอริธึมการเรียนรู้เชิงลึกเกือบทั้งหมด โมเดลที่ได้รับการฝึกอบรมด้วย DP-SGD ให้การรับประกันความเป็นส่วนตัวที่แตกต่างกันสำหรับข้อมูลที่ป้อนเข้า มีการปรับเปลี่ยนอัลกอริธึม SGD วานิลลาสองแบบ:

  1. ขั้นแรก ความไวของการไล่ระดับสีแต่ละครั้งต้องถูกจำกัด กล่าวอีกนัยหนึ่ง คุณต้องจำกัดจำนวนจุดการฝึกแต่ละจุดสุ่มตัวอย่างในมินิแบตช์ที่สามารถส่งผลต่อการคำนวณแบบเกรเดียนต์และการอัปเดตผลลัพธ์ที่ใช้กับพารามิเตอร์โมเดล ซึ่งสามารถทำได้โดยการตัดแต่ละลาดคำนวณในประเด็นการฝึกอบรมแต่ละ
  2. สุ่มเสียงเป็นตัวอย่างและเพิ่มไปยังการไล่ระดับสีตัดที่จะทำให้มันเป็นไปไม่ได้ทางสถิติที่จะรู้หรือไม่ว่าจุดข้อมูลเฉพาะถูกรวมอยู่ในชุดฝึกอบรมโดยการเปรียบเทียบการปรับปรุง SGD ใช้เมื่อจะดำเนินการมีหรือไม่มีจุดข้อมูลนี้โดยเฉพาะในชุดการฝึกอบรม .

นี้ใช้กวดวิชา tf.keras ในการฝึกอบรมเครือข่ายประสาทสับสน (CNN) ที่จะรับรู้ตัวเลขที่เขียนด้วยลายมือกับเพิ่มประสิทธิภาพ DP-SGD ให้โดยห้องสมุดความเป็นส่วนตัว TensorFlow 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 มีไฮเปอร์พารามิเตอร์เฉพาะความเป็นส่วนตัวสามรายการและไฮเปอร์อะเมเตอร์ที่มีอยู่หนึ่งรายการที่คุณต้องปรับแต่ง:

  1. l2_norm_clip (float) - สูงสุดยุคลิด (L2) บรรทัดฐานของแต่ละการไล่ระดับสีที่ใช้กับพารามิเตอร์แบบปรับปรุง ไฮเปอร์พารามิเตอร์นี้ใช้เพื่อเชื่อมโยงความไวของเครื่องมือเพิ่มประสิทธิภาพกับจุดการฝึกอบรมแต่ละรายการ
  2. noise_multiplier (float) - จำนวนเสียงตัวอย่างและเพิ่มไปยังการไล่ระดับสีระหว่างการฝึกอบรม โดยทั่วไป เสียงรบกวนที่มากขึ้นส่งผลให้มีความเป็นส่วนตัวดีขึ้น (บ่อยครั้งแต่ไม่จำเป็นเพราะเสียค่าสาธารณูปโภคที่ต่ำกว่า)
  3. microbatches (int) - ชุดของข้อมูลแต่ละครั้งจะถูกแบ่งออกเป็นหน่วยที่เล็กที่เรียกว่า microbatches โดยค่าเริ่มต้น แต่ละ microbatch ควรมีตัวอย่างการฝึกอบรมเดียว ซึ่งช่วยให้เราสามารถตัดการไล่ระดับสีตามตัวอย่าง แทนที่จะใช้ค่าเฉลี่ยในมินิแบตช์ สิ่งนี้จะลดผลกระทบ (เชิงลบ) ของการตัดสัญญาณที่พบในการไล่ระดับสีและโดยทั่วไปจะเพิ่มอรรถประโยชน์สูงสุด อย่างไรก็ตาม ค่าโสหุ้ยในการคำนวณสามารถลดลงได้โดยการเพิ่มขนาดของไมโครแบตช์เพื่อรวมตัวอย่างการฝึกมากกว่าหนึ่งตัวอย่าง จากนั้นตัดการไล่ระดับสีเฉลี่ยในตัวอย่างการฝึกหลายๆ ตัวอย่างเหล่านี้ จำนวนตัวอย่างทั้งหมดที่ใช้ในชุดงาน กล่าวคือ หนึ่งขั้นของการลงระดับแบบเกรเดียนท์ ยังคงเท่าเดิม จำนวนไมโครแบตช์ควรแบ่งขนาดแบทช์เท่าๆ กัน
  4. learning_rate (float) - hyperparameter นี้มีอยู่แล้วในวานิลลา 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 ที่บรรลุได้ช่วยให้สามารถเปรียบเทียบวัตถุประสงค์ของการฝึกสองครั้งเพื่อกำหนดว่าทั้งสองวิธีใดเป็นการรักษาความเป็นส่วนตัวมากกว่า ในระดับสูง การวิเคราะห์ความเป็นส่วนตัวจะวัดว่าผู้เป็นศัตรูสามารถปรับปรุงการคาดเดาเกี่ยวกับคุณสมบัติของจุดการฝึกอบรมแต่ละจุดได้มากเพียงใด โดยสังเกตผลลัพธ์ของขั้นตอนการฝึกอบรม (เช่น การอัปเดตแบบจำลองและพารามิเตอร์)

การรับประกันนี้บางครั้งเรียกว่างบประมาณความเป็นส่วนตัว งบประมาณด้านความเป็นส่วนตัวที่ต่ำลงจะทำให้ฝ่ายตรงข้ามปรับปรุงการคาดเดาได้แน่นขึ้น สิ่งนี้รับประกันความเป็นส่วนตัวที่แข็งแกร่งยิ่งขึ้น ตามสัญชาตญาณ นี่เป็นเพราะยากที่จุดฝึกอบรมจุดเดียวส่งผลต่อผลลัพธ์ของการเรียนรู้: ตัวอย่างเช่น ข้อมูลที่อยู่ในจุดฝึกอบรมไม่สามารถจดจำโดยอัลกอริทึม ML และความเป็นส่วนตัวของบุคคลที่มีส่วนสนับสนุนจุดการฝึกอบรมนี้เพื่อ ชุดข้อมูลถูกเก็บรักษาไว้

ในการกวดวิชานี้การวิเคราะห์ความเป็นส่วนตัวจะดำเนินการในกรอบของRényiความแตกต่างส่วนบุคคล (RDP) ซึ่งเป็นการผ่อนคลายของ DP บริสุทธิ์บนพื้นฐานของ บทความนี้ ที่เหมาะอย่างยิ่งสำหรับ DP-SGD

เมตริก 2 รายการใช้เพื่อแสดงการรับประกัน DP ของอัลกอริธึม ML:

  1. เดลต้า (\(\delta\)) - ช่วยเชื่อมความน่าจะเป็นของการรับประกันความเป็นส่วนตัวที่ไม่ได้ถือ หลักการทั่วไปคือตั้งค่าให้น้อยกว่าค่าผกผันของขนาดชุดข้อมูลการฝึก ในการกวดวิชานี้จะถูกตั้งค่าเป็น 10 ^ -5 เป็นชุดข้อมูลที่ MNIST มี 60,000 จุดฝึกอบรม
  2. Epsilon (\(\epsilon\)) - นี้เป็นงบประมาณความเป็นส่วนตัว โดยจะวัดความแข็งแกร่งของการรับประกันความเป็นส่วนตัวโดยจำกัดความน่าจะเป็นของผลลัพธ์ของโมเดลหนึ่งๆ ที่สามารถเปลี่ยนแปลงได้โดยรวม (หรือไม่รวม) จุดฝึกอบรมเพียงจุดเดียว ค่าขนาดเล็กสำหรับ \(\epsilon\) หมายถึงการรับประกันความเป็นส่วนตัวดีกว่า อย่างไรก็ตาม \(\epsilon\) ค่าเป็นเพียงการผูกไว้บนและค่าขนาดใหญ่สามารถความเป็นส่วนตัวที่ดียังคงมีค่าเฉลี่ยในการปฏิบัติ

Tensorflow ความเป็นส่วนตัวให้เครื่องมือ, compute_dp_sgd_privacy , การคำนวณค่าของ \(\epsilon\) กำหนดค่าคงที่ของ \(\delta\) และ hyperparameters ต่อไปนี้จากกระบวนการฝึกอบรม:

  1. n 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)

รายงานว่าสำหรับเครื่องมือ hyperparameters ที่เลือกข้างต้นรูปแบบการฝึกอบรมมี \(\epsilon\) มูลค่า 1.18

สรุป

ในบทช่วยสอนนี้ คุณได้เรียนรู้เกี่ยวกับความแตกต่างของความเป็นส่วนตัว (DP) และวิธีที่คุณสามารถใช้หลักการ DP ในอัลกอริธึม ML ที่มีอยู่เพื่อให้การรับประกันความเป็นส่วนตัวสำหรับข้อมูลการฝึกอบรม โดยเฉพาะอย่างยิ่ง คุณได้เรียนรู้วิธี:

  • รวมเครื่องมือเพิ่มประสิทธิภาพที่มีอยู่ (เช่น SGD, Adam) ให้เป็นคู่ส่วนตัวที่แตกต่างกันโดยใช้ TensorFlow Privacy
  • ปรับแต่งไฮเปอร์พารามิเตอร์ที่แนะนำโดยการเรียนรู้ของเครื่องส่วนตัวที่แตกต่างกัน
  • วัดการรับประกันความเป็นส่วนตัวที่ให้ไว้โดยใช้เครื่องมือวิเคราะห์ที่รวมอยู่ใน TensorFlow Privacy