用于矩阵分解使用指南的PyTorch嵌入L2正则化

时间:2019-12-02 23:11:09

标签: python pytorch matrix-factorization

这可能是一个数学/统计问题。我使用在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)

0 个答案:

没有答案