Для большинства реальных задач получение помеченных данных требует много времени и средств.
Например, предположим, вы хотите научить модель предсказывать, содержит ли публикация на r/wallstreetbets положительное или отрицательное отношение к определенной акции. Вы можете автоматизировать быстрый скрипт для извлечения сообщений из сабреддита, но потребуется несколько часов, чтобы прочитать сообщения и пометить каждое из них как положительное или отрицательное.
Что, если для изготовления этикетки требуется мнение эксперта, например анализ электронных медицинских карт? Тогда производство размеченных данных может стоить десятки тысяч долларов!
Обучение с полуучителем — это подход к машинному обучению, в котором для решения задач обучения с учителем используется небольшой объем размеченных данных и большой объем неразмеченных данных. В этой статье я объясню, что такое автоэнкодер, объясню некоторые варианты использования автоэнкодеров и представлю результаты небольшого тематического исследования полуконтролируемого обучения, которое я провел с использованием набора данных MNIST о моде.
Что такое автоэнкодер?
Автоэнкодер — это тип нейронной сети, способный находить закономерности и структуры в неразмеченных данных. Типичный автоэнкодер обучен выводить копию своих входных данных, но на сеть накладываются ограничения, чтобы он не мог тривиально копировать входные данные в выходные.
Например, скрытые слои сети обычно имеют более низкую размерность, чем входной и выходной слои, что вынуждает модель представлять входные данные в формате меньшей размерности, а затем использовать этот формат для восстановления входных данных.
Это не реалистичный пример, но на приведенной выше диаграмме показана сеть, которая берет массив 8 x 8 (обычно представляющий 2D-изображение или что-то в этом роде) и заставляет его в конечном итоге отображать функции в 16-мерный вектор и обратно в 8 x 8 массив. Добавляя «узкое место» в сеть таким образом, мы надеемся, что каждый из элементов 16-мерного вектора в центре представляет какую-то полезную функцию данных.
Таким образом, мы можем обучить автоэнкодер на неразмеченных данных, используя сами данные в качестве целевых выходных данных для модели. Мы надеемся, что он уловит полезные функции в данных, что позволит нам обучить эффективную модель на небольшом наборе связанных размеченных данных.
Как устроен автоэнкодер?
Автоэнкодер состоит из кодера и декодера.
Кодер состоит из слоев, которые обычно постепенно уменьшаются, и на выходе получается слой, содержащий закодированное представление входных данных.
Затем декодер принимает это закодированное представление в качестве входных данных и обычно является зеркальной копией кодера, целью которого является вывод исходных входных данных.
Иногда веса, используемые в кодировщике и декодере, «связаны вместе». Декодер использует транспонированную форму весов кодировщика, чтобы сэкономить время и ресурсы во время обучения. Это связано с тем, что декодер обычно не используется после обучения автоэнкодера, поэтому его реализация не так важна для решения проблемы.
Использование автоэнкодеров
В общем, автоэнкодер — это просто модель, которая обучена воспроизводить свои входные данные с некоторыми ограничениями. Однако ограничение не обязательно накладывать на саму модель, и некоторые модели могут иметь скрытые слои большего размера, чем входные/выходные слои.
Например, вы можете обучить автоэнкодер шумоподавлению изображения. Вы берете несколько входных изображений и каким-то образом добавляете искусственный шум, а зашумленные изображения используете в качестве входных данных. Таким образом, модель обучается создавать исходные изображения после просмотра зашумленной версии. Он по-прежнему вынужден в определенной степени улавливать значимые признаки во входных данных.
Похожий пример — обучение модели размыванию изображений.
Автоэнкодеры также можно использовать для исследовательского анализа данных, как я покажу в следующем разделе.
Тематическое исследование: Мода MNIST
Fashion MNIST — это набор изображений различных предметов одежды размером 28x28 в градациях серого. Всего существует 10 классов одежды, и цель состоит в том, чтобы предсказать класс одежды, к которому принадлежит каждое изображение.
В моем обучающем наборе было 55000 помеченных изображений одежды, но для этого проекта я хочу представить, что у меня их всего 5000.
Автоэнкодер
Это структура моего базового автоэнкодера. По сути, он берет изображение 28x28, в конечном итоге преобразует его в представление 3x3x64 (не буду здесь объяснять сверточные сети) и, в конце концов, снова выводит представление 28x28.
Вот несколько изображений, которые он сгенерировал после обучения на 55 000 изображений одежды в качестве входных данных и целей одновременно.
Использование автоэнкодеров для уменьшения размерности
Я прикрепил к кодировщику глобальный средний пулирующий слой, чтобы он выдавал 64-мерный вектор вместо матрицы 3x3x64. Затем я использовал другой метод уменьшения размерности, чтобы уменьшить размерность моих данных до двух измерений, чтобы я мог нанести репрезентативные точки для своих данных.
Это один из способов использования автоэнкодеров для визуализации. Как мы видим, обувь внизу справа, штаны внизу слева, а одежда/сумки вверху. Некоторые классы легко разделить, и мы уже можем видеть, как формируются четкие кластеры, в то время как другие классы могут быть трудно дифференцированы (например, рубашки и прочее, которые сильно перекрываются на этом изображении).
Теперь я хочу обучить модель на небольшом подмножестве из 5000 помеченных изображений и посмотреть, насколько хорошо она справится. Я также хочу сравнить его с моделью, обученной на полном тренировочном наборе из 55000 изображений.
Использование энкодера для контролируемого обучения
Из приведенного выше изображения видно, что кодировки, созданные автоэнкодером, четко определяют полезные функции во входных изображениях. Помните, что «кодировки» на самом деле представлены в автокодировщике в виде 64 карт признаков 3x3 (3x3x64), но мы уменьшили эти карты до двумерного вектора для визуализации. Кодировки, вероятно, содержат гораздо больше полезных данных, чем представлено на графике выше.
Используя ограниченные размеченные данные, мы хотим обучить довольно точную модель, способную делать прогнозы на основе набора данных моды MNIST.
Во-первых, я должен разработать модель. Я придумал простую архитектуру модели и добавил некоторые функции для предотвращения переобучения.
Я просто объединил полученные карты объектов в 576-мерный вектор, а затем добавил несколько полносвязных сетевых слоев с разной степенью исключения.
Ничего страшного, если это не имеет особого смысла, основная идея в том, что я подключил энкодер к собственной сети. Теперь я использую кодировки в качестве входных данных для нейронной сети, созданной для прогнозирования 10 классов моды MNIST.
Полученные результаты
Я обучил модель, включающую кодировщик, и смог достичь точности обучения 89% и точности проверки 86%. Это говорит о том, что модель не слишком облегающая и достаточно эффективно классифицирует одежду. Я не занимался тонкой настройкой модели, так что это впечатляет!
Я также обучил сверточную сеть с аналогичной архитектурой на всем обучающем наборе данных и достиг точности проверки 88%.
Когда я обучил эту модель на меньшем наборе данных (5000 наблюдений), она смогла достичь только около 80% точности проверки.
В целом это говорит о том, что мы можем повысить производительность наших моделей, используя автоэнкодеры для полуконтролируемого обучения. Модель кодировщика была обучена на данных в 11 раз меньше и достигла приличной точности.
В реальных приложениях науки о данных важно учитывать множество вопросов, не связанных с рассматриваемой проблемой, таких как эффективность и скорость решения, при оценке конкретного подхода. Надеемся, что эта статья послужит хорошим введением в один из многих методов, которые могут помочь в достижении этой цели.
Часть кода для загрузки/визуализации данных была взята из учебника Hands on Machine Learning, написанного Аурелионом Героном. Я не планирую публиковать код для этой статьи, потому что считаю его довольно простым.