python - 为什么矩阵分解模型不学习
问题描述
我有这个带有 2 个嵌入的模型,其中包含用户和项目,用户、项目的 2 个权重,我只是将嵌入(用户)乘以嵌入(项目)以获得损失,我使用 MSE
prox = nn.Threshold(0,0)
def l2_regularize(array):
loss = torch.sum(array ** 2.0)
return loss
htanh = torch.nn.Hardtanh(min_val=1, max_val=5)
class MF(torch.nn.Module):
def __init__(self, n_users, n_items, n_factors=8, c_vector=1e-6, c_bias=1e-6):
super().__init__()
self.n_users = n_users
self.n_items = n_items
self.c_bias = c_bias
self.c_vector = c_vector
self.user_factors = torch.nn.Embedding(n_users, n_factors, sparse=True) #u
self.item_factors = torch.nn.Embedding(n_items, n_factors, sparse=True) #q
self.bias_user = nn.Embedding(n_users, 1)
self.bias_item = nn.Embedding(n_items, 1)
self.bias = nn.Parameter(torch.ones(1))
def __call__(self,df):
user_id = df[:, 0]
item_id = df[:, 1]
vector_user = self.user_factors(user_id)
vector_item = self.item_factors(item_id)
bias_user = self.bias_user(user_id).squeeze()
bias_item = self.bias_item(item_id).squeeze()
biases = (self.bias + bias_user + bias_item)
ui_interaction = torch.sum(vector_user * vector_item, dim=-1)
prediction = ui_interaction + biases
return prox(prediction.squeeze()) #htanh(prediction.squeeze())?
def loss(self, prediction, target):
loss_mse = F.mse_loss(prediction, target.squeeze())
prior_bias_user = l2_regularize(self.bias_user.weight) * self.c_bias
prior_bias_item = l2_regularize(self.bias_item.weight) * self.c_bias
prior_user = l2_regularize(self.user_factors.weight) * self.c_vector
prior_item = l2_regularize(self.item_factors.weight) * self.c_vector
total = loss_mse + prior_user + prior_item + prior_bias_user + prior_bias_item
return total
而这个火车代码
model = MF(n_users, n_items)
optimizer = torch.optim.SGD(model.parameters(),lr=1e-2)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
hist_loss=[]
epochs= 1
model.train()
for epoch in range(epochs):
for batch in tqdm(train_dataloader):
for uid,mid,target in batch:
optimizer.zero_grad()
rating = torch.FloatTensor([target]).to(device)
uid = torch.LongTensor([int(uid)]).to(device)
mid = torch.LongTensor([int(mid)]).to(device)
model = model.to(device)
prediction = model(torch.tensor([[uid,mid]]).to(device))
loss = model.loss(prediction,rating)
loss.backward()
optimizer.step()
hist_loss.append(loss)
我使用 MovieLens 数据集,但模型不学习。在验证集上,当目标 = {1,5} 时,我可以看到预测 20。我的代码有什么问题?
解决方案
推荐阅读
- mysql - 是否有一种获取最后一行数据并将其递增/递减 1 的 SQL 方法?
- angular - 从 cmd 调用 Angular 语言服务
- python - 有没有办法在 Python 中识别 RNDIS 连接/适配器?然后配置那个适配器?
- c++ - 在结构中添加变量结构作为有效负载,以便在 C++ 中通过 udp 发送
- node.js - jest.mock 找不到模块
- java - 如何使用 selenium webdriver 单击角度元素?
- python - 在子查询中使用查询集时,Django 只返回 id 字段而不是整个对象
- javascript - 无法下载带有过滤器的画布图像
- reactjs - React-Table:在父组件中获取 selectedRowIds
- javascript - 在 VueJS 中动态更新的可编辑下拉列表