Как AutoEncoders можно использовать для обучения встраиванию объектов без учителя
Встраивания стали стандартным способом представления категориальных функций в машинном обучении. Возможность кодировать слова, сущности или значения категорий в осмысленные, плотные векторные представления и выполнять числовые операции и сравнения между ними привела к значительному прогрессу в этой области за последние годы.
В этом посте я хотел бы сделать краткий обзор различных стратегий встраивания (в основном контролируемых и неконтролируемых) и представить AutoEmbedder, модель, которую я использую для обучения встраиванию слоев в неконтролируемом обучающие задания.
Вложения слов
Встраивания слов возникли в области обработки естественного языка как статистический подход к представлению слов в виде векторов на основе совместного появления слов в предложениях. Основное преимущество этих представлений - высокая корреляция между сходством смысла слов и сходством встраивания.
Спустя годы в Google Word2Vec (2013) и Facebook’s FastText (2016) были представлены новые подходы к встраиванию генерации на основе машинного обучения:
- Непрерывный набор слов (Word2Vec): предсказывает среднее слово на основе окружающих контекстных слов.
- Continuous Skip-Gram (Word2Vec): предсказывает слова в диапазоне вокруг текущего слова.
- Информация о подслове (FastText): использует функции на уровне подслова (группы символов) для создания вложений.
Все эти подходы можно обучить на больших массивах немаркированных данных, потому что они полагаются на лежащую в основе структуру предложения (и структуру слова в случае FastText), чтобы узнать о взаимосвязях слов.
Вложения сущностей
Все вышеперечисленные стратегии внедрения также могут работать с объектами при условии, что мы их правильно кодируем. В конце концов, предложения - это списки строк, и сущность, состоящая из категориальных свойств, может быть представлена таким же образом!
Модели обучения, такие как FastText, Word2Vec на объектах для создания вложений, возможны, но есть 2 проблемы:
- Вложения, созданные этими моделями, находятся «в одной плоскости», что означает, что модели не учитывают тот факт, что каждое «слово» на самом деле является значением другой функции; это означает, что все категориальные функции будут закодированы в одном и том же скрытом пространстве
- Когда вложения используются в контролируемых обучающих задачах, обычно лучше обучать их той же цели, что и задача, то есть обучать встраиваниям для конкретных задач.
Обе проблемы можно решить, используя слои внедрения нейронов. Эти слои обучаются с обратным распространением информации во время выполнения задачи и могут использоваться для передачи категориальных данных в нейронные сети.
Обычно для каждой категориальной характеристики используется один модуль внедрения; таким образом, каждая функция будет закодирована в разном скрытом пространстве (что означает, что сравнивать вложения из разных функций не имеет особого смысла).
Если вы заинтересованы в изучении этой темы, вот ссылки на статью и некоторые варианты реализации:
- Сущность вложения категориальных переменных (arXiv)
- Встраивание слоев в PyTorch
- Встраивание слоев в Fastai
- Встраивание слоев в TensorFlow
Автоэмбеддер
Нейронные вложения отлично подходят для контролируемых учебных задач. Но как насчет неконтролируемых задач? У нас нет цели, на которой можно было бы обучать слои встраивания! Мы могли бы прибегнуть к моделям Word2Vec / FastText, но, как было сказано ранее, это оставит нам единое скрытое пространство для всех наших категориальных функций ...
Я исследовал эту проблему в последние недели и пришел к следующей идее: что, если бы мы могли передать векторы внедрения, сгенерированные из слоев, в модель, которой не требуется явная цель для обучения, например AutoEncoder?
Это может устранить необходимость в явной целевой функции, поскольку потери AutoEncoder вычисляются путем сравнения сетевого входа с сетевым выходом.
В результате получается следующая архитектура:
Выполнение
Fastai был идеальной площадкой для игр, поскольку они уже предоставляют Табличный инструментарий, который заботится о загрузке данных и разделяет категориальные / непрерывные функции перед их передачей в модель.
Мне пришлось немного взломать их стандартный TabularModel
, чтобы установить в него AutoEncoder, и в итоге я полностью его заменил.
Конечный результат - это следующий фрагмент кода:
Примечание: класс SymmetricalAutoEncoder
был опущен, но вы можете найти весь код здесь.
Оценка модели
Оценка модели проводилась путем измерения оценки реконструкции и оценки прогноза, которые определены ниже.
Используемые наборы данных оценки: Набор данных для взрослых (с использованием встроенного Fastai), Набор данных о ценах на жилье, Каталог подержанных автомобилей и База данных городов мира.
AutoEmbedder был обучен 20 раз на каждом наборе данных по 20 циклов каждый (подробнее о политике одного цикла см. Здесь).
Реконструкция Оценка
Оценка реконструкции измеряет степень смешения между разными значениями каждой переменной.
Он рассчитывается в три этапа:
- Кодирование тестового набора данных во встраиваемые векторы
- Декодирование векторов обратно в категории
- Сравнение исходных значений и реконструированных значений
Оценка рассчитывается как процент правильных реконструкций для каждого объекта. В таблице ниже показаны оценки для всех четырех наборов данных, усредненные за 20 циклов обучения:
Генерация встраивания практически не допускает путаницы в категориях для большинства функций. Исключением из этого поведения являются значения категорий, которые появляются в наборе данных только один или два раза.
Оценка прогноза
Оценка прогноза измеряет значимость векторов внедрения.
Он получается путем сравнения эффективности прогнозирования двух моделей, обученных одной и той же контролируемой задаче. Единственное различие между моделями состоит в том, что одна использует контролируемые встраивания, а другая - неконтролируемые предварительно обученные вложения.
Оценка прогноза была рассчитана на наборах данных Выборка для взрослых и Цены на недвижимость за 20 циклов обучения с использованием показателей точности и экспоненциального RMSPE. соответственно. Оценка модели для каждого цикла - это метрическое значение последней эпохи обучения.
Сравнение проводилось с использованием критерия Стьюдента при гипотезе равного среднего значения между популяциями одинакового размера.
Нулевой гипотез того же среднего значения был принят с ошибкой 0,05% для обоих наборов данных, что означает, что неконтролируемые вложения, обученные с помощью AutoEmbedder, могут успешно использоваться для вывода с незначительным падением производительности.
Выводы
AutoEmbedder - это жизнеспособная стратегия для обучения нейронных встраиваний в контексте обучения без учителя. Он генерирует значения, которые принадлежат отдельным скрытым пространствам, что отличает его от других стратегий, таких как встраивание на основе NLP.
Рабочую реализацию AutoEmbedder можно найти в этой библиотеке Python вместе с оболочкой FastText и различными другими методами категориального кодирования, которые я заключил в общий интерфейс.
Библиотека также содержит привязки Fastai для табличных задач, поэтому, если вы уже используете Fastai, вы можете обучить неконтролируемые вложения для своей модели, просто добавив Табличное преобразование CategoryEncode.