Как сделать так, чтобы часть матрицы встраивания была обучаемой, а оставшаяся часть - не обучаемой в pytorch? - PullRequest
1 голос
/ 01 февраля 2020

Коды в Pytorch.

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

Моя src_weight_matrix - это предварительно встроенная матрица внедрения измерения: [vocab_size + 4 special_tokens] X [emb_dim] = [49996 + 4] X [300]

первые 49996 строки для слова в словаре, и последние 4 слова в словаре являются специальным токеном, то есть [UNK], [PAD], [START], [STOP]. Я случайно инициализировал векторы вложения для этих 4 слов.

Поэтому я хочу обучить эти 4 веса вложения и позволить другим вложениям иметь свои собственные веса.

Код выглядит следующим образом, где все веса встраивания заморожены, кроме последних 4, что является правильным или нет, я не знаю.

class Encoder(nn.Module):
    def __init__(self, src_weights_matrix):
        super(Encoder, self).__init__()
        self.embedding = nn.Embedding(config.vocab_size, config.emb_dim)
        self.embedding.load_state_dict({'weight': src_weights_matrix})
        self.embedding.weight.requires_grad = False
        self.embedding.weight[-4:, :].requires_grad = True
        init_wt_normal(self.embedding.weight)
        self.lstm = nn.LSTM(config.emb_dim, config.hidden_dim, num_layers=1, batch_first=True, bidirectional=True)
        init_lstm_wt(self.lstm)
        self.W_h = nn.Linear(config.hidden_dim * 2, config.hidden_dim * 2, bias=False)

Любой вывод очень ценится. Заранее спасибо

...