יישום פרטיות דיפרנציאלית באמצעות פרטיות TensorFlow

הצג באתר TensorFlow.org הפעל בגוגל קולאב צפה במקור ב-GitHub הורד מחברת

סקירה כללית

פרטיות דיפרנציאלי (DP) היא מסגרת למדידת הערבויות הפרטיות מסופקות על ידי אלגוריתם. דרך עדשת הפרטיות הדיפרנציאלית, אתה יכול לעצב אלגוריתמים של למידת מכונה המאמנים בצורה אחראית מודלים על נתונים פרטיים. למידה עם פרטיות דיפרנציאלית מספקת ערבויות מדידות לפרטיות, ועוזרת להפחית את הסיכון של חשיפת נתוני אימון רגישים בלמידת מכונה. באופן אינטואיטיבי, מודל שאומן עם פרטיות דיפרנציאלית לא אמור להיות מושפע מאף דוגמה אחת לאימון, או מערך קטן של דוגמאות אימון, במערך הנתונים שלו. זה עוזר להפחית את הסיכון של חשיפת נתוני אימון רגישים ב-ML.

הרעיון הבסיסי של גישה זו, הנקראת ירידה סטוכסטית סטוכסטית דיפרנציאלית פרטית (DP-SGD), היא לשנות את השיפועים המשמשים בירידה סטוכסטית (SGD), שנמצאת בליבת כמעט כל אלגוריתמי הלמידה העמוקה. מודלים שהוכשרו עם DP-SGD מספקים ערבויות פרטיות דיפרנציאליות שניתן להוכיח עבור נתוני הקלט שלהם. בוצעו שני שינויים באלגוריתם SGD וניל:

  1. ראשית, יש להגביל את הרגישות של כל שיפוע. במילים אחרות, עליך להגביל עד כמה כל נקודת אימון בודדת שנדגמה ב-minibatch יכולה להשפיע על חישובי שיפוע ועל העדכונים המתקבלים שיושמו על פרמטרי מודל. ניתן לעשות זאת על ידי גזירת כל שיפוע שחושב על כל נקודה אימונים.
  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 Privacy.

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. כברירת מחדל, כל מיקרו-אצט צריך להכיל דוגמה אחת לאימון. זה מאפשר לנו לקצץ שיפועים על בסיס לכל דוגמה ולא לאחר שהם עברו ממוצע על פני המיניאצ'. זה בתורו מקטין את ההשפעה (השלילית) של חיתוך על האות שנמצא בשיפוע ובדרך כלל ממקסם את התועלת. עם זאת, ניתן להפחית תקורה חישובית על ידי הגדלת גודלן של מיקרו-אצטות כדי לכלול יותר מדוגמאות הכשרה אחת. לאחר מכן נקצץ השיפוע הממוצע על פני דוגמאות האימון המרובות הללו. המספר הכולל של דוגמאות שנצרכו באצווה, כלומר, שלב אחד של ירידה בשיפוע, נשאר זהה. מספר המיקרובאצ'ים צריך לחלק באופן שווה את גודל האצווה.
  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 והפרטיות של האדם שתרם את נקודת האימון הזו ל- מערך הנתונים נשמר.

במדריך זה, ניתוח הפרטיות מבוצעת במסגרת פרטיות דיפרנציאל רניי (RDP), שהינה הרפיה של DP טהור המבוסס על נייר זה כי הוא מתאים במיוחד גם עבור-SGD העקורים.

שני מדדים משמשים כדי לבטא את ערבות ה-DP של אלגוריתם ML:

  1. דלתא (\(\delta\)) - גבולות ההסתברות של ערבות הפרטיות לא מחזיק. כלל אצבע הוא להגדיר אותו כך שיהיה פחות מההיפוך של גודל מערך האימון. במדריך זה, זה מוגדר 10 ^ -5 כמו במערך MNIST יש 60,000 נקודות אימונים.
  2. אפסילון (\(\epsilon\)) - זהו התקציב פרטיות. הוא מודד את עוצמת הבטחת הפרטיות על ידי הגבלה של כמה ההסתברות של פלט מודל מסוים יכולה להשתנות על ידי הכללה (או אי הכללה) של נקודת אימון בודדת. נתון קטן עבור \(\epsilon\) מרמז ערבות פרטיות טובות יותר. עם זאת, \(\epsilon\) הערך הוא רק חסם עליון וערך גדול יכול עדיין פרטיות טובה ממוצעת בפועל.

פרטיות Tensorflow מספק כלי, compute_dp_sgd_privacy , כדי לחשב את הערך של \(\epsilon\) נתון ערך קבוע של \(\delta\) ואת hyperparameters הבאים מתהליך ההכשרה:

  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)

דיווחי הכלי עבור hyperparameters נבחר לעיל, המודל המאומן יש \(\epsilon\) ערך של 1.18.

סיכום

במדריך זה, למדת על פרטיות דיפרנציאלית (DP) וכיצד ניתן ליישם עקרונות DP באלגוריתמים קיימים של ML כדי לספק הבטחות פרטיות לנתוני אימון. במיוחד, למדת כיצד:

  • עטפו את המייעל הקיימים (למשל, SGD, אדם) לעמיתיהם הפרטיים באופן דיפרנציאלי באמצעות TensorFlow Privacy
  • כוונון היפרפרמטרים שהוכנסו על ידי למידת מכונה פרטית באופן דיפרנציאלי
  • מדוד את הבטחת הפרטיות הניתנת באמצעות כלי ניתוח הכלולים ב- TensorFlow Privacy