Автоэнкодеры состоят из 2 частей — энкодера и декодера. Кодер принимает входные данные и выводит то, что называется «кодом». Декодер берет этот код и обучается преобразовывать его обратно во входные данные. Если мы исходим из традиционного аргумента, согласно которому нейронные сети являются отображениями функций, то кодировщиком может быть f(x), а декодером может быть g(h). Итак, наш окончательный результат y равен g(f(x)). Поскольку мы только обучаем эти сети воспроизводить входные данные x, им не нужны никакие метки или, другими словами, они являются неконтролируемыми нейронными сетями.

Если мы возьмем простой пример ввода в виде четырехмерного вектора значений, скажем, 1, -1, 2, 3, и если выход из сети равен 1, 1, 2, 3, мы можем вычислить простое среднеквадратичное потеря во время обучения, которая в этом примере равна 1, и минимизировать эту потерю для обучения сети. Теперь вы можете начать понимать, что сеть может быстро изучить функцию единства, и выход может быть таким же, как вход. Однако на помощь приходит размерность кода. Обратите внимание, что на этом рисунке выходная размерность кодера равна всего 3, что означает, что размерность кода также равна 3 по сравнению с входной размерностью 4. Это означает, что сеть должна каким-то образом найти способ сжать четырехмерный вход. в трехмерное пространство. Используя тот же входной пример, код будет иметь совершенно другое представление со значениями, скажем, 0,8, 1,2 и 2,2. Сделав это, кодировщик буквально закодировал ввод в меньший размер. Этот автоэнкодер, в котором размерность кода меньше размерности ввода, называется недополным автоэнкодером. Рассуждая таким же образом, если размерность кода равна или больше размерности ввода (в данном случае 5), тогда это переполненный автоэнкодер. Всякий раз, когда автоэнкодер переполняется, очень высока вероятность того, что во время обучения он сопоставляется с единицей. Другими словами, он начинает посылать вход прямо на выход, просто игнорируя дополнительные узлы в сети.

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

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

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

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

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

Приложения автоэнкодеров

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

Последнее, но самое захватывающее применение автоэнкодеров — это генерация данных, а тип автоэнкодера, используемый для генерирования данных, называется вариационными автоэнкодерами. Я объясню их в моем следующем посте. А пока следите за обновлениями.

Выкрикивать

Почему бы не проверить наш канал YouTube AI Bites, где мы ясно объясняем концепции и документы ИИ.

Увидимся в моем следующем…