Как AutoEncoders можно использовать для обучения встраиванию объектов без учителя

Встраивания стали стандартным способом представления категориальных функций в машинном обучении. Возможность кодировать слова, сущности или значения категорий в осмысленные, плотные векторные представления и выполнять числовые операции и сравнения между ними привела к значительному прогрессу в этой области за последние годы.

В этом посте я хотел бы сделать краткий обзор различных стратегий встраивания (в основном контролируемых и неконтролируемых) и представить AutoEmbedder, модель, которую я использую для обучения встраиванию слоев в неконтролируемом обучающие задания.

Вложения слов

Встраивания слов возникли в области обработки естественного языка как статистический подход к представлению слов в виде векторов на основе совместного появления слов в предложениях. Основное преимущество этих представлений - высокая корреляция между сходством смысла слов и сходством встраивания.

Спустя годы в Google Word2Vec (2013) и Facebook’s FastText (2016) были представлены новые подходы к встраиванию генерации на основе машинного обучения:

  • Непрерывный набор слов (Word2Vec): предсказывает среднее слово на основе окружающих контекстных слов.
  • Continuous Skip-Gram (Word2Vec): предсказывает слова в диапазоне вокруг текущего слова.
  • Информация о подслове (FastText): использует функции на уровне подслова (группы символов) для создания вложений.

Все эти подходы можно обучить на больших массивах немаркированных данных, потому что они полагаются на лежащую в основе структуру предложения (и структуру слова в случае FastText), чтобы узнать о взаимосвязях слов.

Вложения сущностей

Все вышеперечисленные стратегии внедрения также могут работать с объектами при условии, что мы их правильно кодируем. В конце концов, предложения - это списки строк, и сущность, состоящая из категориальных свойств, может быть представлена ​​таким же образом!

Модели обучения, такие как FastText, Word2Vec на объектах для создания вложений, возможны, но есть 2 проблемы:

  1. Вложения, созданные этими моделями, находятся «в одной плоскости», что означает, что модели не учитывают тот факт, что каждое «слово» на самом деле является значением другой функции; это означает, что все категориальные функции будут закодированы в одном и том же скрытом пространстве
  2. Когда вложения используются в контролируемых обучающих задачах, обычно лучше обучать их той же цели, что и задача, то есть обучать встраиваниям для конкретных задач.

Обе проблемы можно решить, используя слои внедрения нейронов. Эти слои обучаются с обратным распространением информации во время выполнения задачи и могут использоваться для передачи категориальных данных в нейронные сети.

Обычно для каждой категориальной характеристики используется один модуль внедрения; таким образом, каждая функция будет закодирована в разном скрытом пространстве (что означает, что сравнивать вложения из разных функций не имеет особого смысла).

Если вы заинтересованы в изучении этой темы, вот ссылки на статью и некоторые варианты реализации:

Автоэмбеддер

Нейронные вложения отлично подходят для контролируемых учебных задач. Но как насчет неконтролируемых задач? У нас нет цели, на которой можно было бы обучать слои встраивания! Мы могли бы прибегнуть к моделям 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.