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

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

Модель правильно помечает эти изображения как Church, Tractor и Manta Ray соответственно. Как специалисту по глубокому обучению, приятно видеть раскаленные добела пиксели с высокой яркостью в центре красного трактора, а не автомобиля 50-х годов прошлого века, по этой причине модель выбрала класс трактора для этого изображения. Желание получить это подтверждение только выросло после атак противника, которые заставляют нас задаться вопросом, изучают ли наши модели реальные функции или просто прогнозирующий шум в нашем наборе данных.

Сегодня мы рассмотрим так называемый ванильный градиент. Это оригинальный алгоритм карты значимости для контролируемого глубокого обучения от «Simonyan et. al. (2013"). Несмотря на то, что ванильный градиент демонстрирует свой возраст в виде зашумленных карт, он показал себя относительно надежным, в то время как другие методы не дали количественной оценки². Кроме того, это самый простой алгоритм среди подходов, основанных на градиенте³, и он очень быстр в исполнении, что делает его отличным местом для начала понимания того, как работают карты значимости.

Запуск глубокой сети на ЦП выполняется медленно на современных архитектурах глубокого обучения, поэтому мы будем использовать относительно простую сверточную нейронную сеть (LeNet 5), обученную на 60 тыс. Точек данных MNIST вместо 1,4-метровой точки данных ImageNet (ILSRVRC).

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

Установка

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

Посмотрите мой репозиторий GitHub на предмет обработки данных и кода обучения сети. Они являются стандартными для MNIST, поэтому мы пока пропустим их, чтобы перейти к наиболее интересным.

Реализация ванильного градиента

В духе Карпатского« Да, ты должен понимать обратный проповедь » мы начнем с основ в нашей реализации. Как и обратное распространение, карты значимости - это ненадежная абстракция. Имея дело с дырявыми абстракциями, важно понимать механизмы, с которыми вы работаете, потому что ошибки непросто отследить до строки кода или модуля.

Вы постоянно обнаруживаете этот вид скрытой ошибки, развивая понимание того, в каком диапазоне должны быть значения для каждого вычислительного шага, и замечая расхождения. Итак, ни TensorFlow, ни PyTorch. Эти высокоуровневые фреймворки абстрагируют многие этапы от графического процессора, что отлично подходит для производительности, но ограничивает процесс создания привычки. Вместо этого мы будем создавать Vanilla Gradient с нуля в NumPy, и каждый шаг будет наблюдаться. Таким образом, вы будете знать, что искать позже, когда вам нужно будет углубиться в код модели, написанный на высокоуровневой платформе.

Алгоритм ванильного градиента:

1) прямой проход с данными

2) обратный переход к входному слою, чтобы получить градиент

3) визуализировать градиент как нормализованную тепловую карту

Давайте перейдем к коду. Ниже приведены первые два шага, основная логика Vanilla Gradient.

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

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

«На каждую величину, на которую вы меняете этот пиксель, я так сильно меняю выходную вероятность класса»

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

Вы даже можете рассчитать карту значимости изображения для класса, отличного от его метки. Например, здесь мы видим, какие части этого изображения 7 вносят вклад в класс 1.

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

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

Заключение

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

Я рекомендую вам поиграть с кодом, особенно в отладчике. Настройка занимает менее 5 минут. Нет лучшего способа укрепить свои знания здесь, чем запачкать руки и создать несколько карт значимости!

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

Спасибо Бену Манну, Йоханну Абиттану, Камилу Михницки, Лукасу Ферреру, Майклу Стаубу, Сэму Тернеру, Спенсеру Кризи, Стиву Филлипсу и Тейлору Кулп-Макдауолл за чтение черновиков этого документа.

Сноски

[1] Карты значимости также известны в литературе как карты атрибуции пикселей, карты атрибуции и карты чувствительности, но в последние годы похоже, что заметность побеждает в войне жаргонов. Да здравствует король.

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

[3] Другая категория карт значимости известна как методы, основанные на возмущениях. По сути, они включают в себя вмешательство в вводимые данные различными способами (размытие, затемнение пикселей и т. Д.) И определение того, насколько это влияет на вывод классификации.