Почему неиспользуемый вектор встраивания изменился после обратного?

#pytorch #embedding

Вопрос:

Я частично настраиваю матрицу встраивания (только для определенного индекса). Но на обратной фазе изменяются другие вложения, которые, как ожидается, не будут изменены.

Вот пример:

 import torch
from torch import nn

embeds = nn.Embedding(10, 3)
optim = torch.optim.Adam(params=embeds.parameters(), lr=0.001, weight_decay=1e-6)
indexes = torch.tensor([1,2,3])  # expected to finetune
bce_loss = nn.BCELoss()

optim.zero_grad()
loss = bce_loss(embeds(indexes).sum(dim=-1), torch.zeros(3))
loss.backward()
optim.step()
 

Я хочу только настроить 1-е, 2-е, 3-е встраивания, но после обратного вся матрица встраивания изменяется. Почему? И как решить эту проблему? ТХ!

Ответ №1:

Изменение матрицы встраивания после optim.step() этого не полностью связано с определенной вами потерей (т. Е. BCELoss). Вы упускаете из виду другую часть потерь, которая неявно определяется из-за weight_decay параметра в вашем оптимизаторе. Когда вы предоставляете ненулевое снижение веса, оно добавляет вторую составляющую к потере, которая превышает все параметры модели. Просто выключи это

 optim = torch.optim.Adam(..., weight_decay=0.)
 

и вы увидите ожидаемый результат.

Комментарии:

1. Мило! Это работает!

2. Если это помогло, пожалуйста, подумайте о том, чтобы отметить его как принятый ответ