这可能是一个数学/统计问题。我使用在Pytorch中实现的基于NN的矩阵分解方法训练了项目推荐系统。
我的第一次尝试不受限制,并且在2000个时期(0.0017)之后收到的错误率非常低
第二次尝试,在2000个时期后导致17.59的错误。这是令人惊讶的,因为在前50个时期减少到〜3之后,它又开始回升。正规化是我在两次训练尝试之间所做的唯一更改。
我知道对于大多数有监督的学习任务,例如线性回归,正则化可能是个好主意,因为它可以限制/阻止过度拟合,并且有可能去除非贡献变量,例如LASSO回归(赋值为0坡度。)
但是在推荐系统中,我不确定是否需要进行正则化,尤其是以准确性为代价的情况下。我使用weight_decay
https://pytorch.org/docs/stable/optim.html来实现L2正则化。
我正在尝试将用户和电影嵌入相同的更高维度的空间,因此嵌入的质量至关重要。而在逻辑回归等任务中,泛化性更为重要。因此,我倾向于放弃常规化尝试。
您有什么建议? (但是,下面提供的代码不一定要解决这个问题。)
import torch.nn as nn
import torch.nn.functional as F
import random
class MatrixFactorization(torch.nn.Module):
def __init__(self, n_movies=len(movie_ids), n_users=len(user_ids), n_factors=100):
super().__init__()
self.user_latent = nn.Parameter(torch.rand(n_users,n_factors))
self.movie_latent = nn.Parameter(torch.rand(n_factors, n_movies))
def forward(self):
return torch.mm(self.user_latent,self.movie_latent)
model = MatrixFactorization()
loss_fn = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=0.01)
losses = []
epochs = 2000
for epoch in range(epochs):
loss = 0
prediction = model.forward()
loss += loss_fn(prediction, r_tensor)
losses.append(loss)
# Reset the gradients to 0
optimizer.zero_grad()
# backpropagate
loss.backward()
# update weights
optimizer.step()
if epoch % 50 == 0:
print(loss)