В современном мире технологий можно, несомненно, предположить, что данные имеют первостепенное значение! А поскольку такие области, как глубокое обучение, широко представлены почти во всех отраслях, получение правильных данных (как по качеству, так и по количеству) становится еще более важным для организаций. Вместе с этим возникает первостепенная задача определения последовательной политики, связанной с конфиденциальностью (помните GDPR!)

В этом посте мы рассмотрим некоторые аспекты конфиденциальности в Deep Learning и с использованием PySyft: библиотеки Python для безопасного глубокого обучения, мы продемонстрируем простой код, служащий моделью для создания безопасных и конфиденциальных прогнозов. .

Конфиденциальность при глубоком обучении

Традиционный конвейер глубокого обучения следует стандартной схеме: накопление данных на сервере; Обучить модель на сервере; Сделайте выводы, используя эту модель, и повторите. Однако это может вызвать тревогу у всех борцов за конфиденциальность данных, особенно если отправляемые данные являются конфиденциальными или конфиденциальными (например, финансовая информация или медицинские записи).

PySyft - одна из таких библиотек Python, которая использует несколько принципов, таких как дифференциальная конфиденциальность, федеративное обучение и безопасные многосторонние частные вычисления (SMPC) для обеспечения конфиденциальности. Давайте кратко коснемся каждого на примере

Федеративное обучение

По аналогии, FL - это как если бы вы сами заказали ужин, а не пошли в ресторан (что?). Так, например, если Алиса отказывается отправлять свои данные для обучения модели Боба на сидячем облачном сервере, ссылаясь на проблемы с конфиденциальностью, то вместо этого ей отправляется копия сервера модели Боба! Эта модель обучается на устройстве Алисы, и веса отправляются обратно на сервер, где модель соответствующим образом обновляется. Это означает, что Алиса по-прежнему владеет своими данными и может быть уверена, что ее данные не были раскрыты Бобу / Бобом.

Но здесь есть недостаток! Даже если Алиса отправила на сервер Боба только веса, Боб может легко воссоздать данные Алисы с помощью обратного проектирования (поскольку веса могут раскрывать детали данных).

В другой ситуации Злой Эд получил копию модели на сервере Боба под предлогом обучения на своих собственных данных, но вместо этого использовал эту модель для собственной прибыли. Итак, по сути, Боб потерял право собственности на модель, которую он так кропотливо построил!

Общий подход здесь состоит в том, чтобы зашифровать как данные, так и модель, а затем обучить эту зашифрованную модель на зашифрованных данных.

Дифференциальная конфиденциальность

Скажем, если модель Боба предсказывает мошенничество с использованием финансовых данных, не должно быть никакого способа узнать, принадлежит ли конкретная выборка данных Алисе. Проще говоря, модель Боба должна изучать то, чему ей нужно научиться (обнаруживать мошенничество с помощью данных), и ничего больше (например, узнавать о финансовых характеристиках Алисы с помощью ее данных). Это означает, что модель во время обучения не должна изучать или раскрывать специфические особенности пользователя.

Безопасные многосторонние частные вычисления (SMPC)

Допустим, Эд, Нед и Эдди нашли карту сокровищ и разорвали ее на три части, чтобы никто не мог получить всю карту сразу. Карта будет иметь смысл только тогда, когда все три части будут сложены вместе. Аналогичным образом в MPC несколько сторон соглашаются выполнить вычисление, а входные данные и веса модели делятся на доли и распределяются между сторонами. Все общие ресурсы необходимы для восстановления исходных данных, что делает общий ресурс своего рода закрытым ключом.

Обслуживание безопасной модели с использованием PySyft

PySyft в настоящее время поддерживает безопасное обслуживание моделей Pytorch и Keras или Tensorflow. Давайте создадим и надежно обслужим модель с помощью keras API. (PySyft использует TfEncrypted под капотом для моделей тензорного потока)

Примечание: я использовал mnist tutorial из репозитория PySyft github в качестве справочника.

Шаг 1: публично обучите и сохраните простую модель CNN для классификации изображений в наборе данных CIFAR10.

# import libraries
from tensorflow.keras.datasets import cifar10
from  tensorflow.keras.models import Sequential
from  tensorflow.keras.layers import Conv2D, MaxPooling2D
from  tensorflow.keras.layers import Dense, Flatten
from  tensorflow.keras.optimizers import SGD
num_classes = 10
input_shape = (1, 32, 32, 3)
# Define model 
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same', batch_input_shape=(1,32, 32, 3)))
model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu', kernel_initializer='he_uniform'))
model.add(Dense(num_classes, name='logit'))
# We are assuming the model has already been trained and the weights # are saved in a .h5 file
# load the pretrained weights
pre_trained_weights = 'cifar10.h5'
model.load_weights(pre_trained_weights)

Шаг 2: Импортируйте PySyft и используйте функцию KerasHook ().

import syft as sy
hook = sy.KerasHook(tf.keras)

Это сделает доступными три функции

  • поделиться: это позволит обеспечить безопасный обмен модели между рабочими, а также позволит делать прогнозы для зашифрованных данных.
  • serve: запускается очередь, которая принимает запросы на прогноз (вы можете установить ограничение на количество запросов с помощью параметра num_requests)
  • shutdown_workers: выключить модель после обслуживания запросов.

Шаг 3. Создайте трех рабочих процессов (TFEWorker), которые будут запускать серверы Tensorflow для выполнения частных прогнозов. (Флаг AUTO указывает, нужно ли управлять этими экземплярами вручную или рабочими). Поскольку мы используем одну и ту же машину, все три воркера будут на «localhost». Конечно, это можно изменить, если используются распределенные методы.

AUTO = True
worker_1 = sy.TFEWorker(host='localhost:5000', auto_managed=AUTO)
worker_2 = sy.TFEWorker(host='localhost:5001', auto_managed=AUTO)
worker_3 = sy.TFEWorker(host='localhost:5002', auto_managed=AUTO)

Шаг 4. Теперь вызовите метод share (), который преобразует модель в зашифрованную модель keras, а затем метод serve () для обслуживать запросы прогнозов

model.share(worker_1, worker_2, worker_3)
model.serve(num_requests=5) # limit the number of requests to 5 

Сервер настроен на прием запросов на создание прогнозов с использованием зашифрованной модели.

Делайте личные прогнозы

Затем создайте клиента и подключитесь к модели с помощью функции connect_to_model (). Кроме того, вам нужно определить тех же трех воркеров, которые мы создали ранее.

#import libraries
import numpy as np
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from keras.preprocessing.image import load_img,img_to_array
import syft as sy
#create a client
client = sy.TFEWorker()
worker_1 = sy.TFEWorker(host='localhost:5000')
worker_2 = sy.TFEWorker(host='localhost:5001')
worker_3 = sy.TFEWorker(host='localhost:5002')
#connect to the secure model
client.connect_to_model(input_shape, output_shape, worker_1, worker_2, worker_3)

Теперь вы можете легко запросить модель для безопасного получения прогнозов.

# prepare the image for prediction
def predict(filename):
    img = load_img(filename, target_size=(32, 32))
    img = img_to_array(img)
    img = img.reshape(1, 32, 32, 3)
    img = img.astype('float32')
    img = img / 255.0
    return img
filenames=['horse.jpg','bird.jpg','car.jpg']
actual_labels = [7,2,1]
# Query the model for obtaining private predictions
for i,filename in enumerate(filenames):
    img = predict(filename)
    res = client.query_model(img)
    print(f"predicted class for {filename}:{np.argmax(res)} and actual class : {actual_labels[i]}")

Полученный результат:

predicted class for horse.jpg:    7 and actual class : 7
predicted class for bird.jpg:    2  and actual class : 2
predicted class for car.jpg:    1  and actual class : 1

Наконец, сервер можно выключить, вызвав model.shutdown_workers()

Там! у нашей модели все в порядке! Более того, эти прогнозы делаются надежно. То есть ни модель не знала, что это были фактические данные, ни клиент не знал, каковы были веса модели. Выводы были сделаны на зашифрованных данных с использованием зашифрованной модели!

Спасибо за чтение

Ссылки:



Https://github.com/OpenMined/PySyft

Https://blog.openmined.org/encrypted-deep-learning-classification-with-pysyft/

Https://ai.googleblog.com/2017/04/federated-learning-collaborative.html