Мысли и теория

Обучение доказуемо-устойчивых нейронных сетей

Защита от враждебных примеров с помощью GloRo Nets

За последние несколько лет было показано, что глубокие сети уязвимы для злоумышленников, которые могут заставить сеть совершать неприятные ошибки, просто вводя в сеть злонамеренно искаженные входные данные. Очевидно, что это вызывает конкретные опасения по поводу безопасности нейронных сетей, развернутых в дикой природе, особенно в критически важных для безопасности условиях, например, в автономных транспортных средствах. В свою очередь, это мотивировало объем работ по практической защите, начиная от стратегий обнаружения атак и заканчивая модифицированными программами обучения, направленными на создание сетей, которые трудно или невозможно атаковать. В этой статье мы рассмотрим элегантную и эффективную защиту, которую я разработал вместе с моими коллегами из CMU (появится на ICML 2021), которая изменяет архитектуру нейронной сети, чтобы естественным образом обеспечить доказуемые гарантии надежности против определенных классов атак — без дополнительных затрат во время тестирования.

Мы называем семейство нейронных сетей, защищенных нашим подходом, GloRo Nets (от глобальныеобще-росетевые сети). Для тех, кому интересно поэкспериментировать с идеями, представленными в этой статье, библиотека для построения и обучения GloRo Nets находится в открытом доступе здесь.

Мотивация: состязательные примеры

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

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

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

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

Защита от противников

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

Первый вопрос: что именно мы хотим доказать? В случае состязательных примеров с малой нормой нам нужно свойство, называемое локальной устойчивостью. . Локальная надежность точки x означает, что всем точкам на расстоянии ε от x присваивается та же метка, что и x. Геометрически это означает, что шар радиусом ε вокруг x гарантированно свободен от любых границ решения, как показано на рисунке ниже. Из этой интуиции должно быть ясно, что локальная надежность исключает возможность получения состязательного примера из x.

Как следует из названия, локальная устойчивость является локальной в том смысле, что она применяется к окрестности одной точки x. Но что означает, что вся сеть должна быть надежной? При осмотре мы видим, что любая интересная сеть не может быть локально устойчивой везде: если все точки находятся на ε-далеко от границы решения, границу будет негде разместить, поэтому сети придется везде делать одинаковые прогнозы — не очень интересная сеть.

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

Пример того, как может выглядеть надежная модель, показан на рисунке ниже. Граница (показана черным цветом) представляет собой, по сути, «нейтральную зону», где модель указывает, что точки нелокально устойчивы, помечая их специальной меткой ⊥ («дно», иногда математический символ). используется для обозначения нулевых значений). В идеале никакие «настоящие» точки данных (например, точки обучения, точки проверки и т. д.) не лежат на этой ничейной территории.

Построение глобально устойчивых сетей

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

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

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

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

Использование константы Липшица

Константа Липшица функции говорит нам, насколько может измениться вывод функции при изменении ее ввода. Интуитивно мы можем думать об этом как о максимальном наклоне или скорости изменения функции.

Таким образом, если константа Липшица функции равна K, то максимально может измениться выход функции, если ее вход изменяется в сумме на ε, равно εK. Мы воспользуемся этим фактом, чтобы наложить запас правильной ширины на поверхность решений нашей сети.

Поскольку нейронная сеть на самом деле представляет собой просто многомерную функцию, мы также можем рассмотреть константу Липшица нейронной сети. Ради простоты мы будем рассматривать каждое значение логита как отдельную функцию со своей константой Липшица (этого будет достаточно, чтобы объяснить, как работают сети GloRo, но анализ может быть ужесточен за счет чуть более сложного учета липшица полной сети). постоянна; в приложении к нашей статье приведены эти технические подробности).

Теперь вернемся к нашей интуиции, чтобы на примере продемонстрировать, как создавать сети GloRo.

Предположим, у нас есть сеть, предсказывающая между четырьмя классами, которая производит логиты, показанные ниже. Если разница между логитами для классов 1 и 2 достаточно велика, класс 2 не сможет превзойти класс 1 (и аналогично для классов 3 и 4).

Как уже говорилось, постоянная Липшица говорит нам, насколько каждый логит может двигаться, когда вход возмущен в радиусе ε. Рассматривая величину, на которую может уменьшиться класс 1, и величину, на которую каждый из других классов может увеличить, мы можем вычислить величину, на которую каждый класс может уменьшиться. >выигрыш в прогнозируемом классе (класс 1). Затем мы вставляем новое логит-значение, соответствующее классу ⊥, которое принимает свое значение на основе наиболее конкурентоспособного класса для класса 1 после рассмотрения того, насколько каждый класс может двигаться.

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

Аппроксимация константы Липшица

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

Интересно, что в то время как эта граница обычно будет очень слабой в типичной сети, то есть она будет сильно завышать константу Липшица, поскольку вычисление границы включено в цель обучения (подробнее об этом ниже), даже эта наивная послойная граница заканчивается довольно тесно в сетях GloRo Net, которые не являются «типичными» сетями. Это означает, что использование простого вычисления константы Липшица на самом деле является эффективным способом установить достаточный запас между классами для получения доказуемой устойчивости.

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

Естественно захват надежной цели

Удобно, что то, как мы кодируем область ⊥ как дополнительный класс, позволяет нам довольно легко обучать сети GloRo Net для оптимизации доказуемой надежности. Ключом к этому факту является то, что в GloRo Nets надежность определяется точностью. По сути, поскольку ⊥ никогда не является правильным классом для наших помеченных данных, обучая сеть быть точной (как мы обычно делаем), она избегает выбора ⊥, что, в свою очередь, означает, что она избегает ненадежности.

Иллюстративный пример с кодом

Теперь мы рассмотрим пример GloRo Nets в действии (чтобы следить за ним в интерактивном режиме, загляните в эту записную книжку). Библиотека, реализующая GloRo Nets в TensorFlow/Keras, доступна здесь; его также можно установить с помощью pip:

pip install gloro

Используя библиотеку gloro, мы увидим, что сети GloRo просты в построении и обучении; и они достигают самых современных характеристик для сертифицированных надежных моделей [1].

В качестве примера мы будем использовать набор данных рукописных цифр MNIST. Этот набор данных можно легко получить через tensorflow-datasets.

import tensorflow as tf
import tensorflow_datasets as tfds
# Load the data.
(train, test), metadata = tfds.load(
    'mnist',
    split=['train', 'test'],
    with_info=True,             
    shuffle_files=True,
    as_supervised=True)
# Set up the train and test pipelines.
train = (train
    .map(lambda x,y: (tf.cast(x, 'float32') / 255., y))              
    .cache()
    .batch(512))         
test = (test
    .map(lambda x,y: (tf.cast(x, 'float32') / 255., y))              
    .cache()
    .batch(512))

Начнем с определения простой сверточной сети. Создание GloRo Net с библиотекой gloro выглядит почти так же, как и в Keras; единственное отличие состоит в том, что мы создаем его с классом GloroNet (а не с классом Keras Model по умолчанию), что требует от нас указать радиус надежности, epsilon. В то время как модельный класс GloroNet совместим из коробки с любой 1-липшицевой функцией активации (включая ReLU), мы обнаружили, что активация MinMax, которая сортирует пары соседних нейронов, работает лучше всего (причины, почему это выходит за рамки рассмотрения). этой статьи).

from gloro import GloroNet
from gloro.layers import MinMax
from tensorflow.keras.layers import Conv2D
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Input
x = Input((28, 28, 1))
z = Conv2D(
    16, 4, 
    strides=2, 
    padding='same',
    kernel_initializer='orthogonal')(x)
z = MinMax()(z)
z = Conv2D(
    32, 4, 
    strides=2, 
    padding='same', 
    kernel_initializer='orthogonal')(z)
z = MinMax()(z)
z = Flatten()(z)    
z = Dense(100, kernel_initializer='orthogonal')(z)
z = MinMax()(z)
y = Dense(10, kernel_initializer='orthogonal')(z)
g = GloroNet(x, y, epsilon=0.3)

Затем мы можем скомпилировать модель. Существует несколько вариантов функций потерь, совместимых с GloRo-Net, в том числе стандартная категориальная кросс-энтропия, но обычно мы находим, что Trades потери (найденные в gloro.training.losses) работают лучше всего (детали для различных функций потерь не входят в объем этой статьи). статья).

Мы также считаем, что показатели clean_acc и vra полезны для отслеживания прогресса. Чистая точность – это точность, которой достигает модель, когда маржа игнорируется (т. е. если нам не важна надежность). VRA, или проверенная устойчивая точность, – это доля точек, которые правильно классифицированы и сертифицированы как локально устойчивые; это типичный показатель успеха для надежных моделей.

# Use TRADES loss with crossentropy and a TRADES 
# parameter of 1.2.
g.compile(
    loss='sparse_trades_ce.1.2',
    optimizer='adam',
    metrics=['clean_acc', 'vra'])

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

from gloro.training.callbacks import EpsilonScheduler
from gloro.training.callbacks import LrScheduler
g.fit(
    train,
    epochs=50,
    validation_data=test,
    callbacks=[
        # Scale epsilon from 10% of our target value
        # (0.03) to 100% of our target value (0.3)
        # half-way through training.
        EpsilonScheduler('[0.1]-log-[50%:1.0]'),
        # Decay the learning rate linearly to 0 half- 
        # way through training.
        LrScheduler('[1.0]-[50%:1.0]-[0.0]'),
    ])

Вот и все! Это приводит к следующей чистой точности и VRA:

test clean_acc: 99.1%
test vra:       95.8%

Краткое содержание

Сети GloRo обеспечивают элегантный и эффективный способ защиты от состязательных примеров с небольшими нормами, автоматически вводя ε-маржу в построение сети. Поскольку сертификация надежности естественным образом встроена в выходные данные сети, сети GloRo Net можно легко оптимизировать для обеспечения проверенной надежности и выполнять практически бесплатную сертификацию во время тестирования. Кроме того, поскольку границы Липшица, используемые для сертификации сети, также включены в сеть, GloRo Nets может достичь современного VRA, используя простые, эффективно вычисляемые верхние границы для константы Липшица.

Рекомендации

  1. Лейно и др. Глобально надежные нейронные сети. ICML 2021. АрХив
  2. Гудфеллоу и др. Объяснение и использование состязательных примеров. ICLR 2015. АрХив