Перейти к содержимому
ПереводыИсследователи и авторы

Distill: визуализация признаков

Полный перевод статьи Олы, Мордвинцева и Шуберта (Distill, 2017): как оптимизацией картинки увидеть, на что реагирует нейрон, канал или слой GoogLeNet, почему без регуляризации получается шум и как с ним справляются — разнообразие, взаимодействие нейронов, предобусловливание в базисе Фурье.


Визуализация признаков

Как нейросети шаг за шагом строят своё понимание изображений

Заглавный рисунок: ряд картинок-визуализаций для нескольких слоёв GoogLeNet — от первых слоёв к последним. Сначала края (edges), потом текстуры (textures), узоры (patterns), части объектов (parts) и, наконец, целые объекты (objects). Подпись: «Визуализация признаков позволяет увидеть, как GoogLeNet (Szegedy и др., 2015), обученная на наборе данных ImageNet (Deng и др., 2009), слой за слоем строит своё понимание изображений. Визуализации всех каналов — в приложении».

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

Рисунок: две визуализации (нейрона и канала). Визуализация признаков (feature visualization) отвечает на вопрос, что ищет сеть — или её часть, — порождая примеры.

Рисунок: фотография и её «карта значимости». Атрибуция (attribution) [сноска 1] изучает, какая часть примера отвечает за то, что сеть активировалась определённым образом.

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

Нейросети, вообще говоря, дифференцируемы по своим входам. Если мы хотим узнать, какой вход вызовет определённое поведение — срабатывание внутреннего нейрона или итоговый выход, — можно с помощью производных итеративно подправлять вход в сторону этой цели (Erhan и др., 2009).

Рисунок (анимация): начиная со случайного шума, мы оптимизируем изображение так, чтобы оно активировало определённый нейрон (слой mixed4a, нейрон 11). Шум постепенно превращается в узор.

Идея простая, но заставить оптимизацию работать непросто: есть тонкие трудности. Мы разберём их и распространённые способы борьбы с ними в разделе «Враг визуализации признаков».

flowchart LR
N["Случайный шум"] --> IMG["Картинка x"]
IMG --> NET["Обученная сеть (веса заморожены)"]
NET --> OBJ["Цель: активация нейрона / канала / логит класса"]
OBJ -->|"градиент по x"| UPD["x ← x + шаг · ∂цель/∂x"]
UPD --> IMG
Прим. пер.: общая схема. Это градиентный подъём, но меняются не веса сети, а пиксели входной картинки.

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

Рисунок: разные цели оптимизации показывают, что ищут разные части сети. Обозначения: nn — номер слоя, x,yx, y — позиция в пространстве, zz — номер канала, kk — номер класса. Пять колонок со схемой и картинкой:

ЦельЧто максимизируемЧто видно на картинке
Нейронlayer_n[x,y,z] — одно число в одной позицииузор в небольшом пятне картинки
Каналlayer_n[:,:,z] — канал целиком, по всем позициямузор, повторённый по всей картинке
Слой / DeepDreamlayer_n[:,:,:]² — сумма квадратов активаций слоясмесь всего, что «интересно» слою
Логиты классаpre_softmax[k] — до softmaxизображение класса
Вероятность классаsoftmax[k] — после softmaxизображение класса, обычно хуже

Если мы хотим понять отдельные признаки, можно искать примеры, где они принимают большие значения, — либо для нейрона в отдельной позиции, либо для целого канала. Большинство картинок этой статьи созданы с целью «канал».

Если мы хотим понять слой целиком, можно взять цель DeepDream (Mordvintsev и др., 2015) и искать изображения, которые слой находит «интересными».

А если нужно создать примеры выходных классов классификатора, есть два варианта: оптимизировать логиты класса до softmax или вероятности класса после softmax. Логиты можно считать свидетельствами в пользу каждого класса, а вероятности — правдоподобием каждого класса при этих свидетельствах. К сожалению, самый простой способ увеличить вероятность, которую softmax даёт классу, — часто не сделать нужный класс вероятнее, а сделать маловероятными остальные (Simonyan и др., 2013). По нашему опыту, оптимизация логитов до softmax даёт изображения лучшего визуального качества [сноска 2].

Прим. пер.: почему так. Softmax зависит только от разностей логитов. Вероятность класса «собака» растёт и тогда, когда логит собаки не меняется, а логиты всех остальных классов падают. Оптимизатор идёт по самому лёгкому пути: «гасит» чужие признаки вместо того, чтобы рисовать собаку.

Названные цели — лишь верхушка айсберга возможных целей: попробовать можно гораздо больше. Особо отметим цели из переноса стиля (Gatys и др., 2015), которые многое говорят о том, какие стиль и содержание понимает сеть, и цели из обращения модели оптимизацией (Mahendran и Vedaldi, 2015), которые помогают понять, какую информацию модель хранит, а какую выбрасывает. Мы лишь в начале пути к пониманию того, какие цели интересны, и работы в этой области ещё много.

Оптимизация может дать пример входа, вызывающего нужное поведение, — но зачем с этим возиться? Нельзя ли просто поискать в наборе данных примеры, которые вызывают нужное поведение?

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

Рисунок: для четырёх нейронов слоя mixed4a — слева «примеры из набора данных показывают, на что нейроны реагируют на практике», справа — «оптимизация отделяет причины поведения от простых корреляций: нейрон может детектировать не то, что вы сначала подумали». Пары: «Бейсбольный мяч — или полоски?» (нейрон 6), «Морды животных — или носы?» (нейрон 240), «Облака — или пушистость?» (нейрон 453), «Здания — или небо?» (нейрон 492). Например, примеры из данных для нейрона 6 — сплошь бейсбольные мячи, а оптимизация рисует только изогнутые красные полоски-швы.

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

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

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

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

Оптимизация же обычно даёт лишь один крайне положительный пример — а если проявить изобретательность, то ещё и крайне отрицательный. Можно ли как-то получить разнообразие и от оптимизации?

Отдельный признак сети может реагировать на широкий диапазон входов. Например, на уровне классов классификатор, обученный узнавать собак, должен узнавать и крупные планы морд, и снимки в профиль издалека, хотя выглядят они совсем по-разному. В ранней работе Wei и др. (2015) пытались показать это «внутриклассовое» разнообразие так: записывали активации на всём обучающем наборе, кластеризовали их и оптимизировали под центроиды кластеров — это выявляло разные выученные грани класса.

Другой подход, Нгуена, Йосински и коллег, — искать в наборе данных разнообразные примеры и использовать их как стартовые точки оптимизации (Nguyen и др., 2016). Идея в том, что оптимизация стартует в разных гранях признака, и итоговый пример покажет соответствующую грань. В более поздней работе они сочетают визуализацию классов с порождающей моделью, из которой можно получать разнообразные примеры (Nguyen и др., 2016). Первый подход имел ограниченный успех, а подход с порождающей моделью работает очень хорошо — мы обсудим его в разделе о регуляризации, в части «Выученные априорные модели», — но с ним бывает непросто.

Мы обнаружили очень простой способ добиться разнообразия: добавить к цели «слагаемое разнообразия» (diversity term) [сноска 3], которое заставляет несколько примеров отличаться друг от друга. Слагаемое разнообразия может принимать разные формы, и мы пока плохо понимаем их преимущества. Один вариант — штрафовать косинусное сходство разных примеров. Другой — использовать идеи переноса стиля (Gatys и др., 2015), чтобы заставить признак показываться в разных стилях.

У нейронов нижних слоёв слагаемое разнообразия может выявить разные грани, которые представляет признак:

Рисунок, слой mixed4a, нейрон 97: «Простая оптимизация» — одна картинка; «Оптимизация с разнообразием выявляет четыре разные изогнутые грани» — четыре картинки с дугами разной ориентации; «Примеры из набора данных».

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

Рассмотрим, например, результат простой оптимизации для нейрона 143 слоя mixed4a. Если смотреть на него отдельно, можно решить, что нейрон срабатывает на верх собачьей головы: оптимизация показывает оба глаза и только дуги, изогнутые вниз. Но в оптимизации с разнообразием мы видим результаты без глаз и один — с дугой, изогнутой вверх. Значит, ожидания надо расширить: нейрон реагирует в основном на текстуру шерсти. Проверка этой гипотезы на примерах из набора данных показывает, что она в целом верна. Обратите внимание на ложку, текстура и цвет которой достаточно похожи на собачью шерсть, чтобы нейрон сработал.

Рисунок, слой mixed4a, нейрон 143: простая оптимизация, оптимизация с разнообразием, примеры из набора данных (среди них — та самая ложка).

На нейронах верхних слоёв эффект разнообразия может быть ещё поразительнее: он показывает разные типы объектов, которые возбуждают нейрон. Например, один нейрон реагирует на мячи разных видов, хотя выглядят они по-разному.

Рисунок, слой mixed5a, нейрон 9: простая оптимизация; «оптимизация с разнообразием выявляет несколько типов мячей»; примеры из набора данных.

У этого простого подхода есть ряд недостатков. Во-первых, давление «будьте разными» может порождать посторонние артефакты (например, глаза). Кроме того, оптимизация может делать примеры разными неестественным способом. Например, в примере выше хотелось бы видеть футбольные мячи отдельно от других мячей — для гольфа или тенниса. Подходы на основе набора данных, вроде Wei и др. (2015), разделяют признаки естественнее — но они могут хуже помогать понять, как модель поведёт себя на других данных.

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

Рисунок, слой mixed4e, нейрон 55: простая оптимизация; «оптимизация с разнообразием показывает кошек, лис, но и автомобили»; примеры из набора данных.

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

Прим. пер.: это явление позже получило название полисемантичность (полисемантичностьполисемантичность (многозначность нейрона)EN polysemanticityОдин нейрон срабатывает на несколько несвязанных понятий (например, на цитаты, HTTP-запросы и корейский текст).), а его объяснение — суперпозиция (суперпозиция признаковсуперпозиция признаковEN superpositionМодель хранит больше признаков, чем у неё измерений, раскладывая их по почти ортогональным направлениям. Работает, пока признаки редко активны одновременно.): сеть хранит больше признаков, чем у неё нейронов. См. урок 9.3.2.

Если нейроны — не правильный способ понимать нейросети, то что правильный? В реальности изображения в нейросетях представляют комбинации нейронов, работающих вместе. Полезно думать об этих комбинациях геометрически: назовём пространством активаций (activation space) все возможные комбинации активаций нейронов. Тогда активации отдельных нейронов можно считать базисными векторами этого пространства. И наоборот, комбинация активаций нейронов — просто вектор в этом пространстве.

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

Szegedy и др. (2013) обнаружили, что случайные направления выглядят столь же осмысленными, как направления базисных векторов. Позже Bau, Zhou и др. (2017) нашли, что направления базисных векторов интерпретируемы чаще, чем случайные. Наш опыт в целом согласуется с обоими результатами: случайные направления часто кажутся интерпретируемыми, но реже, чем базисные.

Рисунок: примеры из набора данных и оптимизированные примеры для случайных направлений в пространстве активаций. Показанные направления вручную отобраны за интерпретируемость.

Интересные направления в пространстве активаций можно задавать и арифметикой над нейронами. Например, если сложить нейрон «чёрно-белое» с нейроном «мозаика», получим чёрно-белую версию мозаики. Это напоминает смысловую арифметику эмбеддингов слов в Word2Vec (аналогии слованалогии слов (векторная арифметика)EN word analogyЗадача «a относится к b, как c к ?», решается поиском слова, ближайшего к вектору b − a + c.) или латентных пространств порождающих моделей.

Рисунок: «Совместно оптимизируя два нейрона, можно понять, как они взаимодействуют». Тройки картинок: нейрон A, нейрон B и их сумма — например, мозаика + чёрно-белое = чёрно-белая мозаика.

Эти примеры показывают, как нейроны совместно представляют изображения. Чтобы лучше понять взаимодействие нейронов, между ними можно ещё и интерполировать [сноска 4]. Это похоже на интерполяцию в латентном пространстве порождающих моделей.

Рисунок: ряды картинок, плавно перетекающих от визуализации одного нейрона к визуализации другого.

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

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

Рисунок: «Даже если тщательно подобрать learning rate, получится шум». Результаты оптимизации для нескольких learning rate — везде мелкая пёстрая рябь. Результаты увеличены, чтобы были видны детали и артефакты.

Похоже, эти узоры — своего рода жульничество картинки: способы активировать нейроны, которые в реальной жизни не встречаются. Если оптимизировать достаточно долго, начнёт проступать и то, что нейрон действительно детектирует, но в картинке доминируют высокочастотные узоры. Эти узоры, похоже, тесно связаны с явлением состязательных примеров (adversarial examples; Szegedy и др., 2013).

Мы не до конца понимаем, почему возникают эти высокочастотные узоры, но важную роль, похоже, играют свёртки с шагом (strided convolutions) и операции пулинга, которые создают высокочастотные узоры в градиенте (Odena и др., 2016).

Рисунок: каждая свёртка с шагом или пулинг создаёт шахматный узор в величинах градиента, когда через неё идёт обратное распространение (Odena и др., 2016).

Прим. пер.: почему шахматка. Если свёртка 3×33 \times 3 идёт с шагом 2, одни пиксели входа попадают в окна двух соседних выходов, а другие — только одного. При обратном проходе первые получают вдвое больше «вкладов» градиента. Получается регулярная сетка более и менее «громких» пикселей — высокочастотный узор.

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

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

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

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

Рисунок-обзор: горизонтальная шкала от «Без регуляризации» через «Штраф за частоты», «Устойчивость к преобразованиям» и «Выученные априорные модели» к «Примерам из набора данных». Подписи краёв: «Слабая регуляризация избегает обманчивых корреляций, но меньше связана с реальным использованием»; «Сильная регуляризация даёт более реалистичные примеры, но рискует обманчивыми корреляциями». Под шкалой — значки ключевых работ:

РаботаЧто в ней
Erhan и др., 2009основная идея; минимальная регуляризация
Szegedy и др., 2013состязательные примеры; визуализация примерами из набора данных
Mahendran и Vedaldi, 2015регуляризатор полной вариации; восстановление входа по представлению
Nguyen и др., 2015исследуют контрпримеры; вводят размытие изображения
Mordvintsev и др., 2015вводят сдвиги (jitter) и многомасштабность; гауссовы смеси как априорные модели классов
Øygard и др., 2015вводят размытие градиента (и сдвиги)
Tyka и др., 2016регуляризация билатеральными фильтрами (и сдвиги)
Mordvintsev и др., 2016нормализация частот градиента (и сдвиги)
Nguyen и др., 2016aпараметризация изображений генератором GAN
Nguyen и др., 2016bаприорная модель — шумоподавляющий автоэнкодер, получается порождающая модель

Рассмотрим эти три промежуточные категории подробнее.

Штраф за частоты (frequency penalization) бьёт прямо по высокочастотному шуму, от которого страдают эти методы. Он может явно штрафовать разброс между соседними пикселями (полная вариация, total variation; Mahendran и Vedaldi, 2015) или неявно подавлять высокочастотный шум, размывая изображение на каждом шаге оптимизации (Nguyen и др., 2015) [сноска 5]. К сожалению, вместе с шумом эти подходы подавляют и законные высокочастотные признаки вроде краёв. Немного лучше становится, если вместо размытия использовать билатеральный фильтр, который сохраняет края (Tyka, 2016).

(В некоторых работах похожие приёмы применяют, чтобы уменьшить высокие частоты в градиенте до того, как они накопятся в визуализации (Øygard, 2015; Mordvintsev и др., 2016). Эти приёмы в чём-то очень похожи на описанные выше, а в чём-то радикально отличаются — мы рассмотрим их в следующем разделе, «Предобусловливание и параметризация».)

Рисунок (интерактивный): штраф за частоты бьёт прямо по высокочастотному шуму — картинка становится глаже, но и размытее.

Устойчивость к преобразованиям (transformation robustness) — поиск примеров, которые сильно активируют цель оптимизации даже после небольшого преобразования. Для изображений даже небольшая доза, похоже, очень эффективна (Mordvintsev и др., 2015), особенно в сочетании с более общим регуляризатором высоких частот (Øygard, 2015; Mordvintsev и др., 2016). Конкретно это значит, что перед каждым шагом оптимизации мы случайно сдвигаем (jitter), поворачиваем или масштабируем изображение.

Рисунок (интерактивный): случайное преобразование изображения перед шагом оптимизации подавляет шум.

Выученные априорные модели (learned priors). Наши предыдущие регуляризаторы держат примеры в разумных рамках с помощью очень простых эвристик. Естественный следующий шаг — действительно выучить модель реальных данных и заставить примеры ей соответствовать. С сильной моделью это становится похоже на поиск по набору данных. Этот подход даёт самые фотореалистичные визуализации, но может быть неясно, что пришло от визуализируемой модели, а что — от априорной.

Один вариант — выучить генератор, переводящий точки латентного пространства в примеры данных, например GAN (генеративно-состязательная сетьгенеративно-состязательная сеть (GAN)EN generative adversarial network (GAN)генератор против дискриминатора; сегодня чаще всего — вспомогательный лосс в автоэнкодерах и вокодерах) или VAE (вариационный автокодировщиквариационный автокодировщик (VAE)EN variational autoencoder (VAE)), и оптимизировать внутри этого латентного пространства (Nguyen и др., 2016). Другой — выучить априорную модель, которая даёт доступ к градиенту вероятности; тогда можно оптимизировать априорную вероятность совместно с целью (Nguyen и др., 2016; Mordvintsev и др., 2015). Если оптимизировать априорную вероятность вместе с вероятностью класса, получается порождающая модель данных при условии этого класса. Наконец, Wei и др. (2015) приближают априорную порождающую модель — по крайней мере для распределения цветов, — штрафуя расстояние между фрагментами выхода и ближайшими фрагментами из базы фрагментов изображений, собранных из обучающих данных.

В предыдущем разделе мы видели несколько методов (Øygard, 2015; Mordvintsev и др., 2016), которые уменьшали высокие частоты в градиенте, а не в самой визуализации. Неясно, регуляризатор ли это на самом деле: высоким частотам он сопротивляется, но всё же позволяет им сформироваться, если градиент упорно к ним толкает. Если это не регуляризатор, то что делает такое преобразование градиента?

Такое преобразование градиента — на самом деле весьма мощный инструмент; в оптимизации он называется предобусловливанием (preconditioning). Можно считать, что мы делаем наискорейший спуск по той же цели, но в другой параметризации пространства или при другом понятии расстояния [сноска 6]. Это меняет, какое направление спуска будет наискорейшим и как быстро оптимизация движется в каждом направлении, но не меняет того, где минимумы. Если локальных минимумов много, предобусловливание может растянуть и сжать их области притяжения, меняя то, в какой из них попадёт оптимизация. В результате правильный предобусловливатель может радикально упростить задачу оптимизации.

Как выбрать предобусловливатель, который даст эти преимущества? Хорошая первая догадка — такой, который делает данные декоррелированными и «выбеленными» (whitened). Для изображений это значит делать градиентный спуск в базисе Фурье [сноска 7], масштабировав частоты так, чтобы у всех была одинаковая энергия [сноска 8].

Посмотрим, как разные меры расстояния меняют направление наискорейшего спуска. Обычный градиент в метрике L2 может сильно отличаться от направлений наискорейшего спуска в метрике L∞ или в декоррелированном пространстве.

Рисунок: «Три направления наискорейшего спуска при разных понятиях расстояния» — L2 (обычный градиент), L∞ и декоррелированное пространство — для одной и той же цели.

Все эти направления — законные направления спуска для одной и той же цели, но, как видно, они радикально различаются. Заметьте: оптимизация в декоррелированном пространстве уменьшает высокие частоты, а L∞ их увеличивает.

Декоррелированное направление спуска даёт совсем другие визуализации. Честно сравнить трудно из-за гиперпараметров, но визуализации выглядят гораздо лучше — и появляются быстрее.

Рисунок (интерактивный): «Сочетание предобусловливания и устойчивости к преобразованиям ещё сильнее улучшает качество» — сравнение визуализаций по шагам оптимизации в обычном и в декоррелированном пространстве.

(Если не оговорено иное, картинки этой статьи получены оптимизацией в декоррелированном пространстве с набором приёмов устойчивости к преобразованиям [сноска 9].)

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

Прим. пер.: та же мысль — «правильная параметризация радикально упрощает задачу» — есть в статье о momentum: нижнюю границу скорости можно обойти, только изменив саму обусловленность задачи.

За последние несколько лет нейронная визуализация признаков сильно продвинулась. Сообщество выработало обоснованные способы создавать убедительные визуализации. Мы наметили ряд важных трудностей и нашли способы их решать.

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

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

Прим. пер.: Lucid написан на TensorFlow 1 и больше не развивается. Для PyTorch есть сторонние порты (например, пакет torch-lucent), но для нашего курса важнее идея; механистическую интерпретируемость трансформеров мы делаем руками в уроке 9.3.1 и в путеводителе по ARENA.

Мы чрезвычайно признательны Шану Картеру и Яну Гудфеллоу. Шан дал вдумчивые отзывы, особенно о дизайне статьи. Ян великодушно взялся вести процесс рецензирования — без него мы не смогли бы её опубликовать.

Мы также благодарны за комментарии, мысли и поддержку Арвинду Сатьянараяну, Яну Джонсону, Грегу Коррадо, Блезу Агуэре-и-Аркасу, Кэтрин Е, Майклу Нильсену, Эмме Пирсон, Дарио Амодеи, Майку Тыке, Андреа Ведальди, Рут Фонг, Джейсону Фрайденфелдсу, Джеффри Хинтону, Тимону Рубану, Бин Ким, Мартину Ваттенбергу и Фернанде Виегас.

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

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

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

Инфраструктура. Все эксперименты основаны на коде Алекса, часть которого публиковалась раньше. Алекс, Крис и Людвиг внесли значительный вклад в превращение его в нынешнюю библиотеку Lucid. Особенно важные абстракции ввели Алекс и Крис.


Сноска 1. Интерпретируемость нейросетей — молодая область, и единой терминологии у неё пока нет. Атрибуция в литературе выступала под многими названиями — в том числе «визуализация признаков»! — но в недавних работах, похоже, предпочитают термины «атрибуция» и «карты значимости» (saliency maps).

Сноска 2. Стандартное объяснение — максимизация вероятности работает плохо, потому что можно просто подавлять свидетельства других классов. Но есть и альтернативная гипотеза: через функцию softmax просто труднее оптимизировать. Насколько мы знаем, это иногда бывало проблемой в состязательных примерах, и решение там — оптимизировать LogSumExp логитов. Это эквивалентно оптимизации softmax, но обычно лучше поддаётся. По нашему опыту, трюк с LogSumExp не лучше, чем работа с сырыми вероятностями.

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

Сноска 3. В этой статье мы используем подход, основанный на идеях художественного переноса стиля. Следуя той работе, сначала вычисляем матрицу Грама GG каналов, где Gi,jG_{i,j} — скалярное произведение (развёрнутых в вектор) откликов фильтров ii и jj:

Gi,j=∑x,ylayern[x, y, i]⋅layern[x, y, j]G_{i,j} = \sum_{x,y} \text{layer}_n\text{[x, y, i]} \cdot \text{layer}_n\text{[x, y, j]}

Отсюда вычисляем слагаемое разнообразия — взятое со знаком минус попарное косинусное сходство визуализаций:

Cdiversity=−∑a∑b≠a vec(Ga)⋅vec(Gb)∥vec(Ga)∥ ∥vec(Gb)∥C_{\text{diversity}} = - \sum_{a} \sum_{b\neq a} ~ \frac{\text{vec}(G_a) \cdot \text{vec}(G_b)}{\lVert\text{vec}(G_a)\rVert~\lVert\text{vec}(G_b)\rVert}

Затем максимизируем слагаемое разнообразия совместно с обычной целью оптимизации.

Сноска 4. Цель оптимизации — линейная интерполяция между целями отдельных каналов. Чтобы интерполяции выглядели лучше, мы добавляем небольшую цель выравнивания, поощряющую сходство активаций нижних слоёв. Ещё мы используем сочетание раздельной и общей параметризации изображений: так оптимизатору проще выстроить объекты в линию, но у него остаётся свобода создать любую нужную картинку.

Сноска 5. Если смотреть на размытие в пространстве Фурье, оно эквивалентно добавлению к цели масштабированного L2-штрафа, который штрафует каждую компоненту Фурье в зависимости от её частоты.

Сноска 6. Размытие градиента (Øygard, 2015) эквивалентно градиентному спуску в другой параметризации пространства изображений, где высокочастотные измерения растянуты, так что движение в этих направлениях медленнее. Нормализация градиента лапласовой пирамидой (Mordvintsev и др., 2016) — своего рода адаптивный learning rate в том же пространстве.

Сноска 7. Это указывает на глубокий факт о преобразовании Фурье. Пока корреляция одинакова во всех позициях пространства — например, корреляция пикселя с левым соседом одна и та же во всех местах изображения, — коэффициенты Фурье будут независимыми величинами. Чтобы это увидеть, заметьте: такую пространственно однородную корреляцию можно выразить свёрткой, а по теореме о свёртке после преобразования Фурье она становится поэлементным умножением.

Сноска 8. Важно не забыть декоррелировать и цвета. Преобразование Фурье декоррелирует по пространству, но корреляция между цветами остаётся. Чтобы с ней справиться, мы явно измеряем корреляцию цветов на обучающем наборе и декоррелируем их разложением Холецкого. Рисунок: направления наискорейшего спуска до и после декорреляции цветов — «коррелированные цвета» и «декоррелированные цвета».

Сноска 9. Изображения оптимизировались 2560 шагов в пространстве, преобразованном Фурье с декорреляцией цветов, оптимизатором Adam с learning rate 0,05. На каждом шаге оптимизации в указанном порядке применялись преобразования:

  • дополнение входа (padding) на 16 пикселей, чтобы избежать артефактов на краях;
  • сдвиг (jitter) до 16 пикселей;
  • масштабирование с коэффициентом, случайно выбранным из списка: 1; 0,975; 1,025; 0,95; 1,05;
  • поворот на угол, случайно выбранный из списка (в градусах): −5, −4, −3, −2, −1, 0, 1, 2, 3, 4, 5;
  • второй сдвиг до 8 пикселей;
  • обрезка дополнения.
ENRU
feature visualizationвизуализация признаков
attribution, saliency mapатрибуция, карта значимости
optimization objectiveцель оптимизации
neuron / channel / layer objectiveцель «нейрон» / «канал» / «слой»
logits, pre-softmaxлогиты (до softmax)
dataset examplesпримеры из набора данных
diversity termслагаемое разнообразия
Gram matrixматрица Грама
activation space, basis directionпространство активаций, базисное направление
polysemantic neuronполисемантичный нейрон
adversarial exampleсостязательный пример
strided convolution, checkerboard artifactsсвёртка с шагом, шахматные артефакты
regularization, priorрегуляризация, априорная модель
frequency penalization, total variationштраф за частоты, полная вариация
transformation robustness, jitterустойчивость к преобразованиям, случайный сдвиг
learned priorвыученная априорная модель
preconditioning, parameterizationпредобусловливание, параметризация
decorrelated, whitenedдекоррелированный, «выбеленный»

Оригинал: Olah, Mordvintsev, Schubert, «Feature Visualization», Distill, 2017, distill.pub/2017/feature-visualization, CC BY 4.0. Перевод распространяется на тех же условиях.