Охота на электроовец. Большая книга искусственного интеллекта - Марков Сергей Николаевич
Хотя сегодня редко используют машины Больцмана, Гельмгольца или DBN непосредственно, да и мало кто из специалистов-практиков в области глубокого обучения с ходу вспомнит особенности этих моделей, они сыграли в истории нейронных сетей важную роль, став предшественниками современных глубоких сетей-автокодировщиков, о которых мы поговорим в следующем разделе.
5.2.6 Автокодировщики, контрастное обучение и близнецы Барлоу
Истратил я зарплату на новый пылесос.
Шумит как экскаватор, свистит как паровоз.
Вся пыль в него влетает с ковров и со стены…
И тут же вылетает с обратной стороны.
Современный прогресс в машинном обучении трудно представить без ещё одного важного класса нейросетевых моделей, а именно без автокодировщиков [autoencoder], которых также называют автоэнкодерами или иногда — автоассоциаторами.
Обсуждая в начале книги типы задач, решаемых при помощи методов машинного обучения, мы упоминали задачу сокращения размерности. Например, словесное описание объекта куда компактнее фотографии, сделанной с высоким разрешением, однако по этому описанию можно, пусть и с некоторыми потерями, восстановить внешний вид описанного объекта. Представьте себе многослойную нерекуррентную нейронную сеть, в которой размерность рецептивного слоя в точности равна размерности выходного слоя. При этом слой, находящийся в середине сети, обладает существенно меньшей размерностью (либо при обучении такой сети используются какие-либо штрафы или ограничения для значений в этом слое). Например, на вход сети подаётся изображение размером 100 × 100 пикселей, стало быть, в её рецептивном слое, как и в выходном, 10 000 нейронов. В промежуточном же слое сети всего 500 нейронов. Мы будем обучать эту сеть таким образом, чтобы изображение, полученное на выходе сети, было максимально похоже на изображение, подаваемое на вход. Важной особенностью такой процедуры обучения является отсутствие учителя: данные, используемые для обучения автокодировщика, в общем случае не требуют разметки. Предъявив автоэнкодеру в ходе обучения десятки или сотни тысяч изображений, мы таким образом вынудим сеть придумать такой способ компактного представления картинок, который позволит добиться минимальных потерь в изображении при последующем его декодировании. При этом часть сети, начинающаяся с рецептивного слоя и заканчивающаяся самым узким слоем (своеобразным «бутылочным горлышком»), будет выполнять функцию кодировщика, а часть сети, начинающаяся с самого узкого слоя и заканчивающаяся выходным слоем, — роль декодера. Совокупность сигналов в нейронах самого узкого слоя, при поступлении на вход некоторого образа, называется латентным вектором [latent vector] или латентным представлением [latent representation] образа, а пространство возможных значений латентного вектора — латентным пространством. Описанная нами нейронная сеть называется, как вы уже, наверное, догадались — автокодировщиком.

Сама архитектура связей такой сети может быть различной. Например, для обработки изображений чаще всего применяют свёрточные автокодировщики, то есть на входе такой модели присутствуют слои свёртки, а на выходе — обратные им по выполняемой функции слои развёртки. При обработке последовательностей могут использоваться рекуррентные автокодировщики. Ничто не мешает использовать и полносвязные архитектуры, архитектуры с какими-то особенными вычурными слоями.
Почему и за счёт чего автокодировщики работают? На этот вопрос можно ответить по-разному, но важно, что на практике данные, обрабатываемые при помощи автоэнкодеров, содержат некоторую избыточность, они отличаются от равномерно распределённого шума. В них присутствуют закономерности, которые и учится выявлять автокодировщик в процессе обучения.
Чем могут быть полезны автокодировщики? Конечно, первое напрашивающееся применение — это сжатие данных с потерями. Однако потенциальная польза от автокодировщиков куда шире. Автокодировщик может применяться в качестве генеративной модели. Например, обучив его на большом наборе фотографий людей, можно затем сгенерировать латентный вектор случайным образом, подставить его в декодер и получить совершенно новое фото (для таких задач в наши дни обычно используются так называемые вариационные автокодировщики (Variational Autoencoders, VAE) [1501] или методы вроде «состязательно ограниченных интерполяций автокодировщиков» (Adversarially Constrained Autoencoder Interpolation) [1502], которые накладывают некоторые дополнительные ограничения на латентные векторы автокодировщика, чтобы улучшить сходимость модели и качество генерируемых данных). Латентные векторы автокодировщика могут быть входом для моделей, решающих задачи классификации и регрессии — ведь компоненты такого вектора представляют собой, по сути дела, набор абстрактных признаков образов, использованных при обучении автоэнкодера. Потратив единожды вычислительные ресурсы на обучение автокодировщика, можно затем «недорого» строить множество «лёгких» моделей, решающих широкий спектр задач.
В начале нашего тысячелетия автокодировщики применялись для каскадного обучения глубоких сетей. Этот метод, предложенный [1503] Джеффри Хинтоном и Русланом Салахутдиновым, заключается в том, что слои нейронной сети обучаются последовательно слева направо. К очередному необученному слою на время обучения подключается декодер, дополняющий сеть до архитектуры автокодировщика. Затем полученный автокодировщик обучается, причём веса в уже обученных ранее слоях на время обучения фиксируются, этот приём называется заморозкой [freezing]. Описанная процедура повторяется для всех слоёв сети, кроме последних, которые обучаются в обычном режиме — с учителем и с применением метода обратного распространения ошибки. В наши дни этот способ обучения глубоких сетей применяется редко, поскольку были найдены другие, более удобные для практического применения способы борьбы с исчезновением градиента. Однако в отдельных случаях послойное предобучение всё-таки позволяет добиться наилучших результатов.
Также автоэнкодеры могут применяться для очистки сигнала от шума, в таком случае используют термин «шумоподавляющие автокодировщики» (Denoising Autoencoders, DAE) [1504]. При обучении такого автокодировщика мы можем добавлять на вход сети некоторый шум, стремясь на выходе получить образ до внесения в него шума.
К латентному пространству автокодировщика можно присоединить какую-либо семантическую информацию относительно входного образа, например возраст человека на фото или наличие у него бороды. Затем, на этапе работы декодера, можно подменить эти значения другими, тем самым заставив сеть изменить возраст человека на фото или пририсовать ему бороду. Нередко отдельные компоненты латентного представления сами по себе в результате обучения оказываются интерпретируемыми параметрами: их смысл можно обнаружить, наблюдая изменения, происходящие с образом при изменении отдельных компонентов латентного вектора. Словом, значение автокодировщиков для республики машинного обучения огромно. Их вклад в достижение WOW-эффекта от многих демонстраций возможностей современных технологий искусственного интеллекта трудно переоценить.
Разобраться в том, кто именно изобрёл автокодировщики, не так уж просто. Сама идея сокращения размерности данных не нова. Ещё в 1901 г. Карл Пирсон, основатель математической статистики, предложил свой знаменитый метод главных компонент (Principal component analysis, PCA) [1505] — один из наиболее популярных «классических» способов уменьшения размерности данных с потерей наименьшего количества информации. Первые коннекционистские модели, адресующие эту проблему, появились в начале 1980-х. Ими стали самоорганизующиеся карты Кохонена (Self-organizing map, SOM) — одна из разновидностей сетей Кохонена. Их создатель, финский учёный, специалист в области искусственных нейронных сетей и машинного обучения Теуво Кохонен, опубликовал в 1981–1984 гг. первые работы, посвящённые развитию своей модели [1506], [1507], [1508].