Вопрос или проблема
Я пытаюсь реализовать модель wide and deep от Google, и у меня есть вопрос о ее выходе.
Согласно уравнению (3) в статье:
$$ P(Y=1|X) = \sigma(w_{wide}^T[x,\phi(x)] + w_{deep}^T a^{(l_f)+b} $$
Должен ли $P(Y=1|X)$ быть скалярным? Я это ожидал, но когда я посмотрел на ноутбук на Kaggle, последний слой (упоминаемый как голова) выдает вектор размером, равным кросс-умножению признаков.
self.head = nn.Sequential(
nn.Linear(embed_dict_len + 256, embed_dict_len),
)
В моих обучающих данных (подмножество movielens 100k) 944 пользователя и 1683 элемента, что означает, что кросс-умножение даст матрицу с 1,5 миллиона значений. В этой части я мог бы просто использовать разреженную матрицу, но что насчет параметров модели?
Если $P(Y=1|X)$ — это вектор размером 1,5 миллиона, как в том ноутбуке, то $w_{wide}$ должен иметь размер $1.5M^2$ = 2 триллиона значений или 10 ТБ! Только в широком компоненте!!
С другой стороны, если $P(Y=1|X)$ — это скаляр, как я должен делать рекомендации? Мне нужно будет выполнять передачу forward
для каждой возможной комбинации пользователь-элемент?
Возможно, размер выхода — это количество фильмов, и тогда мне просто нужно выполнять forward
для каждого пользователя.
- Должен ли P(Y=1|X) быть скалярным?
- …выдает вектор размером, равным кросс-умножению признаков.
Нет. Поскольку цель, указанная в ноутбуке, заключается в том, чтобы предсказать, какой фильм пользователь посмотрит следующим, выходной вектор определяется числом уникальных фильмов items['movie id'].nunique() + 1
(1683). Это сравнивается с вектором, представляющим, какой фильм был на самом деле просмотрен следующим, при этом потеря рассчитывается с помощью CrossEntropyLoss.
- Я мог бы просто использовать разреженную матрицу, но что насчет параметров модели?
Согласно ответам на вопрос, на который вы сослались:
Действительно, у вас будет большая и очень разреженная матрица.
Поскольку ваш набор данных является смешанным между плотными признаками (непрерывные признаки) и разреженными (кросс), вы можете разделить свою сеть на две: разреженные будут напрямую отправлены к вашему выходу и, таким образом, обрабатываться так, как они были бы в линейной модели, в то время как ваши плотные признаки будут проходить через несколько скрытых слоев перед выходом.
Именно поэтому модель имеет широкую (разреженную) и глубокую (плотную) части.
Нейронные сети хорошо работают с плотными, коррелированными признаками, в то время как линейные модели лучше работают с разреженными и слабо коррелированными признаками.
Печать фактических размеров параметров “головы”:
Это всего лишь ~3 миллиона в его одном линейном слое.
Надеюсь, это поможет прояснить структуру модели.
Ответ или решение
Понимание вывода модели Wide and Deep от Google
Вопрос, который вы подняли, действительно важен для правильной интерпретации вывода модели Wide and Deep. Позвольте мне прояснить несколько ключевых моментов относительно вашего понимания уравнения (3) из статьи.
1. Размерность (P(Y=1|X))
Согласно уравнению, да, (P(Y=1|X)) в идеале должно быть скалярным значением, которое представляет собой вероятность (значения от 0 до 1) того, что событие (Y=1) произойдет при заданном входе (X). Однако в случае рекомендационных систем, как та, что вы описываете, выход сети может быть вектором, размер которого соответствует количеству уникальных элементов (например, фильмов).
В данном контексте, если ваша модель предназначена для предсказания, какой фильм пользователь может захотеть посмотреть, выходной вектор будет иметь размер, равный количеству уникальных фильмов в вашем датасете (в вашем случае это 1683 фильма). На каждой итерации, выходной вектор будет отвечать на запрос о вероятностях для каждого отдельных фильма, а не единственному значению.
2. Параметры модели и разреженные матрицы
Как вы правильно заметили, если говорить о разреженной матрице, которая образуется при пересечении количества пользователей и фильмов, то это действительно может привести к огромным размерам параметров. Однако, как поясняется в материале, который вы изучали, использование разреженных матриц и их правильная обработка – это ключевой аспект работы с такими большими наборами данных.
Параметры широкого блока модели (разреженные) будут считаться отдельно от параметров глубокого блока (плотные). Таким образом, разреженные данные отправляются прямо к выходу, где они обрабатываются как в линейной модели, в то время как плотные данные проходят через несколько скрытых слоев перед тем, как попасть на выход.
3. Как делать рекомендации
Ваше предположение о том, что необходимо провести прямой проход для каждой комбинации пользователь-фильм, в общем случае верно, но его можно оптимизировать. На практике вам не нужно всегда делать проход для каждого пользователя, чтобы узнать, какие фильмы могут понравиться. Использование векторизации и встраивания (embedding) позволяет значительно уменьшить время вычислений.
Во время тренировки вы можете использовать батчи данных, обрабатывая не все возможные комбинации одновременно, а только подмножество. Во время предсказания это также можно комбинировать с методами, такими как стратегическое сканирование (scanning) выборки, чтобы упростить процесс получения рекомендаций.
Выводы
Таким образом, выходная величина (P(Y=1|X)) в вашем случае действительно представляет собой вектор, который дает вероятности для всех фильмов, а не одно скалярное значение. Обработка параметров модели в случае разреженной матрицы требует более продуманного подхода, что делает важным разделение на широкую и глубокую части модели. Использование подходов, таких как батчи и встраивания, позволяет эффективно управлять вычислительными затратами и объёмами данных.
Надеюсь, это проясняет ваше понимание структуры и назначения модели. Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать!