
В 2015 Google выкатила серию изображений, которые выглядели так, словно фотографию отдали на редактуру художнику, а потом забыли вовремя его остановить. На обычном пейзаже появлялись десятки глаз, в облаках начинали угадываться собаки, архитектура покрывалась повторяющимися узорами, а деревья превращались во что-то среднее между растительностью и фантазией художника. Изображения быстро разошлись по интернету, а DeepDream довольно быстро стал отдельным визуальным стилем.
Изначально исследователей интересовали не столько сами картинки, сколько возможность понять, что происходит внутри нейросети. Классификатор снаружи выглядит довольно просто: фотография поступает в модель, а на выходе появляется список вероятностей — собака, кошка, автомобиль, самолет. Между этими двумя точками находится огромное количество вычислений, и по одному ответу модели далеко не всегда понятно, почему она пришла именно к нему.
Можно посмотреть на значения активаций отдельных нейронов и каналов, построить карты признаков, найти изображения, которые вызывают сильный отклик. Есть и более радикальный способ исследования: специально изменить входное изображение так, чтобы какой-то внутренний сигнал модели стал сильнее. Так появился DeepDream.
Забудем про «сон»
Название DeepDream отлично работает как маркетинг, но немного мешает пониманию механизма. Нейросеть, конечно же, ничего не «представляет» во сне в человеческом смысле. Происходит более конкретная математическая процедура.
Берется уже обученная модель, ее параметры фиксируются, а оптимизируется входное изображение. Пиксели фотографии постепенно меняют так, чтобы выбранная внутренняя активация росла.
Обычная работа классификатора выглядит примерно так: изображение → нейросеть → ответ.
При обучении меняются параметры сети: изображение + правильный ответ → изменение параметров.
DeepDream использует тот же механизм градиентного спуска в обратную сторону: фиксированная нейросеть → изменение изображения → усиление внутреннего сигнала.
Мы знаем модель и спрашиваем: «Как должно выглядеть изображение, чтобы ты сильнее активировала этот участок своей обработки?» Ответом становится новое изображение.
Сегодня подобные методы обычно относят к activation maximization и feature visualization — визуализации признаков через поиск входов, которые максимально сильно их активируют. DeepDream стал одним из самых известных и наглядных примеров такого подхода.
Чтобы понять, почему это вообще работает, нужно повнимательнее посмотреть на то, что происходит внутри сверточной сети.
Фотография для сети
Для человека фотография собаки — это сразу фотография собаки. Мы не воспринимаем ее как набор из миллионов чисел, хотя физически изображение именно им и является.
Для нейросети на вход поступает массив значений пикселей. Дальше последовательность слоев преобразует этот массив. На ранних этапах обработки сеть может реагировать на относительно простые структуры: границы, направления линий, локальные контрасты, текстуры. На следующих уровнях эти признаки комбинируются.
Из нескольких линий может получаться более сложная форма. Из нескольких форм — часть объекта. На более глубоких уровнях возникают представления, которые уже теснее связаны с объектами и их частями.
При этом не стоит представлять внутри сети аккуратную библиотеку, где есть отдельная ячейка «собака», «глаз», «шерсть». Реальные представления устроены гораздо менее удобно для человеческого описания. Один объект может зависеть от множества каналов, а отдельный канал может участвовать в распознавании разных объектов.
Поэтому фраза «этот слой распознает собак» — удобное упрощение. Точнее говорить о наборах признаков и комбинациях активаций, которые статистически связаны с определенными структурами на изображении. И вот эти внутренние сигналы можно попытаться усилить.

ИИ‑роутер — доступ к 300+ моделям из одной панели
Подключите OpenAI‑совместимый шлюз по единому API‑ключу. Настраивайте сквозную аналитику, отслеживайте лимиты и квотируйте ресурсы.
Что вообще значит «усилить активацию»
Представим, что мы выбрали некоторый канал внутри сверточного слоя. После прохождения фотографии через сеть он выдает карту чисел. Большие значения означают, что в соответствующих местах изображения этот канал обнаружил что-то похожее на то, к чему он чувствителен.
Назовем некоторую целевую величину F(x), где x — исходное изображение. Нам хочется получить такое изображение x′, для которого:
F(x′) > F(x)
Но какие именно пиксели нужно изменить? Вот здесь и появляется градиент. Если представить F(x) как некоторую поверхность в огромном пространстве всех возможных изображений, градиент ∇ₓF показывает направление, в котором значение F увеличивается быстрее всего.
Кто-то (например, я) привык видеть градиенты в контексте обучения: ошибка вычисляется, затем градиент показывает, как изменить веса модели. Но математически необязательно брать производную именно по весам. Можно вычислить градиент по входным пикселям. Возникает вопрос: какие небольшие изменения изображения сильнее всего увеличат выбранную активацию?
После этого изображение можно немного изменить:
xₜ₊₁ = xₜ + η∇ₓF(xₜ)
где η — небольшой шаг.
Сеть при этом не обучается, ее веса остаются такими же, меняется только картинка. Если повторить операцию много раз, изображение постепенно движется в сторону, которая особенно сильно возбуждает выбранный участок модели.
А что произойдет с шумом?
Если взять случайный шум и начать оптимизировать его под какую-нибудь внутреннюю активацию, получится изображение, которое постепенно приобретает структуру. Это уже само по себе довольно интересное наблюдение.
Модель не получила дополнительного датасета и не была обучена рисовать. Информация о визуальных закономерностях уже находится в ее параметрах. Мы просто создаем процедуру, которая позволяет этой информации проявиться через вход.
Если выбранный признак связан с определенными текстурами, они начнут возникать в шуме. Если он связан с более сложной структурой, результат будет сложнее. На ранних слоях изображение обычно остается абстрактным: линии, повторяющиеся направления, текстуры, локальные узоры. На более глубоких уровнях появляются структуры, которые человек уже может интерпретировать как части объектов.
А если пойти достаточно глубоко, могут возникать полноценные объекты. Здесь DeepDream начинает напоминать генератор изображений, хотя принцип работы у него другой.
Он не создает картинку из случайного шума по заранее заданному текстовому описанию. Уже обученная модель используется как функция, которая оценивает собственные внутренние сигналы, а оптимизатор подстраивает вход под эти сигналы.
Почему сеть начинает видеть собак в облаках
Теперь возьмем не случайный шум, а обычную фотографию. Допустим, где-то в облаке есть случайный участок, который немного похож на собачью морду. Не настолько, чтобы человек обязательно это заметил. Достаточно, чтобы набор признаков в сети получил чуть большую активацию.
Градиент слегка изменяет пиксели так, чтобы соответствующий сигнал стал сильнее. Облако теперь немного больше напоминает структуру, к которой чувствительна сеть. Изображение снова проходит через модель, активация становится выше, и следующий шаг оптимизации продолжает двигаться примерно в том же направлении.
После десятков итераций первоначальная случайность становится вполне заметной структурой.

Возникает положительная обратная связь: небольшое сходство усиливается, усиленное сходство создает новый градиент, а он снова увеличивает то же сходство.
Сеть не получает инструкции «нарисуй здесь собаку». Ее задача гораздо примитивнее: увеличить выбранный внутренний сигнал. А уже из этого ограничения возникают собаки, шерсть, глаза, здания и другие структуры.
Почему собак получается много
Если сеть нашла одну собаку, почему оптимизация не останавливается на ней? Потому что выбранный признак может активироваться сразу на разных участках изображения.
Представим, что сеть имеет некоторое представление о структуре собачьей морды. В исходной фотографии есть десять участков, которые совсем немного похожи на эту структуру. Градиент может увеличить соответствующую активацию во всех десяти местах. Каждый участок становится немного более похожим на исходный паттерн, после чего следующий шаг оптимизации усиливает их еще сильнее.
Так одна случайная структура начинает размножаться по изображению. Особенно хорошо это видно на глубоких слоях и при многократном повторении оптимизации. Поэтому DeepDream часто выглядит как самоподдерживающийся визуальный паттерн.
Масштаб
Есть еще одна проблема. Если долго оптимизировать одно и то же изображение, сеть начинает цепляться за небольшие локальные структуры. Картинка постепенно превращается в плотную кашу из повторяющихся признаков.
В оригинальных экспериментах Google использовался, в частности, прием с разными масштабами изображения — так называемыми октавами.
Сначала оптимизация выполняется на одном масштабе. Затем изображение увеличивается, и процесс продолжается. После следующего изменения масштаба появляются структуры другого размера.
На одном уровне возникает маленькая собачья морда. После увеличения похожая структура может начать влиять на более крупный участок. Внутри нее возникают дополнительные детали.
Так формируется характерная многомасштабная структура DeepDream: большие формы состоят из более мелких форм, которые сами могут содержать еще более мелкие повторения.

Но откуда сеть вообще знает, как выглядит собака
Во время обучения классификатор видел множество изображений и постепенно менял свои параметры так, чтобы полезные закономерности помогали решать задачу классификации. Если некоторый набор визуальных признаков статистически связан с классом «собака», сеть начинает использовать его.
При этом она совершенно не обязана учиться человеческому определению собаки. Может использовать форму морды, текстуру шерсти, положение ушей, контуры тела. А может обнаружить что-то гораздо менее очевидное.
Если фотографии собак в обучающем наборе почти всегда сделаны на траве, трава тоже способна оказаться полезным признаком.
С точки зрения функции потерь в этом нет ошибки. Модель не получает инструкции о том, какие признаки являются сущностью объекта, а какие считаются контекстом. Ей дают примеры и критерий правильного ответа.
Именно поэтому визуализация внутренних представлений может обнаруживать неожиданные способы решения задачи.
История с гантелью
Один из самых наглядных примеров из оригинальных материалов DeepDream связан с классом «гантель». Исследователи визуализировали признаки, связанные с этим объектом, и заметили, что рядом с гантелями регулярно появлялись человеческие руки.
Для нас это кажется странным. Гантель может лежать на полу, стоять на стойке или находиться в руках. Рука не является частью самой гантели. Но если в обучающем наборе подавляющее большинство фотографий гантелей показывает спортсменов, которые держат их руками, связь «гантель — рука» оказывается полезной для классификации.

Модель не знает, что человек считает существенным признаком объекта. Если определенный визуальный контекст помогает уменьшить ошибку, он может попасть во внутреннее представление. Это и есть одна из классических проблем машинного обучения: высокая точность сама по себе еще не говорит, что модель решила задачу так, как ожидал человек.
DeepDream — не генератор того, «что сеть знает»
Иногда DeepDream описывают как способ увидеть, что находится у нейросети «в голове». Формулировка запоминающаяся, но она слишком сильно очеловечивает происходящее.
Когда на изображении появляется глаз, это еще не означает, что внутри сети существует отдельный объект «глаз», который мы нашли и визуализировали. Мы выбрали определенную функцию от внутренних активаций и нашли такое изменение входного изображения, которое увеличивает эту функцию.
Получившаяся картинка зависит от архитектуры модели, обучающих данных, выбранного слоя, каналов, способа оптимизации, масштаба, числа итераций и исходного изображения. Измените часть условий — получите другой результат.
Кроме того, существует огромное количество разных изображений, которые могут давать похожую активацию. DeepDream показывает один из вариантов входа, который оказался удобным для оптимизатора. Это не обязательно единственная и даже не обязательно самая естественная форма соответствующего признака.
Поэтому красивая визуализация сама по себе еще не является полным объяснением.
Почему один нейрон — не обязательно один признак
Это особенно важно для серьезной интерпретации. Наивная картина выглядит очень привлекательно:
нейрон №1 отвечает за линии;
нейрон №2 — за глаза;
нейрон №3 — за собак.
Иногда отдельные нейроны действительно имеют достаточно понятную специализацию. Но в больших сетях представления обычно распределены гораздо сложнее.
Один и тот же объект может зависеть от множества компонентов. Один компонент может участвовать в нескольких разных закономерностях. Некоторые признаки существуют только в комбинациях нескольких направлений.
В исследованиях нейронов встречается даже ситуация, когда один компонент реагирует на несколько, на первый взгляд, не связанных между собой вещей. Это называют полисемантичностью.
Есть еще более интересная проблема — суперпозиция. Представим, что модели нужно хранить информацию о тысячах признаков, а размерность ее внутреннего пространства значительно меньше. Если многие из этих признаков редко появляются одновременно, модель может эффективно разместить их в одних и тех же направлениях. Получается своеобразное сжатие.
В одном и том же наборе нейронов могут быть закодированы несколько разных закономерностей, а конкретная активация оказывается смесью этих сигналов. Для DeepDream это создает неприятную ситуацию. Мы можем идеально визуализировать отдельный канал, но человеческое описание результата все равно будет неполным: канал может отражать сразу несколько закономерностей.
И проблема здесь не обязательно в плохой визуализации. Возможно, сам выбранный нейрон действительно не является хорошей единицей смысла.
Как искать признаки, если нейроны смешаны
В этом месте история становится современной. Если отдельные нейроны не всегда являются удобными строительными блоками, можно попытаться искать признаки непосредственно в пространстве активаций. Один из наиболее известных подходов последних лет — Sparse Autoencoder, или SAE.
Идея довольно простая. Берем большое количество активаций какого-нибудь слоя модели. Каждая активация представляет собой длинный набор чисел. Обучаем дополнительную небольшую нейросеть, которая должна научиться восстанавливать исходные активации через другой, более широкий набор скрытых признаков.
При этом вводится ограничение на разреженность: для конкретного состояния желательно, чтобы активировалось относительно небольшое число признаков. Представим (конечно же, условно), что исходное состояние содержит несколько смешанных сигналов. SAE пытается представить его как комбинацию более специализированных элементов:
признак A + признак C + признак H

Это вместо длинного списка одновременно изменившихся исходных нейронов.
Здесь важна именно избыточность пространства. SAE может иметь гораздо больше потенциальных признаков, чем исходная активация имеет нейронов. Это позволяет искать более разреженное представление и частично разделять то, что было упаковано вместе.
В работах Anthropic и других исследовательских групп SAE применялись к активациям трансформеров, где исследователи находили признаки, которые удавалось связывать с конкретными понятиями, языками, контекстами и другими закономерностями.
Что это меняет для интерпретации
Представим, что в некотором слое есть нейрон, который активируется и на французском тексте, и при обсуждении конкретного типа кода. Попытка визуализировать его активацию даст смесь. Человеку будет трудно решить, что именно означает получившийся паттерн. SAE может найти несколько более разреженных направлений, среди которых отдельно проявятся языковой и программный признаки.
Это не гарантированное извлечение «истинных понятий» из модели. SAE тоже является отдельной моделью, а ее результат зависит от архитектуры, коэффициентов разреженности, данных и других параметров. Но такой подход дает удобный способ исследовать представления, которые плохо совпадают с отдельными нейронами.
И тут становится понятнее, почему проблема, которую DeepDream обнаружил еще на изображениях, до сих пор никуда не исчезла. Внутреннее пространство модели не обязано быть устроено так, чтобы человеку было удобно его читать.
Мы можем получить понятный признак, распределенный по нескольким компонентах. Можем увидеть компонент, который участвует в нескольких признаках. Можем найти комбинацию сигналов, которая имеет смысл только вместе. Интерпретируемость приходится строить поверх этого сложного пространства.
Но найти понятный признак — еще недостаточно
Допустим, мы обнаружили в модели компонент, который часто активируется при обсуждении какого-то явления.
Можно описать его как «признак X». Однако остается главный вопрос: какую роль он играет в вычислении? Если убрать его, изменится ли ответ модели? Если усилить, станет ли соответствующее поведение встречаться чаще? Какие другие компоненты используют его сигнал? В каком месте вычисления он возникает?
Здесь появляется механистическая интерпретируемость. Ее интересует не только описание внутреннего состояния, но и вычислительный механизм, который связывает компоненты модели с ее поведением.
В идеальном случае исследователь получает не просто наблюдение «этот признак появляется в таких текстах», а причинную цепочку: определенный сигнал возникает в одном месте, передается дальше, изменяет состояние другого компонента, а в результате меняется конкретная часть поведения модели. Это значительно ближе к реконструкции алгоритма, который реализуется внутри обученной сети.
От визуализации к вмешательствам
В DeepDream уже есть зачаток такого экспериментального подхода. Мы можем изменить вход, измерить внутреннюю активацию и посмотреть, что произошло.
Современная интерпретируемость постепенно переходит от наблюдения к вмешательствам. Можно искусственно активировать найденный признак, подавить его, заменить одно внутреннее состояние другим или вмешаться в конкретную часть вычисления. Если после вмешательства модель начинает вести себя предсказуемым образом, гипотеза о роли этого компонента получает гораздо более серьезную поддержку.

Это особенно важно для языковых моделей. Их поведение часто слишком сложно, чтобы объяснять его отдельными примерами ответов. Один и тот же ответ может зависеть от длинной цепочки взаимодействий между слоями и компонентами.
Поэтому интерпретируемость постепенно превращается в экспериментальную дисциплину: нашли гипотезу о внутреннем механизме, вмешались в модель, проверили предсказание.
А что насчет современных генеративных моделей
Есть еще одна линия развития, связанная непосредственно с визуализацией. В классическом DeepDream мы оптимизировали пиксели напрямую. Это давало большую свободу, но одновременно позволяло оптимизатору находить странные изображения, которые сильно возбуждают сеть и при этом плохо выглядят для человека.
Получается своеобразный разрыв между тем, что считает значимым модель, и тем, что выглядит естественным человеку. В feature visualization поэтому стали использовать различные регуляризации и ограничения пространства поиска. Можно, например, заставить оптимизацию сохранять более естественные свойства изображения или параметризовать картинку через генеративную модель.
Генеративная модель в таком случае работает как ограничитель: оптимизатору становится сложнее уйти в произвольный пиксельный шум, потому что искомое изображение должно лежать в пространстве правдоподобных данных.
Современные диффузионные модели особенно интересны в этом контексте благодаря способности описывать сложное пространство изображений. Они могут использоваться как часть процедур, где исследователь хочет получить более естественную визуализацию некоторого признака или внутреннего состояния.
Важно только не называть диффузионные модели прямой заменой DeepDream. Это разные технологии и разные задачи.
Связь между ними скорее методологическая: и там, и там исследователь пытается связать внутренние представления модели с понятным человеку входом. Только сегодня пространство возможных входов стало гораздо более гибким и выразительным.
А что с трансформерами
DeepDream появился в эпоху сверточных сетей и был тесно связан с изображениями. Но сама идея исследования внутренних представлений не привязана к конкретной архитектуре.
У трансформера нет пикселей, которые можно постепенно менять. Зато есть токены, эмбеддинги, скрытые состояния, механизмы внимания, MLP-блоки и другие промежуточные представления.
Можно искать входы, которые вызывают определенные активации, анализировать наборы текстов, на которых возникает конкретный сигнал, исследовать направления в пространстве активаций и проводить внутренние вмешательства. Но визуальная интуиция DeepDream здесь становится менее удобной.
Когда мы видим изображение с десятками глаз, человеческому мозгу легко заметить закономерность. С последовательностью чисел размерности в несколько тысяч это сделать гораздо труднее.
Именно поэтому современные методы интерпретируемости часто используют сразу несколько типов свидетельств: примеры входов, статистику активаций, найденные признаки, вмешательства и анализ того, куда передается информация внутри сети.
Почему DeepDream особенно впечатляет на глубоких слоях
При этом старые эксперименты остаются полезными именно благодаря своей наглядности. На ранних уровнях сети оптимизация обычно усиливает границы, линии, направления и повторяющиеся текстуры.
На следующих уровнях эти элементы могут собираться в более сложные формы. Еще глубже появляются структуры, связанные с частями объектов и целыми объектами. Это не строгая лестница, где каждый слой соответствует одному уровню семантики. Современные нейросети устроены сложнее.
Но общая тенденция хорошо заметна: по мере прохождения через сеть исходные пиксели преобразуются в все более сложные представления. DeepDream позволяет буквально увидеть этот процесс.
Почему из этого получается искусство
Парадокс DeepDream заключается в том, что исследовательский метод оказался практически готовым художественным инструментом. Обычный фильтр меняет изображение по заранее заданному правилу.
DeepDream использует структуру конкретной обученной модели. Одна сеть будет особенно хорошо находить одни паттерны, другая — другие. Если модель обучалась на огромном наборе изображений с животными, она может превратить фотографию в лес из глаз и морд.
Если выбрать другую модель или другой слой, визуальный язык изменится. Поэтому DeepDream стал одновременно демонстрацией внутренних представлений и самостоятельным визуальным стилем.
Что все это говорит о ложных корреляциях
Предположим, мы обучили классификатор различать фотографии волков и собак. В тесте он показывает отличную точность. Кажется, задача решена, но затем выясняется, что фотографии волков почти всегда сделаны зимой, а фотографии собак — летом.
Модель вполне может обнаружить эту закономерность. Для нее снег может стать сильным признаком класса «волк», потому что этот признак хорошо работает на обучающих данных. На обычном тесте все будет выглядеть прекрасно. Стоит показать летнего волка или зимнюю собаку — качество резко упадет.
Человек знает, что снег не является частью определения волка. Модель этого знания не получает. Именно поэтому интерпретируемость полезна далеко за пределами академического любопытства. Она позволяет исследовать реальные стратегии, которые модель выработала во время обучения.
DeepDream дал исследователям простой способ увидеть некоторые из этих стратегий. Современные методы пытаются делать то же самое с более сложными представлениями.
Почему DeepDream не доказывает, что сеть «понимает»
Когда мы видим на результате вполне узнаваемую собаку, возникает ощущение, что модель должна иметь внутри достаточно точное понятие собаки. Но из одного изображения этого заключить нельзя.
Модель может получить похожий результат благодаря совершенно разным комбинациям статистических признаков. Разные изображения могут вызывать похожие внутренние активации, а визуально похожие изображения могут обрабатываться сетью совершенно по-разному.
DeepDream показывает одно направление чувствительности модели, но не предоставляет полного описания ее представлений.
Что мы на самом деле узнали
Экспериментальность. Внутренние представления нейросетей можно исследовать экспериментально, а не только наблюдать по конечным ответам.
Иерархия представлений. Глубокие модели действительно формируют сложные визуальные и абстрактные представления.
Отличие от людской логики. Эти представления могут сильно отличаться от человеческого описания задачи. Модель способна использовать фон, текстуру, контекст или случайные корреляции.
Отсутствие моносемантичности. Отдельные нейроны не обязательно являются элементарными понятиями. Информация может быть распределена между множеством компонентов и закодирована в суперпозиции.
Необходимость контекста. Найденный признак сам по себе еще не объясняет поведение модели. Нужно понимать его место в вычислении и проверять причинную роль.
И наконец, за последние годы инструментарий сильно вырос. От визуализации активаций мы пришли к методам, которые пытаются извлекать более интерпретируемые признаки из внутренних пространств моделей, а затем прослеживать взаимодействия этих признаков и проверять их через вмешательства. DeepDream оказался одним из ранних и очень наглядных примеров этой исследовательской идеи.
mrprogre
О, песня в тему :) Avandy Electronics - Electric Sheep Dreams