Вступление:

Возможно, наиболее важной проблемой в машинном обучении (ML) является представление необработанных входных данных, которые можно использовать в качестве хорошего предиктора для модели ML. Такое представление данных часто представляется как вектор признаков, который можно использовать для обучения модели. С появлением глубоких нейронных сетей (DNN), таких как сверточные нейронные сети (CNN), создание таких функций становится более автоматизированным в скрытых слоях, но все же входные данные должны быть представлены в первом слое, называемом видимым слоем. . Та же история применима к обработке естественного языка (NLP). В отличие от данных, используемых в НЛП и компьютерном зрении, во многих случаях данные не являются структурными и однородными, а являются мультимодальными. Например, в журналах данных Ad-Tech хранится комбинация категориальных и реальных функций для прогнозов - функция может обозначать рейтинг кликов (CTR) с прошлой недели, возраст, географическое местоположение пользователя и т. Д. То же самое относится к широкому кругу задач с многомодальными переменными, от роботизированных задач до прогнозирования погоды и т. Д.

Вопрос, который мы хотели бы здесь обсудить, заключается в том, как такая разнообразная форма реальных данных может быть представлена ​​в качестве входных данных для параметризованных моделей машинного обучения, таких как логистическая регрессия (LR) или DNN?

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

  1. Он может иметь большую ошибку предсказания из-за разрешения размера ведра.
  2. Размерность вектора признаков и, следовательно, размер модели увеличивается, если для размера корзины было выбрано гораздо более низкое разрешение.
  3. Как мы объясняем на Рисунке 1, ему не хватает обобщения.

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

На рисунке 1. показано, как кодирование плитки работает в одномерном измерении следующим образом: Рассмотрим переменную функции x, которая может принимать значения в интервале [a, b]. Шаг дискретизации (называемый мозаикой 1 на рисунке 1) делит интервал на 4 сегмента, и поэтому точка данных p будет представлена ​​двоичным вектором [1,0,0,0] и аналогично q будет представлен как [0, 1,0,0]. Для ясности представим два вектора их разреженным представлением в виде p = [1] и q = [2], где каждый элемент массива указывает порядковый номер сегмента, в который попадает значение. Используя идею кодирования тайлов, теперь мы сдвигаем все сегменты тайлинга 1 на небольшую величину (обычно размер ведра делится на общее количество мозаик; это 3 на рисунке 1) и генерируем тайлинг 2 и сложите его поверх плитки 1, как показано на рисунке 1. Теперь мы получаем p = [1,5] и q = [2,6]. Пока что p и q не связаны через свои представления. Затем мы делаем еще один сдвиг на Тайлинге 2, генерируем Тайлинг 3 и складываем его на Тайлинг 2. Теперь их представления становятся p = [1,5,9] и q = [2,6,9]. Сразу же, с Tiling 3, p и q становятся связанными через индекс тайла 9. Это ключ к обобщению тайлового кодирования.

Как мы видим, размер результирующего вектора признаков теперь в 3 раза превышает исходный размер за счет разбивки на блоки, но, как мы увидим позже, он все равно может обеспечить лучшую производительность, даже если мы уменьшим разрешение сегмента в 3 раза.

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

Идея тайлового кодирования исторически восходит к арифметической модели Cerebellar Model Arithmetic Computer (CMAC) Альбуса [1975] как модели, разработанной для обучения в нейронных сетях (NN). На рис. 3. показано, как похожие образцы (S1 и S2) имеют схожие представления.

По мере того, как мы получаем все больше и больше функциональных переменных, мы столкнемся с проклятием размерности. Курсор размерности относится к экспоненциальному увеличению пространства векторов признаков по мере увеличения переменных признаков.

Работа с проклятием размерности:

Есть два эффективных метода решения этой проблемы:

  1. Уловка хеширования для ограничения выделения размера памяти
  2. Мозаика по отдельным и (некоторым из) парам отдельных переменных (известное как пересечение признаков, учитывающее нелинейности второго порядка).

Из-за разреженности представлений мы эмпирически заметили, что эффективность таких приближений может в значительной степени снять проклятие. На рисунке 4. показано расширение, а затем проекция (встраивание) входного уровня с использованием тайлового кодирования в сочетании с глубокими нейронными сетями для фиксации возможных нелинейностей, которые мы могли бы потерять из-за механизма тайлов первого или второго порядка.

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

Простой пример тайлового кодирования: прогнозирование нелинейной функции с помощью метода линейной регрессии

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

В качестве примера мы стремимся изучить функцию y = sin (x). Мы рассматриваем проблему как контролируемую линейную регрессию и, таким образом, генерируем образцы I.I.D для (x, y), из функции, чтобы сформировать наборы данных для обучения и тестирования. Мы используем простой стохастический подход градиентного спуска для обновления параметров обучения (также известный как LMS или правило дельты). В конечном итоге мы используем среднеквадратичную ошибку (RMSE) в качестве метрики для измерения обучения.

Рисунок 5. показывает, что подход кодирования тайлов намного более эффективен, чем метод бакетизации; даже для случая, когда размер вектора признаков - размер модели - одинаков для обоих (20 × 16).

Эмпирический результат на реальном наборе данных:

Здесь мы используем набор данных UCI винного качества в качестве второго примера для задачи классификации. Набор данных состоит из 11 переменных признаков с действительными значениями, с оценкой качества от 0 до 10. Здесь переменные признаков являются мультимодальными с разными значениями единиц измерения. Таким образом, для лучшей производительности нам нужно будет нормализовать их, прежде чем использовать простой метод логистической регрессии для этой проблемы классификации. Поскольку метки основаны на оценке, присвоенной вину, в наборе данных существует перекрытие классов между ними, и, таким образом, проблема классификации довольно сложна. (Один из способов улучшить прогнозирование для определения высокого и низкого качества - это разделить значения оценок на три группы: высокое, среднее и низкое качество, удалить набор данных среднего качества и превратить проблему в проблему двоичной классификации. Цель здесь состоит в том, чтобы показать, как кодирование тайлов может улучшить результаты, которые мы получаем от метода бакетизации.) Однако здесь мы будем использовать 10 классов в качестве меток и стремимся показать ценность тайлового кодирования по сравнению с бакетизацией для этого сложного случая. В качестве метрики мы используем классическую функцию потерь кросс-энтропии.

После разделения набора данных на 70% -30% для теста поездов мы провели разбивку по буквам и тайловое кодирование для каждой переменной функции отдельно и использовали 10 тилингов. Мы обучили логистическую регрессию с помощью AdagardOptimizer на TensorFlow, используя разработанный нами механизм Tile-Coding (код). Окончательный результат оценки (конечные точки на рисунке 6), полученный для всего набора тестовых данных, демонстрирует не только то, что мы получаем значительное улучшение с использованием тайлового кодирования (+ 10% без усилий по настройке параметров), но также мы наблюдаем, что скорость сходимости на ранней стадии итераций выглядит лучше. Мы думаем, что это могло быть связано с лучшей обобщающей способностью тайлового кодирования.

Реализация кода в TensorFlow:

The tile-coding now is open-sourced in the following link: https://github.com/criteo-research/tf-tile

Подтверждение:

Автор благодарит Суджу Раджана, Сатию (Кирти) Селварадж, Кристофа Ренаудена, Пиюша Наранга и Томаса Рикатте за их комментарии и обсуждения.

Использованная литература:

  1. Альбус Дж. С. 1975 Новый подход к управлению манипулятором: Модель артикуляционного контроллера мозжечка (CMAC). Trans. ASME, J. Dyn. Syst., Meas., Contr. 97: 220–227
  2. Саттон и Барто (2018), Введение в обучение с подкреплением. MIT Press.