Автоэнкодеры (AE) - это нейронные сети, которые стремятся копировать свои входы на свои выходы. Они работают, сжимая входные данные в представление скрытого пространства , а затем реконструируя выходные данные из этого представления. Такая сеть состоит из двух частей:

  1. Кодировщик: это часть сети, которая сжимает входные данные в представление в скрытом пространстве. Он может быть представлен функцией кодирования h = f (x).
  2. Декодер: эта часть предназначена для восстановления входных данных из представления скрытого пространства. Он может быть представлен функцией декодирования r = g (h).

Таким образом, автокодировщик в целом можно описать функцией g (f (x)) = r, где вы хотите, чтобы r было как можно ближе к исходный ввод x.

Зачем копировать ввод на вывод?

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

Этого можно добиться, создав ограничения для задачи копирования. Один из способов получить полезные функции от автокодировщика - ограничить h меньшими размерами, чем x в этом случае автоэнкодер называется неполным. Обучая неполное представление, мы заставляем автокодировщик изучать наиболее важные особенности обучающих данных. Если автоэнкодеру предоставлена ​​слишком большая емкость, он может научиться выполнять задачу копирования без извлечения какой-либо полезной информации о распределении данных. Это также может произойти, если размер скрытого представления совпадает с размером ввода, а также в случае сверхполного, когда размер скрытого представления больше, чем размер ввода. В этих случаях даже линейный кодировщик и линейный декодер могут научиться копировать входные данные в выходные, не изучая ничего полезного о распределении данных. В идеале можно было бы успешно обучить любую архитектуру автокодера, выбирая размерность кода и мощность кодера и декодера в зависимости от сложности моделируемого распределения.

Для чего используются автоэнкодеры?

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

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

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

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

Типы автоэнкодеров:

В этой статье будут описаны четыре следующих типа автоэнкодеров:

  1. Ванильный автоэнкодер
  2. Многослойный автоэнкодер
  3. Сверточный автоэнкодер
  4. Регулярный автоэнкодер

Чтобы проиллюстрировать различные типы автокодировщиков, был создан пример каждого из них с использованием инфраструктуры Keras и набора данных MNIST. Код для каждого типа автокодировщика доступен на моем GitHub.

Ванильный автоэнкодер

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

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

Многослойный автоэнкодер

Если одного скрытого слоя недостаточно, мы, очевидно, можем расширить автокодер на большее количество скрытых слоев.

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

Сверточный автоэнкодер

Мы также можем спросить себя: можно ли использовать автокодеры со свертками вместо полносвязных слоев?

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

Регулярный автоэнкодер

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

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

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

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

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

Резюме

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

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