До сих пор у каждой картинки была метка: цифра, класс, маска. А если меток нет вовсе — можно ли всё равно нащупать в данных структуру? Автокодировщик отвечает так: пусть объект сам станет и вопросом, и ответом. Сеть обязана пропустить его через узкое горло короткого кода и восстановить обратно. Что уцелеет в этом сжатии — то и есть главное в объекте.
Объект как собственная метка
В уроке 31 цифра приходила с ответом — числом от нуля до девяти. Уберём ответ. Останется картинка , то есть точка в 64-мерном пространстве. Автокодировщик состоит из двух частей. Энкодер сжимает вход в короткий код
а декодер разворачивает код обратно в картинку . Учат обе части вместе, минимизируя ошибку восстановления по всей выборке:
Метка нигде не участвует. Сигнал для обучения сеть добывает из самого объекта — поэтому автокодировщик относят к обучению без учителя.
Здесь прячется ловушка. Если код не уже входа и сеть достаточно гибкая, она выучит тождество: просто перепишет вход в выход, ничего не поняв. Низкая ошибка тогда не значит ничего. Значит, сжатие обязано быть настоящим — код должен быть короче, чем объект.
Насколько именно грубее? Посчитаем среднеквадратичную ошибку восстановления по всем 1797 цифрам для каждой длины кода. Кривая падает круто, а рядом растёт доля сохранённой дисперсии — сколько разброса данных объясняет код.

Ошибка восстановления против длины кода. Уже 16 чисел из 64 удерживают около 85% дисперсии и почти всю узнаваемость. Полный код длины 64 восстанавливает точно — и ничего не сжимает.
Обрати внимание на крайние точки. Код длины 64 не сжимает ничего и восстанавливает идеально — но пользы в нём ноль. Код длины 1 сжимает сильнее всего, а цифру узнать нельзя. Всё интересное — посередине, где сжатие уже ощутимо, а смысл ещё цел.
Латентное пространство: карта, которую никто не рисовал
Сожмём каждую цифру до двух чисел и разложим точки на плоскости. Меток при построении кода не было — и всё же одинаковые цифры садятся рядом, образуя острова.

Каждая точка — цифра, сжатая до двух чисел. Цвет добавлен потом, для проверки; сам код метки не видел. Группы проступают там, где почерк устойчив, и смешиваются там, где цифры похожи.
Цвет здесь — только проверка нашей работы. Код построен вслепую, а структура всё равно проступила: данные о цифрах имеют форму, и сжатие её обнажает. Это и есть главная идея обучения без учителя — находить закономерность до того, как кто-то расставил метки.
Кластеры, которые никто не размечал
Насколько эта структура настоящая? Запустим по цифрам -средних с десятью кластерами — снова без единой метки. Затем спросим постфактум: какая цифра преобладает в каждом кластере. Доля «своих» в кластерах — чистота — выходит около . Почти четыре цифры из пяти сгруппированы верно, и никто не подсказывал ответ.
Линейный автокодировщик — это метод главных компонент
Не случайно наши картинки так похожи на PCA. Есть точное утверждение.
Поэтому линейный автокодировщик не открывает ничего сверх PCA — зато даёт ей понятный вид «сжал и восстановил».
Нелинейный код гнётся под данные
Настоящая сила автокодировщиков начинается там, где энкодер и декодер нелинейны. Линейный код умеет только проектировать облако точек на плоское подпространство — поэтому он и совпадает с PCA. Но реальные цифры лежат не на плоскости: тройки, восьмёрки и девятки образуют искривлённое многообразие в 64-мерном пространстве. Нелинейная сеть строит изогнутую поверхность, повторяющую эту форму, и тем же числом координат описывает данные точнее. Именно об этом выигрыше и говорили Хинтон с Салахутдиновым: многослойный автокодировщик находит коды, из которых восстановление получается заметно лучше, чем из главных компонент.
Русская линия здесь прямая. То, что на Западе называют разложением Карунена—Лоэва и главными компонентами, в советской теории случайных процессов развивалось как каноническое разложение В. С. Пугачёва: случайную функцию раскладывают по некоррелированным составляющим, и первые из них удерживают наибольшую долю разброса. Автокодировщик с бутылочным горлом делает ровно то же — оставляет несколько самых информативных направлений и выбрасывает остальное.
Ошибка восстановления как детектор странного
У сжатия есть неожиданное применение. Обучим автокодировщик только на обычных объектах. Тогда привычное он восстанавливает хорошо, а необычное — плохо, потому что для него в коротком коде не нашлось места. Величину
называют оценкой аномальности: чем хуже восстановление, тем подозрительнее объект.
::::
Шум как учитель: деноизирующий автокодировщик
Есть другой способ запретить сети лениться. Подадим на вход испорченную картинку , а целью оставим чистую :
Теперь тождество бесполезно: копировать вход — значит копировать и шум. Чтобы угадать закрытый шумом пиксель, сеть вынуждена опереться на соседей и на общий вид цифр. Учебного сигнала снова не потребовалось — портить картинку мы умеем сами.

Важная оговорка: сеть выучивает ровно тот шум, что видела при обучении. Модель, натренированная убирать мелкую рябь, спасует перед большим закрашенным прямоугольником — под маской просто нет информации, которую можно было бы восстановить из входа. Тип повреждения — часть постановки задачи, а не мелочь.
Деноизирующий автокодировщик обучали убирать независимый гауссов шум. На тесте ему дали цифру с закрашенным нулём центральным квадратом . Почему модель может не восстановить закрытую область, хотя мелкую рябь убирает уверенно?
Показать ответ
Гауссов шум оставляет в каждом пикселе слабый след истинного значения — сеть усредняет соседей и след и вытягивает цифру. Сплошная маска стирает информацию полностью: под квадратом входу нечего усреднять. Восстановить область можно лишь по общей форме класса, а не по локальным соседям, и модель, обученная только на ряби, такому не научилась. Разные повреждения требуют разного обучения.
::::
Как проверить, что код полезен
Красивая карта латентного пространства обманчива: двумерная проекция способна нарисовать убедительные острова даже там, где исходное расстояние никуда не годится. Поэтому код оценивают не на глаз, а внешней задачей.
Самая честная проверка — линейный зонд. Заморозим код и обучим по нему простой линейный классификатор, дав очень мало меток: скажем, по проценту на класс. Если такой классификатор по коду обыгрывает такой же по сырым пикселям, значит, код сложил информацию о классе в доступную форму. Рядом полезно измерить качество ближайших соседей: у скольких из десяти соседей в коде та же цифра.
Спроси себя перед тем, как поверить картинке: а устойчив ли этот кластер к сдвигу цифры на один пиксель? Совпадает ли он с метками? Двумерная проекция умеет сочинять группы на пустом месте. Оценивай соседей до проекции и по заранее выбранной задаче — тогда острову можно верить.
Отдельная тонкость — сравнивать коды двух сетей, обученных с разным начальным приближением. Покоординатно их сопоставлять нельзя: оси кода определены с точностью до поворота. Сравнивают подпространства, качество соседей или линейный зонд, но не номера координат. Неоднозначность базиса — математическое свойство задачи, а не дефект визуализации, о чём предупреждал ещё разговор о переобучении и утечке.
-средних разбил цифры на десять кластеров без меток, и чистота вышла . Как эта величина посчитана и что означала бы чистота ровно ? Почему — сильный результат для обучения без учителя, но всё же не то же самое, что классификатор с точностью ?
Показать ответ
В каждом кластере находят преобладающую цифру и считают долю объектов этой цифры; чистота — усреднённая по кластерам доля «своих». Чистота отвечала бы случайному разбиению десяти равных классов — кластеры не связаны с цифрами. Значение показывает, что структура цифр найдена без разметки. Но это не классификатор: соответствие «кластер → цифра» назначено постфактум, глядя на метки, а сам метод их не знал и не смог бы назвать новую цифру по имени.
Что забрать с собой
Автокодировщик превращает объект в собственную метку и заставляет информацию протиснуться через узкое горло. Что уцелело в коротком коде — то и было главным. Линейный случай — это в точности PCA и каноническое разложение Пугачёва; нелинейный ложится на изогнутую поверхность данных. Из одной идеи вырастают сразу три инструмента: сжатие, поиск аномалий по ошибке восстановления и деноизинг. И над всеми висит одно предупреждение — низкая ошибка сама по себе не доказывает, что код осмыслен; это проверяют внешней задачей. А за словами «главные направления» и «поворот осей кода» скрывается язык линейной алгебры: дальше мы разберём матрицы как преобразования пространства и увидим, откуда берутся сами эти направления.
Двигай длину кода и уровень шума. Слева — исходная цифра, справа — восстановление, внизу — ошибка. Смотри, при какой длине кода тройка перестаёт быть узнаваемой и как шум сдвигает эту границу.
Задачи
Картинка разворачивается в 64 числа и проходит автокодировщик
Linear(64,32)-ReLU-Linear(32,m)-ReLU-Linear(m,32)-ReLU-Linear(32,64), где у
каждого Linear есть смещение. Для и батча из 100 картинок выпишите форму
выхода каждого слоя Linear и число его параметров (веса плюс смещения). Считая
одно число float32 равным 4 байтам, найдите память сырого батча и
батча кодов и укажите коэффициент сжатия по числу значений.
Четыре точки , , , кодируются скаляром при и восстанавливаются как . Выведите точную сумму квадратов ошибок , найдите все минимизирующие на и минимум. Объясните, почему и дают одинаковое восстановление.
Шесть объектов в : , , , , , . Для матриц , и постройте коды и линейные декодеры . Проверьте, что в точной арифметике, и объясните на первой координате, почему смысл оси кода зависит от декодера.
Пусть для линейного автокодировщика с суммой квадратов ошибка при оптимальном коде длины равна , где — убывающие собственные значения ковариации данных. Докажите, что не возрастает с ростом и обращается в ноль при , равном рангу данных. Как это объясняет форму кривой ошибки из рис. 35.2?
-средних разбил 100 объектов трёх истинных классов на три кластера. Таблица «кластер × класс»: кластер A — , кластер B — , кластер C — (строки — кластеры, столбцы — классы). Найдите преобладающий класс каждого кластера и общую чистоту. Приведите пример перестановки чисел в одной строке, при которой чистота падает, хотя разбиение на кластеры не менялось, и объясните, почему чистота зависит от согласия с метками.
Автокодировщик обучен на «нормальных» объектах, оценка аномальности . На отложенной выборке 50 нормальных объектов имеют , а 50 аномалий — , кроме пяти нормальных с и трёх аномалий с . Для порога постройте матрицу ошибок (нормальный/аномалия), посчитайте точность, полноту и точность-по-классу-аномалий. Объясните, почему при редких аномалиях пара «точность—полнота» информативнее общей доли верных ответов.
Возьмите и для двух цифр и декодируйте путь , . Опишите, что покажут плавные кадры между концами и почему это ещё не доказывает, что смысловой признак меняется линейно. Предложите контроль: как по расстоянию от до ближайшего обучающего кода отличить осмысленную интерполяцию от экстраполяции декодера в пустую область.
На реальных цифрах (sklearn.datasets.load_digits, пиксели делить на
16) сравните PCA с полным разложением и восстановление для длин кода
. Для каждого сообщите среднеквадратичную ошибку по всем
1797 цифрам и долю сохранённой дисперсии, проверив, что при ошибка около
, а при — практически ноль. Отдельно запустите -средних на 10
кластеров и оцените чистоту относительно истинных цифр; сравните её со случайным
уровнем и объясните, почему полученные — это результат
обучения без учителя, а не классификации.