Категориальные данные относятся к входным функциям, которые представляют один или несколько дискретных элементов из конечного набора вариантов. Например, это может быть набор просмотренных пользователем фильмов, набор слов в документе или род занятий человека.
Категориальные данные наиболее эффективно представляются с помощью разреженных тензоров , которые представляют собой тензоры с очень небольшим количеством ненулевых элементов. Например, если мы создаем модель рекомендации фильмов, мы можем присвоить уникальный идентификатор каждому возможному фильму, а затем представить каждого пользователя разреженным тензором просмотренных фильмов, как показано на рис. 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 для «телевидения».
Решение: вложения
Решением этих проблем является использование вложений , которые переводят большие разреженные векторы в пространство меньшей размерности, сохраняющее семантические отношения. Мы рассмотрим вложения интуитивно, концептуально и программно в следующих разделах этого модуля.