Автоэнкодеры являются базовой техникой машинного обучения и искусственного интеллекта, на основе которой строятся более сложные модели, например, в диффузионных моделях, таких как Stable Diffusion. Что же такое автоэнкодер?
Автоэнкодеры потому и называются автоэнкодерами, потому что они автоматически учатся кодировать данные в более компактное или низкоразмерное представление и затем декодировать его обратно в исходную форму. Этот термин можно разбить следующим образом:
Авто: означает что процесс является автоматическим. Модель учится сама, без необходимости в явных метках или человеческом вмешательстве для извлечения признаков. Во время обучения она автоматически находит, как лучше всего представить данные в низкоразмерной форме.
Энкодер: первая часть модели, энкодер, сжимает или кодирует входные данные в меньшую, сжатую форму. Этот этап включает уменьшение размерности входных данных, фактически обучаясь более компактной версии данных.
Декодер: вторая часть модели, декодер, пытается восстановить исходные входные данные из закодированного представления. Цель состоит в том, чтобы обеспечить максимальное сходство выходных данных с оригинальными входными, показывая, что кодирование сохраняет основные признаки.
Итак, прежде всего, автоэнкодер — это тип нейронной сети, используемый для обучения без учителя. Но не любой, а такой, который может кодировать и декодировать данные, подобно ZIP-архиватору, который может сжимать и разжимать данные. В машинном обучении он используется для уменьшения размерности или сжатия данных, а также для удаления шума с изображений (об этом мы поговорим позже).
Однако он делает это умнее, чем ZIP-архиватор. Он способен понять самые важные особенности данных (так называемые латентные, или скрытые признаки) и запоминает их вместо всех данных, чтобы затем восстановить что-то близкое к оригиналу из приблизительного описания. На изображениях, например, он может запомнить очертания обьектов или относительное положение объектов друг к другу. Это позволяет добиться интересного сжатия с потерями. Он работает примерно следующим образом:
Только в латентных признаках значения на самом деле являются дискретными, так что процесс ближе к следующему:
Данный подход важен для диффузионных моделей, потому что позволяет им работать в пространстве более низкой размерности (так называемом латентном пространстве), что гораздо быстрее, чем работа напрямую с изображения высокого разрешения. То есть, вместо того чтобы выполнять процесс удаления шума непосредственно на пикселях, изображение сначала сжимается в латентное пространство с помощью автоэнкодера, и диффузионный процесс происходит в этом пространстве меньшей размерности. После диффузии декодер восстанавливает изображение высокого разрешения из латентного представления. Если задуматься, это вполне логично. Для работы диффузионной модели нужно знать только основные признаки оригинального изображения, а не все мельчайшие детали, так зачем тратить время и вычислительные ресурсы на них?
За идеей автоэнкодера стоит очень простой трюк. Если мы искусственно ограничим количество узлов в сети автоэнкодера и обучим её восстанавливать данные из оригинала, это заставит сеть научиться сжатому представлению исходных данных просто потому, что у неё не будет достаточно узлов, чтобы запомнить все признаки данных. Ей придётся отбросить большинство несущественных признаков. Это, конечно, возможно только в том случае, если в данных существует какая-то структура (например, корреляции между входными признаками), потому что тогда эту структуру можно выучить и использовать, когда данные проходят через узкое место сети.
Эту сеть можно обучить путем минимизации ошибки реконструкции, которая измеряет различия между нашими исходными данными и восстановленным изображением после декомпрессии.
Вот пример того, как работает этап сжатия:
На каждом этапе сжатия мы уменьшаем размеры изображения вдвое, но удваиваем количество каналов, которые сеть может использовать для хранения латентных признаков.
Декодирование работает в обратном порядке:
Обратите внимание, что в конце мы получаем восстановленное изображение, а не оригинал. Они будут похожи, но не идентичны! Да, цель процесса обучения — сделать их как можно более похожими (то есть минимизировать ошибку реконструкции), но некоторые детали будут утрачены.
Идеальная модель автоэнкодера находит баланс между:
1. Достаточной чувствительностью к входным данным для их точного восстановления.
2. Достаточной нечувствительностью, чтобы избежать простого запоминания или переобучения на тренировочных данных.
В большинстве случаев это достигается путем задания функции потерь с двумя компонентами: один член, который поощряет модель быть чувствительной к входным данным (например, ошибка реконструкции), и другой член, который препятствует запоминанию или переобучению (например, регуляризационный член). Это очень важное наблюдение — важно убедиться, что автоэнкодер не просто учится эффективным способом запоминать тренировочные данные. Мы хотим, чтобы он находил латентные признаки, чтобы быть полезным для данных, отличных от обучающего набора.
Существуют и другие способы создания узкого места в сети, кроме ограничения количества узлов.
Мы можем ограничить сеть, ограничивая количество нейронов, которые могут активироваться одновременно. Это, по сути, заставит сеть использовать отдельные узлы скрытого слоя для специфических признаков входных данных (идея, несколько похожая на то, как разные области мозга обрабатывают разные типы информации).
В разреженных автоэнкодерах применяются методы регуляризации, которые поощряют скрытые единицы (нейроны) в сети поддерживать определенный уровень разреженности, то есть только небольшая их часть должна быть активна (т.е. иметь ненулевой выход) в любой момент времени. Вот основные типы регуляризации, используемые в разреженных автоэнкодерах:
Регуляризация с помощью KL-дивергенции:
Наиболее распространенный метод регуляризации разреженных автоэнкодеров — наложение ограничения на разреженность активаций скрытых единиц с использованием дивергенции Кульбака-Лейблера (KL).
Идея состоит в том, чтобы сравнить среднюю активацию скрытой единицы с желаемым уровнем разреженности, обычно обозначаемым небольшим значением (например, 0.05). KL-дивергенция штрафует отклонения от этого желаемого уровня разреженности.
Это достигается путем добавления штрафного терма разреженности к общей функции стоимости. Функция стоимости становится комбинацией ошибки реконструкции и штрафа за разреженность.
Желаемая разреженность часто обозначается как p (небольшое значение, например, 0.05). Средняя активация скрытой единицы j по тренировочным примерам обозначается как pj.
Общая функция стоимости J с регуляризацией через KL-дивергенцию выглядит так:
Где:
J_reconstruction — ошибка реконструкции (например, среднеквадратическая ошибка).
β — вес для управления силой штрафа за разреженность.
n_h — количество скрытых единиц.
L1-регуляризация:
L1-регуляризация поощряет разреженность, штрафуя абсолютное значение весов, что приводит к сдвигу многих весов к нулю.
Добавляя сумму абсолютных значений весов к функции стоимости, такая форма регуляризации эффективно поощряет модель использовать меньшее количество соединений, что ведет к разреженным активациям в скрытом слое.
L2-регуляризация:
L2-регуляризация, также известная как убывание весов (weight decay), препятствует большим весам, штрафуя сумму квадратов весов.
Хотя L2-регуляризация не напрямую обеспечивает разреженность, она помогает предотвратить переобучение и может дополнять другие методы, которые способствуют разреженности, такие как KL-дивергенция или L1-регуляризация.
Регуляризация активности:
Этот метод напрямую штрафует активации нейронов. К функции потерь добавляется член, который штрафует ненулевые активации, часто вычисляемый как L1-норма активаций.
Минимизируя сумму активаций, такая регуляризация поощряет большинство нейронов оставаться неактивными.
Еще одна идея заключается в добавлении шума к исходному изображению и использовании его в качестве входных данных, но для расчета ошибки сравнивается с очищенным оригиналом. Таким образом, модель учится, как бы, удалять шум с изображения, но как побочный эффект, она больше не может просто запомнить входные данные, потому что вход и выход не совпадают. Вот как выглядит процесс обучения:
Это, как указанно выше, заставляет модель запоминать только важные признаки и игнорировать шум (и другие несущественные детали).
Именно они применяются в диффузионных моделях. Основная идея заключается в том, что в обычных автоэнкодерах признаки хранятся как дискретные значения в слоях признаков. В вариационных автоэнкодерах (VAE) для каждого латентного признака используется вероятностное распределение. Это позволяет сети реализовать некоторые интересные функции, которые я опишу в отдельной статье.
Ограничения
Поскольку автоэнкодеры учатся сжимать данные, выявляя шаблоны и взаимосвязи (т. е. корреляции между входными признаками), которые проявляются во время обучения, они, как правило, эффективно восстанавливают данные, похожие на те, которые использовались в процессе обучения.
Также, способность автоэнкодеров сжимать данные сама по себе используется нечасто, так как обычно они уступают по эффективности вручную созданным алгоритмам, предназначенным для конкретных типов данных, таких как звук или изображения.
Хотя автоэнкодеры могут использоваться для кодирования текста, они менее часто применяются по сравнению с более современными архитектурами, такими как трансформеры (BERT, GPT и др.), потому что автоэнкодеры могут испытывать трудности с обработкой сложных языковых структур или длинных последовательностей, особенно без механизмов вроде внимания, которые помогают захватывать дальние зависимости.
Заключение
Автоэнкодеры являются фундаментальными строительными блоками в области машинного обучения и ИИ, предлагая универсальный подход к задачам, таким как сжатие данных, уменьшение размерности и удаление шума. Обучаясь кодировать данные в компактные, низкоразмерные представления и затем декодировать их обратно, автоэнкодеры могут эффективно захватывать важные признаки входных данных, отбрасывая менее значимые детали. Эта способность делает их ценными в приложениях, начиная от обработки изображений и заканчивая предобработкой данных, а также в качестве компонентов более сложных архитектур, таких как латентные диффузионные модели.
Я со-основатель AI интегратора Рафт.
Делюсь опытом в ТГ-канале.
Всем добра и позитивного настроения!