Встраивания

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

Для обучения модели вы подбираете набор данных из 5000 популярных блюд, включая borscht, hot dog, salad, pizza и shawarma.

Рисунок 1. Иллюстрации пяти блюд. Справа налево, начиная с верхнего левого угла: borscht, hot dog, salad, pizza, shawarma.
Рисунок 1. Некоторые блюда, включенные в набор данных.

Вы создаете признак meal с прямым кодированием каждого блюда в наборе данных. Под кодированием понимается выбор исходного числового представления данных, на которых обучается модель.

Рисунок 2. Наверху: визуализация прямого кода для блюда borscht.
       Над шестью клетками расположен вектор [1, 0, 0, 0, ..., 0]. Каждое число вектора находится над своей клеткой. В клетках слева направо изображены следующие блюда: borscht, hot dog, salad, pizza, [пусто], shawarma. Посередине: визуализация прямого кода для блюда hot dog.
       Над шестью клетками расположен вектор [0, 1, 0, 0, ..., 0]. Каждое число вектора находится над своей клеткой. В клетках находятся те же изображения блюд и в том же порядке, что и на картинке выше. Внизу: визуализация прямого кода для блюда shawarma. Над шестью клетками расположен вектор [0, 0, 0, 0, ..., 1]. Каждое число вектора находится над своей клеткой. В клетках находятся те же изображения блюд и в том же порядке, что и на картинках для borscht и hot dog выше.
Рисунок 2. Прямые коды для блюд borscht, hot dog и shawarma. Каждый вектор с прямым кодом содержит 5000 чисел: одно число для каждого блюда в наборе данных. Многоточие на схеме означает остальные 4995 элементов, которые не показаны.

Проблемы с разреженными представлениями данных

У представления данных в виде прямых кодов есть ряд недостатков:

  • Количество весов. При большой длине входных векторов нейронной сети приходится работать с огромным числом весов. Если в прямом коде M элементов и на первом слое сети после входного находится N узлов, модели придется подобрать M x N весов для этого слоя.
  • Количество элементов данных. Чем больше весов в модели, тем больше данных требуется для эффективного обучения.
  • Объем вычислений. Чем больше весов, тем больше вычислений требуется для обучения модели. В какой-то момент у вас может просто не хватить аппаратных ресурсов.
  • Объем памяти. Чем больше весов в модели, тем больше памяти требуется ускорителям, которые передают данные в модель и обучают ее. Вертикальное масштабирование в этой ситуации сопряжено со значительными сложностями.
  • Трудности с поддержкой локального машинного обучения (ODML). Если вы планируете запускать модель машинного обучения на локальных устройствах, придется подумать, как сделать модель более компактной и сократить количество весов.

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