Я хотел бы реализовать модель факторизации с учетом поля (FFM) векторизованным способом. В FFM прогноз делается следующим уравнением
где w - вложения, которые зависят от объекта и поля другого объекта. Для получения дополнительной информации см. Уравнение (4)
в FFM .
Для этого я определил следующий параметр:
import torch
W = torch.nn.Parameter(torch.Tensor(n_features, n_fields, n_factors), requires_grad=True)
Теперь, учитывая вход x
размера (batch_size, n_features)
, я хочу иметь возможность вычислить предыдущее уравнение. Вот моя текущая (не векторизованная) реализация:
total_inter = torch.zeros(x.shape[0])
for i in range(n_features):
for j in range(i + 1, n_features):
temp1 = torch.mm(
x[:, i].unsqueeze(1),
W[i, feature2field[j], :].unsqueeze(0))
temp2 = torch.mm(
x[:, j].unsqueeze(1),
W[j, feature2field[i], :].unsqueeze(0))
total_inter += torch.sum(temp1 * temp2, dim=1)
Неудивительно, что эта реализация ужасно медленная, поскольку n_features
может легко достигать 1000! Однако обратите внимание, что большинство записей x
равно 0. Все входные данные приветствуются!
Изменить:
Если это может помочь каким-либо образом, вот некоторые реализации этой модели в PyTorch:
К сожалению, я не могу понять, как именно они это сделали.