Рубрики
Без рубрики

3 Практические примеры для обмана нейронных сетей с использованием GA и FGSM

Привет! Я Przemyslaw Przybyt из Profil Software, программного обеспечения, расположенного в северной Польше, где я … Tagged with Neuralnetworks, Python, ArtificialIntelligence, AI.

Привет! Я Przemyslaw przybyt от Профиль программного обеспечения Программный дом, расположенный в северной Польше, где я работаю разработчиком Python. Мои интересы в ИИ были подняты во время изучения темы обучения подкрепления и компьютерного видения. У меня есть сильная внутренняя необходимость увидеть, как все делается под капюшоном Поэтому я хотел проверить, смогу ли я связываться с некоторыми хорошо известными моделями классификации объектов, такими как CNN (сверточные нейронные сети). Это всего лишь куча чисел и математических операций, так что давайте посмотрим, сможем ли мы сыграть с этим!

Классификация изображений

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

Описание экспериментов

Для целей этой статьи я выбрал два алгоритма, чтобы пройти. Первый – это генетический алгоритм, используемый для одной пиксельной атаки, который, как следует из его названия, меняет только одно значение пикселя, чтобы обмануть модель классификации. Второй – FGSM (метод знака быстрого градиента), который изменяет изображение с небольшим шумом, который практически невидим человеком, но может манипулировать прогнозом модели.

Одна атака пикселя

Когда я искал сеть, чтобы найти способы обмануть модели DNN (глубокая нейронная сеть), я столкнулся с очень интересной концепцией одной атаки пикселя, и я знал, что мне нужно проверить это. Моя интуиция говорила мне, что изменение только одного пикселя на исходном изображении было бы недостаточно, чтобы сломать все эти концепции фильтров и сверточных слоев, используемых в нейронных сетях, которые выполняют отличную работу, когда дело доходит до классификации объектов. Единственной информацией, которая использовалась для манипулирования входным изображением, была вероятность классификации (процентные значения для каждой метки). То, как я хотел достичь этого без метода грубой силы, было с использованием GA (генетический алгоритм). Идея была легкой:

  1. Получите настоящую метку для данного изображения.
  2. Нарисуйте базовую популяцию измененных пикселей (кодируемых как Xyrgb), где x и y – это положение пикселя, а R, G и B – его цветовые компоненты.
  3. С учетом того, что GA Magic (пересечение, мутация, отбор).
  4. Конечные расчеты, когда вероятность уменьшается до 20% или после определенного количества шагов без заметных результатов.

Для экспериментов я использовал модель на основе VGG16 Архитектура для набора данных CIFAR10 с предварительно подготовленными весами ( https://github.com/geifmany/cifar-vgg ). Это было сделано таким, чтобы устранить влияние «потенциально» плохо обученной модели. Пример кода ниже представлен, чтобы получить начало с обучением ваших собственных моделей на этом наборе данных:

# cifar10 dataset preparation
from keras.datasets import cifar10
from keras.utils import to_categorical
cifar_10_categories = {
    0: 'airplane',
    1: 'automobile',
    2: 'bird',
    3: 'cat',
    4: 'deer',
    5: 'dog',
    6: 'frog',
    7: 'horse',
    8: 'ship',
    9: 'truck',
}
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# training and evaluation goes here
...

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

FGSM

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

Для Непоряднут Подход к следующему шагу-просто добавить значение знака градиента (-1, 0 или 1 для каждого компонента пикселя) к изображению, чтобы избежать хорошего прогноза. В некоторых исследованиях также используется парамет, называемый Epsilon, который является множителем значения знака, но в этом эксперименте мы рассмотрели изображения, которые представлены значениями целочисленного RGB. Этот шаг можно повторить несколько раз, чтобы получить удовлетворительные результаты.

Другой подход – это Целевой атака, которая отличается тем, как рассчитывается градиент. Для такого типа атаки он принимается между входным изображением и меткой целевого (не True Label). Затем он вычитается из изображения, чтобы переместить классификацию ближе к цели. Легко, не так ли? Я вставил несколько примеров кода ниже, чтобы облегчить понимание.

# sample code that calculates the gradients and updates an image
import keras.backend as K
sess = K.get_session()
...
target = K.one_hot(target_class if target_class is not None else       base_class, num_classes)
def get_image_update_function(target_class):
    def target(img, delta):
        return img - epsilon * delta

    def non_target(img, delta):
        return img + epsilon * delta

    if target_class is not None:
        return target
    return non_target
update_fun = get_image_update_function(target_class)
# calculate delta - difference noise
loss = losses.categorical_crossentropy(target, model.output)
grads = K.gradients(loss, evaluated_model.input)
delta = K.sign(grads[0])
delta = sess.run(delta, feed_dict={model.input: image})
# update image
image = update_fun(image, delta)

Модель, которая использовалась в этом эксперименте, является Resnet18 с весами ImageNet. Пример кода, который позволяет загружать (с использованием.2.2), вставлен ниже:

# loading resnet pretrained models (224x224px, 1000 classes)
from classification_models import Classifiers
ResNet18, preprocess_input = Classifiers.get('resnet18')
resnet_dim = (224, 224)
model = ResNet18(input_shape=(*resnet_dim, 3), weights='imagenet', classes=1000)

В приведенном ниже изображении представлен исходный и состязательный пример, сгенерированный с использованием FGSM +, сгенерированного шума после 2 шагов алгоритма:

Оригинальное и состязательное изображение с предсказанными классами

Шум из красного компонента (белый + 2, серый + 0, черный – 2)

Черный ящик FGSM

Предыдущий метод был легким случаем, когда у нас есть полная информация о атакующей модели, но как насчет того, когда она недоступна? Вот исследование, которое оценивает градиент, используя большое количество запросов на целевую модель. Я попытался обмануть целевую модель, используя мою собственную модель, которая имела другую архитектуру, но выполнял аналогичные задачи. Модифицированные изображения были подготовлены на основе моей модели (потребовалось 7 шагов, чтобы уменьшить прогноз истинной метки при 1%) и проверено целевой моделью (модель VGG16 CIFAR10, используемая на предыдущих этапах). Результаты этого эксперимента показаны ниже:

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

Накопленный (r+g+b) шум, созданный в течение 7 шагов алгоритма.

Диаграмма показывает, как прогнозирование для истинной метки изменяется во время эксперимента.

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

Вывод

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

Ресурсы

Опубликовано в

Оригинал: “https://dev.to/profilsoftware/3-practical-examples-for-tricking-neural-networks-using-ga-and-fgsm-10go”