Представьте, что вы разрабатываете приложение с рекомендациями по питанию, в которое пользователи вводят свои любимые блюда, а приложение предлагает похожие блюда, которые им могут понравиться. Вы хотите разработать модель машинного обучения (ML), которая сможет предсказывать сходство продуктов питания, чтобы ваше приложение могло давать высококачественные рекомендации («Поскольку вы любите блины, мы рекомендуем блины»).
Чтобы обучить свою модель, вы собираете набор данных из 5000 популярных блюд, включая борщ , хот-дог , салат , пиццу и шаурму .
![Рисунок 1. Набор иллюстраций пяти продуктов питания. По часовой стрелке сверху слева: борщ, хот-дог, салат, пицца, шаурма.](https://developers.google.cn/static/machine-learning/crash-course/embeddings/images/food_images.png?authuser=0&hl=ru)
Вы создаете объект meal
, который содержит представление каждого блюда в наборе данных в горячем коде .
![Рисунок 2. Вверху: визуализация горячего кодирования борща. Вектор [1, 0, 0, 0, ..., 0] отображается над шестью прямоугольниками, каждый из которых выровнен слева направо по одному из векторных чисел. В коробках слева направо находятся следующие изображения: борщ, хот-дог, салат, пицца, [пустой], шаурма. В центре: визуализация кодировки one-hot для хот-дога. Вектор [0, 1, 0, 0, ..., 0] отображается над шестью прямоугольниками, каждый из которых выровнен слева направо по одному из векторных чисел. На коробках слева направо те же изображения, что и на визуализации борща выше. Внизу: визуализация кодировки one-hot для шаурмы. Вектор [0, 0, 0, 0, ..., 1] отображается над шестью прямоугольниками, каждый из которых выровнен слева направо по одному из векторных чисел. На коробках слева направо те же изображения, что и на визуализациях борща и хот-дога.](https://developers.google.cn/static/machine-learning/crash-course/embeddings/images/food_images_one_hot_encodings.png?authuser=0&hl=ru)
Подводные камни разреженных представлений данных
Просматривая эти горячие кодировки, вы замечаете две ключевые проблемы с таким представлением данных.
- Количество весов. Большие входные векторы означают огромное количество весов для нейронной сети . С M записями в вашей горячей кодировке и N узлами в первом слое сети после ввода модель должна обучить веса MxN для этого слоя. Большое количество весов вызывает дополнительные проблемы:
- Количество точек данных. Чем больше весов в вашей модели, тем больше данных вам нужно для эффективного обучения.
- Объем вычислений. Чем больше весов, тем больше вычислений требуется для обучения и использования модели. Превысить возможности вашего оборудования легко.
- Объем памяти. Чем больше весов в вашей модели, тем больше памяти требуется ускорителям, которые ее обучают и обслуживают. Эффективно масштабировать это очень сложно.
- Сложность поддержки машинного обучения на устройстве (ODML) . Если вы надеетесь запустить свою модель машинного обучения на локальных устройствах (а не обслуживать их), вам нужно будет сосредоточиться на уменьшении размеров вашей модели и уменьшении количества весов.
- Отсутствие значимых связей между векторами . Векторные значения в горячих кодировках продуктов питания не предоставляют никакой значимой информации о сходстве продуктов питания. Математически индекс 1 («хот-дог») ближе к индексу 2 («салат»), чем к индексу 4999 («шаурма»), хотя хот-дог больше похож на шаурму (оба содержат мясо и хлеб), чем на салат. .
В этом модуле вы узнаете, как создавать внедрения — низкоразмерные представления разреженных данных, которые решают обе эти проблемы.