Рассчитать градиент нейронной сети

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

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

saver.restore(sess, "/tmp/model.ckpt")
# image of number 7
x_in = np.expand_dims(mnist.test.images[0], axis=0)
classification = sess.run(tf.argmax(pred, 1), feed_dict={x:x_in})
print(classification)

Теперь в статье говорится, что для того, чтобы сломать это изображение, первое, что нам нужно сделать, это получить градиент нейронной сети. Другими словами, это скажет мне направление, необходимое для того, чтобы изображение выглядело как число 2 или 3, даже если это 7.

В статье говорится, что это относительно просто сделать с помощью back propagation, Таким образом, вы можете определить функцию...

compute_gradient(image, intended_label)

... и это в основном говорит нам, какую форму нейронная сеть ищет в этой точке.

Это может показаться простым для реализации более опытным, но логика уклоняется от меня.

Из параметров функции compute_gradientЯ вижу, что вы передаете ему изображение и массив меток, где значение предполагаемой метки установлено в 1.

Но я не вижу, как это должно вернуть форму нейронной сети.

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

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

1 ответ

Решение

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

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

Существует простой (хотя и интенсивный в вычислительном отношении) способ аппроксимации градиента с помощью метода из Calc 101: для достаточно малого e df/dx составляет приблизительно (f(x + e) ​​- f(x)) / e.

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

Тогда градиент по отношению к изображению составляет примерно:

(
    (cost(x1+e, x2, ... xn) - cost(x1, x2, ... xn)) / e,
    (cost(x1, x2+e, ... xn) - cost(x1, x2, ... xn)) / e,
    .
    .
    .
    (cost(x1, x2, ... xn+e) - cost(x1, x2, ... xn)) / e
)
Другие вопросы по тегам