I was working on a recommendation algorithm and I need user_embeddings
and item_embeddings
to calculate the score. In the algorithm, user_encoder
aims to produce user_embeddings
and item_encoder
for item_embeddings.
The item_embeddings
should be updated in every epoch and user_embeddings
should be updated in every batch in an epoch. I was wondering how to complete? The part of code I want is as following:
user_model = UserModel()
item_model = ItemModel()
criterion = nn.BCEWithLogitsLoss().to(device)
optimizer = optim.Adam(list(user_model.parameters()) + list(item_model.parameters()), lr=LEARNING_RATE)
for epoch in range(num_epochs):
user_model.train()
item_model.train()
item_embeddings = item_model(input)
# the size of item_embeddings = [ITEMS NUM, item_embed_dim]
for idx, batch in enumerate(train_dataloader):
data = batch["data"].to(device)
label = batch["label"].to(device)
optimizer.zero_grad()
user_embeddings = user_model(data, item_embeddings)
# the size of user_embeddings = [batch size, item_embed_dim]
score = torch.matmul(user_embeddings, item_embeddings.T)
loss = criterion(score, label)
loss.backward()
optimizer.step()
I met RuntimeError: Trying to backward through the graph a second time, but the saved intermediate results have already been freed. Specify retain_graph=True when calling .backward() or autograd.grad() the first time.
Any ideas to fix it? Thanks in advance.