Как взломать нейронную сеть

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

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



Все реализовано на Google Colab, посмотреть и поиграться с кодом можно здесь.

Прежде чем мы начнем, давайте посмотрим, какие предположения мы делаем.

  1. Мы знаем формат секрета.
  2. Мы можем запросить модель.
  3. мы знаем префикс секрета (необязательно)

Формат и префикс

Формат и префикс секрета, который мы будем использовать, — «случайное число 281265017». Для простоты используется только нижний регистр.

Модель и данные

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

Мы используем известный набор данных Penn Treebank, который доступен бесплатно.

Определение

Говорят, что секрет запоминается нейронной сетью, если он имеет низкую логарифмическую сложность.

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

P(x|случайное число равно)
P(x|случайное число равно x)
…….

Затем получите отрицательный log2 вероятности этих цифр и просуммируйте все это.

Для справки, это график функции отрицательного log2.

Помните, что вероятность находится в диапазоне от 0 до 1. Низкая вероятность даст очень высокое значение функции. И наоборот, при полной вероятности 1 получится 0.

Высокая вероятность = низкое логарифмическое недоумение

Логарифмическая сложность секрета сама по себе не говорит нам, высок он или низок. Нам нужно сравнить его с другими возможными секретами. Авторы статьи определили простую метрику ранг. Секрет имеет ранг 1, если он имеет наименьшую логарифмическую сложность среди всех возможных секретов. Исследование показало, что вставленный секрет часто имеет ранг 1.

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

Извлечение

Авторы использовали то, что они назвали алгоритмом кратчайшего пути, для извлечения секрета с наименьшим логарифмическим недоумением, что является вариантом алгоритма Дейкстры.



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

Наша проблема представляет собой древовидную структуру, а не граф, что делает задачу более простой и понятной. Дерево имеет 10 уровней глубины. Первый уровень имеет только 1 узел, который является пустой строкой. Каждый узел в графе, кроме последнего слоя, имеет 9 дочерних элементов, которые представляют цифры от 0 до 9 соответственно. Последний слой имеет миллиард узлов из 9 цифр, которые являются всеми возможными секретами.

Ребро между узлом и его дочерним элементом — это логарифмическая сложность получения дочернего элемента. Цель нашего алгоритма — найти путь к последнему слою с наименьшей логарифмической сложностью.

В отличие от графа, который имеет только 1 определенное место назначения. Наша цель — любой узел в последнем слое. Другими словами, у нас миллиард направлений. Это нарушает принцип, согласно которому первый найденный путь всегда является кратчайшим. На практике первый найденный узел, скорее всего, имеет наименьшую логарифмическую сложность.

Последнее изменение алгоритма заключается в одновременном вычислении ребер нескольких узлов, поскольку GPU хорошо справляется с параллельными вычислениями.

Кодекс

Во-первых, некоторые контексты вещей, которые находятся за пределами фрагментов кода.

char_indices — это словарь, который сопоставляет символы с индексами. Индекс символа от 0 до 9 является непрерывным.

make_x — это вспомогательная функция для преобразования предложения в массив Numpy. Массив имеет форму (1, максимальная длина предложения, длина символа). Если длина предложения ниже максимальной длины предложения, нулевые векторы дополняются после предложения.

model — это языковая модель LSTM.

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

Результаты

Рейтинг в разных форматах

Сначала я вставил префикс «случайное число» и обнаружил, что секрет имеет ранг 1, как и ожидалось.

Мы можем захотеть узнать, можем ли мы извлечь секрет, не зная префикса? Что, если мы ничего не знаем о префиксе? Я попробовал еще раз, установив префикс на пустую строку. В данном случае секрет имеет ранг ›500. Алгоритму не удалось извлечь секрет из модели.

Что, если мы будем знать некоторые контексты, поможет ли это? Я попытался установить префикс на «число», указав, что мы знаем только, что слово «число» стоит где-то перед секретом. Это снова подняло секрет на ранг 1.

Я хотел проверить, какая минимальная подсказка нам нужна, чтобы раскрыть секрет. Я попытался установить префикс на один пробел « ». В этом случае мы знаем только, что секрет не в начале предложения. Удивительно, но секрет имеет ранг 1 при таком малом количестве информации.

Производительность алгоритма

Затем мы проверяем, насколько эффективен алгоритм для разных n, количества узлов, обрабатываемых алгоритмом за итерацию. Префикс был установлен на «случайное число равно» для всех n. Мы тестируем только итерации и время, необходимое для извлечения первого результата.

Мы видим, что секрет имеет чрезвычайно низкую сложность журнала. Алгоритму не нужно много итераций, чтобы найти его. На самом деле, 10 итераций — это минимальное количество, которое он может пройти. Каждая итерация может проходить только через 1 уровень в графе.

Реальное приложение

Хотя результаты завораживают, реальные ситуации намного сложнее.

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

Ниже представлено предложение Томаса Миколова, изобретателя word2vec, о том, как обращаться с числами при токенизации.

Можно также заменить все числа (возможно, больше, чем некоторая константа) каким-то одним токеном, например ‹NUM›.



В таких случаях извлечь цифры из модели уже невозможно.

Гиперпараметры

Оптимизатор: RMSProp
Размер пакета: 128
Скорость обучения: 0,001
Архитектура: LSTM
Единицы: 64
Слои: 2
Эпохи: 300
> Длина последовательности: 30

Спасибо за чтение и не стесняйтесь спрашивать меня, если у вас есть какие-либо вопросы.