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

Вы создаете признак 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 выше.](https://developers.google.cn/static/machine-learning/crash-course/embeddings/images/food_images_one_hot_encodings.png?hl=ru)
Проблемы с разреженными представлениями данных
У представления данных в виде прямых кодов есть ряд недостатков:
- Количество весов. При большой длине входных векторов нейронной сети приходится работать с огромным числом весов. Если в прямом коде M элементов и на первом слое сети после входного находится N узлов, модели придется подобрать M x N весов для этого слоя.
- Количество элементов данных. Чем больше весов в модели, тем больше данных требуется для эффективного обучения.
- Объем вычислений. Чем больше весов, тем больше вычислений требуется для обучения модели. В какой-то момент у вас может просто не хватить аппаратных ресурсов.
- Объем памяти. Чем больше весов в модели, тем больше памяти требуется ускорителям, которые передают данные в модель и обучают ее. Вертикальное масштабирование в этой ситуации сопряжено со значительными сложностями.
- Трудности с поддержкой локального машинного обучения (ODML). Если вы планируете запускать модель машинного обучения на локальных устройствах, придется подумать, как сделать модель более компактной и сократить количество весов.
В этом модуле вы узнаете, как создавать эмбеддинги – низкоразмерные представления разреженных данных, которые позволяют обходить эти проблемы.