Как галлюцинируют нейросети

Что происходит с человеческим мозгом во время галлюцинаций?

Большинство наркотических веществ, которые вызывают галлюцинации (опыты, в которых вы видите, слышите, чувствуете или обоняете несуществующее) делают это, воздействуя на мозговые центры так называемыми “гормонами счастья”. Такие галлюциногены, как PCP и LSD перегружают серотониновые рецепторы, что приводит к измененному визуальному восприятию форм, цветов, звуков, запахов и вкусов.

По схожему принципу можно симулировать галлюцинации, называемые “DeepDream” (глубокие сны), в нейронных сетях, чрезмерно стимулируя их. В результате нередко образуются сноподобные, яркие, психоделические изображения:

Источник DeepDreamGenerator

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

Чтобы понять принцип его работы, сначала нужно разобрать принцип работы свёрточных нейронных сетей: 

  1. Изображение передается в свёрточную нейросеть.
  2. Начальные слои обнаруживают через свёрточные слои такие низкоуровневые признаки, как края, углы и точки. После этого изученная информация многократно обобщается слоями выборки.
  3. На основе уже изученных данных образуются последующие слои, которые обнаруживают высокоуровневые признаки, такие как лица, деревья или машины. 
  4. Заключительные, как правило, плотные полносвязные слои формируют из всех полученных признаков завершенное понимание и классифицируют изображение.

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

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

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

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

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

После этого сгенерированное DeepDream изображение станет представлением всего, что данная сеть научилась распознавать.

Для поиска изменений параметров, необходимых для обнаружения наибольшего уменьшения функции потерь, используется градиентный спуск. Аналогичным образом DeepDream использует градиентный подъём для обнаружения изменений в значении каждого пикселя, требуемых для максимального увеличения активации этого слоя. 

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

В итоге формально можно представить алгоритм DeepDream так:

  1. Прямое распространение изображения через обученную архитектуру (это не обязательно должна быть свёрточная нейросеть).
  2. Выбор предпочтительного слоя для максимальной активации.
  3. Вычисление вывода этого слоя.
  4. Нахождение градиента изображения с учётом активаций выбранного слоя (выяснение, как изменение изображения влияет на вывод).
  5. Изменение изображения для увеличения этих активаций при помощи градиентного подъёма и регуляризатора, обеспечивающего сглаживание. 
  6. Повтор предыдущих шагов несколько раз. Чем больше итераций алгоритма, тем больше влияние на итоговый шаблон. 

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

Источник: PyCharm Blog

Обратите внимание, что сущности на этом изображении явно распознаются сетью, потому что присутствуют в наборе данных. Машины появляются, потому что они есть в данных, и сеть выделила определённые части слоя специально для их идентификации. 

Однако низкоуровневые признаки DeepDream также могут добавляться в изображение с большим количеством краёв и точек базового уровня. Вот базовые представления изображения на более ранних слоях:

Слева: DeepDreamGenerator. Справа: TensorFlow blog

В ином случае, когда целью является выделение одного конкретного объекта изображения (а не всех изученных сущностей, которых может быть слишком много), можно передать изображение, определить, какие узлы были активированы, и активировать при помощи DeepDream только их. Например, если при передаче в сеть изображения кошек активируются узлы A, B и C, мы используем DeepDream для максимального увеличения выводов только этих узлов для любого изображения. 

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

Источник: Google AI blog

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

Источник: Google AI blog

Как бы то ни было, алгоритм DeepDream по-прежнему больше используется именно для развлечения. С его помощью можно получить интересные визуализации того, что сеть может распознать. Это в свою очередь может помочь объяснить, почему сеть может не работать ожидаемым образом, или гарантировать, что при принятии решений она прибегает к разумным обоснованиям. 

Кроме того, этот алгоритм может быть интересен для объяснения феномена “биологической нейронной сети”: почему люди иногда видят лица или другие привычные объекты в неодушевлённых объектах “данных для обучения”, особенно в отсутствии света, т. е. при недостатке информации.

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Andre Ye: What Happens When Neural Networks Hallucinate

Предыдущая статьяОбзор синтаксиса PHP
Следующая статьяНовый модуль временных рядов PyCaret