Библиотека для частного машинного обучения в TensorFlow

с Джейсоном Манкузо в Dropout Labs.

Машинное обучение с сохранением конфиденциальности предлагает множество преимуществ и интересных приложений: возможность обучать и прогнозировать данные, пока они остаются в зашифрованном виде, открывает возможности использования данных, которые ранее были недоступны из-за проблем с конфиденциальностью. Но для этого необходимо объединить несколько технических областей, включая криптографию, машинное обучение, распределенные системы и высокопроизводительные вычисления.

Проект с открытым исходным кодом TF Encrypted направлен на объединение исследователей и практиков в знакомой структуре для ускорения исследования и адаптации. Создавая непосредственно на TensorFlow, он обеспечивает производительную структуру с высокоуровневым интерфейсом, который абстрагирует большую часть базовой сложности, что, в свою очередь, позволяет пользователям легко начать работу, не становясь сначала междисциплинарными экспертами.

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

Конкретно мы рассматриваем классическую задачу классификации цифр MNIST. Для простоты мы используем небольшую нейронную сеть и обучаем ее традиционным способом в TensorFlow с использованием незашифрованного обучающего набора. Однако, чтобы делать прогнозы с помощью обученной модели, мы обращаемся к TF Encrypted и показываем, как два сервера могут выполнять прогнозы для клиента, ничего не узнавая о его вводе. Хотя MNIST является в некоторой степени базовым, но стандартным эталонным тестом в литературе, он также интересен тем, что имеет расширения для множества различных вариантов использования в частном машинном обучении, включая анализ медицинских изображений.

TensorFlow и TF зашифрованы

Мы начнем с рассмотрения того, как наша задача может быть решена в стандартном TensorFlow, а затем рассмотрим изменения, необходимые для того, чтобы сделать прогнозы конфиденциальными с помощью TF Encrypted. Поскольку интерфейс последнего предназначен для имитации простого и лаконичного выражения общих операций машинного обучения, которыми хорошо известен TensorFlow, для этого требуется лишь небольшое изменение, которое подчеркивает, о чем по сути следует думать при переходе в частную настройку.

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

Обратите внимание, что конкретная реализация provide_weights и provide_input (строки 4–5) была опущена для удобства чтения. Эти два метода просто загружают соответствующие значения из массивов NumPy, хранящихся на диске, и возвращают их как тензорные объекты.

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

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

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

Обратите внимание, что большая часть кода остается практически идентичной традиционному коду TensorFlow, используя tfe вместо tf:

  • Метод provide_weights для загрузки весов модели (строка 16) теперь заключен в вызов tfe.define_private_input, чтобы указать, что они должны принадлежать и ограничены только владельцем модели; заключив вызов метода в оболочку, TF Encrypted зашифрует их перед передачей другим участникам вычислений.
  • Как и в случае с весами, входные данные прогнозирования теперь доступны только клиенту прогнозирования (строка 17), который также является единственным получателем выходных данных (строка 26). Здесь оператор tf.Print был перемещен в receive_output, поскольку теперь это единственная точка, в которой результат известен в незашифрованном виде.
  • Мы также привязываем имена сторон к их сетевым хостам (строки 5–8). Несмотря на то, что здесь опущена, эта информация также должна быть доступна на этих хостах, как обычно, через простой файл конфигурации.

В чем смысл?

Это удобно! Очень маленький шаблон, очень похожий на традиционный TensorFlow.

Он абстрактный и модульный! Он тесно интегрирует безопасные вычисления с кодом машинного обучения, скрывая сложные криптографические операции под обычными тензорными операциями.

Это расширяемое! Новые протоколы и методы могут быть добавлены под капотом, и высокоуровневый API не изменится. Точно так же новые уровни машинного обучения могут быть добавлены и определены поверх каждого базового протокола по мере необходимости, как в обычном TensorFlow.

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

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

Наконец, работая непосредственно в TensorFlow, мы также получаем выгоду от его экосистемы и можем воспользоваться преимуществами существующих инструментов, таких как TensorBoard. Например, можно профилировать, какие операции являются наиболее дорогостоящими и где следует применить дополнительную оптимизацию, а также можно проверить, где находятся значения, и обеспечить правильность и безопасность во время реализации криптографических протоколов, как показано ниже.

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

Заключение

Наше видение в Dropout Labs - позволить искусственному интеллекту и конфиденциальности данных работать вместе. Мы поддерживаем разработку TF Encrypted, чтобы предоставить исследователям и практикам инструменты с открытым исходным кодом, необходимые им для быстрого экспериментирования с безопасными протоколами и примитивами для частного машинного обучения.

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

Вы можете узнать больше о том, как именно мы это делаем, изучив наш недавний препринт, предыдущую запись в блоге или погрузившись в примеры на GitHub!