Вложения: категориальные входные данные

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

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

Пример входных данных для нашей задачи с рекомендациями фильмов.

Рисунок 3. Данные для нашей задачи рекомендации фильмов.

Каждая строка матрицы на рис. 3 представляет собой пример записи истории просмотров фильмов пользователем и представлена ​​в виде разреженного тензора, поскольку каждый пользователь просматривает лишь небольшую часть всех возможных фильмов. Последняя строка соответствует разреженному тензору [1, 3, 999999] с использованием словарных индексов, показанных над значками фильмов.

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

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

Самый простой способ — определить гигантский входной слой с узлом для каждого слова в вашем словаре или, по крайней мере, с узлом для каждого слова, которое появляется в ваших данных. Если в ваших данных появляется 500 000 уникальных слов, вы можете представить слово с длиной вектора 500 000 и назначить каждое слово слоту в векторе.

Если вы назначите «лошадь» индексу 1247, то для передачи «лошади» в вашу сеть вы можете скопировать 1 в 1247-й входной узел и 0 во все остальные. Такое представление называется горячим кодированием , потому что только один индекс имеет ненулевое значение.

Как правило, ваш вектор может содержать количество слов в большем фрагменте текста. Это известно как представление «мешка слов». В векторе набора слов несколько из 500 000 узлов будут иметь ненулевое значение.

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

Размер сети

Огромные входные векторы означают сверхогромное количество весов для нейронной сети. Если в вашем словаре есть M слов и N узлов в первом слое сети над входом, у вас есть MxN весов для обучения для этого слоя. Большое количество весов вызывает дополнительные проблемы:

  • Количество данных . Чем больше весов в вашей модели, тем больше данных вам потребуется для эффективного обучения.

  • Объем вычислений . Чем больше веса, тем больше вычислений требуется для обучения и использования модели. Возможности вашего оборудования легко превзойти.

Отсутствие значимых отношений между векторами

Если вы подаете значения пикселей каналов RGB в классификатор изображений, имеет смысл говорить о «близких» значениях. Красновато-синий близок к чистому синему как семантически, так и с точки зрения геометрического расстояния между векторами. Но вектор с 1 в индексе 1247 для «лошади» не ближе к вектору с 1 в индексе 50 430 для «антилопы», чем к вектору с 1 в индексе 238 для «телевидения».

Решение: вложения

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