Конфиденциальное машинное обучение. Библиотека PySyft

Хабр, привет!

В этой статье расскажу о Privacy-Preserved Machine Learning. Обсудим зачем и как обеспечивать приватность пользователей при обучении, например, нейросетей.

Большая часть статьи есть пересказ выступлений и лекций Эндрю Траска (Andrew Trask). Он лидер сообщества OpenMined. Это люди, объединенные темой конфиденциальности в машинном обучении. В частности, OpenMined работает над библиотекой PySyft. Это обертка над PyTorch, Tensorflow или Keras для приватного машинного обучения. Мы познакомимся с PySyft по ходу статьи.

Мотивация

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

Уточню, почему анонимизации данных недостаточно. В 2007 Netflix опубликовал 10 миллионов рейтингов фильмов от 500.000 пользователей. Этот датасет был частью конкурса по созданию лучшей рекомендательной системы. В нём имена людей и названия фильмов были заменены на идентификаторы. Однако исследователи смогли установить личность отдельных людей, используя открытые данные с IMDb. Подробнее в оригинальной статье.

Тогда, нужно что-то большее, чем анонимизация. Далее, я убеждаю, что возможно обучать нейросети на данных, к которым не имеем доступ. Тогда будет обеспечена приватность и мы сможем построить классификатор опухолей. Кроме того, мы сможем работать над другими болезнями, например, деменции или депрессии. Если мы научимся работать с приватными данными в машинном обучении, то мы сможем решать важные мировые проблемы.

Remote Execution/Federated Learning

На секунду представим, что мы Apple. Мы хотим сделать наши сервисы лучше. Например, мы хотим улучшить автодополнение. Тогда, нам нужны данные: какие слова и в какой последовательности набирают пользователи. Мы могли бы скачать эти данные с айфонов и айпадов, складировать на серверах компании и датасет готов. Но тогда мы нарушим приватность!
Конфиденциальное машинное обучение. Библиотека PySyft

Раз данные не идут к модели, то модель идёт к данным. В этом заключается наша первая идея. Отправим нейросеть к пользователям, локально обучимся на их данных и получим модель с обновленными весами обратно. Ещё одной особенностью ‘Remote Execution’ является возможность параллельного обучения модели, т.е. одновременно на разных устройствах.

Во вступлении я упоминал PySyft — python-библиотеку для приватного машинного обучения. Посмотрим, как этот метод реализован в ней. Нам нужна возможность сказать удаленным устройствам выполнить операции необходимые для глубокого обучения. Таким образом, вместо использования Torch-тензоров, мы будем работать с указателями на тензоры.

# Импортируем PyTorch и PySyft
import torch as th
import syft as sy

# Небольшой хак для переопределения PyTorch-методов
hook = sy.TorchHook(th)

# Создадим "удаленноё" устройство, принадлежащее "удаленному пользователю" - будем называть его Бобом.
bob = sy.VirtualWorker(hook, id="bob")

# В реальности тензоры x и y должны быть у Боба изначально. Здесь только для примера.
x = th.tensor([1,2,3,4,5]).send(bob)
y = th.tensor([1,1,1,1,1]).send(bob)

# Просим Боба удаленно сложить два тензора. 
z = x + y

# Таким образом, у Боба три локальных тензора
bob._objects
# {5102423178: tensor([1, 2, 3, 4, 5]),
#  6031624222: tensor([1, 1, 1, 1, 1]),
#  4479039083: tensor([2, 3, 4, 5, 6])}

# Как только мы запросили тензор обратно, он перестал быть приватным
z = z.get()
z
# tensor([2, 3, 4, 5, 6])

bob._objects
# {5102423178: tensor([1, 2, 3, 4, 5]), 
#  6031624222: tensor([1, 1, 1, 1, 1])}

Обратите внимание на tensor.get(). Здесь мы получаем результат вычисления нейросети. Как понять, что вместе с этим мы не получаем какую-то приватную информацию?

Differential Privacy

Действительно, по измененным весам нейросети можно догадаться, какие данные были у пользователя. Например, если в кишках нашей нейросети был bag-of-words, то достаточно посмотреть, как изменился словарь {«слово»: «сколько раз встретилось»}. Чтобы избежать подобного пользователи будут добавлять шум в данные. Differential Privacy — это область, изучающая сколько шуму и как надо добавить.
Рассмотрим пример.

Мы проводим социологическое интервью. Наша задача — узнать сколько людей нарушают некое табу. Например, сколько людей перебегало дорогу за последнюю неделю. Если спросить напрямую, то люди, скорее всего, соврут. Поступим хитрее. Зададим вопрос и попросим, взакрытую от нас, дважды подбросить монетку. Если монетка выпала решкой, то человек отвечает честно. Иначе ответ соответствует результату следующего броска.

Тогда, где-то половина людей даст честный ответ, а остальная половина даст ответ соответственно распределению 50/50. Заметим, что при этом мы не знаем истину про конкретного участника опроса. Однако по результатам данного опроса мы можем восстановить истинное распределение. Предположим, 60% людей ответило ‘да’. Мы знаем, что половина ответов случайные. Тогда результаты опроса это: 35% истинных ‘да’, 25% случайных ‘да’, 15% истинных ‘нет’ и 25% случайных ‘нет’. Отсюда мы получаем, что истинное распределение это 70% ‘да’ и 30% ‘нет’. То есть мы смогли и сохранить приватность участников опроса и собрать статистические данные.

Конечно, точность результатов может сильно варьироваться. Чем больше шума мы добавляем, тем сильнее сохраняем приватность, но получаем более неточные результаты. С другой стороны, чем больше наша выборка, тем точнее результаты.

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

Послесловие

Отсталась небольшая проблема. При наивном ‘Remote Execution’ мы раскрываем вычисления, которые хотим выполнить на чужой машине. Кроме того, мы раскрываем нашу нейросеть пользователю. Мы раскрываем интеллектуальную собственность.

Но ведь модели и датасеты это просто большие коллекции чисел. А числа можно зашифровать. Например, реализовать подобное можно с помощью Secure multi-party computation или Homomorphic Encryption. Стоит ли разобрать алгоритмы в отдельной статье?

Полезные ссылки:

Источники:

 

Источник

privacy preserving machine learning, машинное обучение, нейросети, приватность

Читайте также