1. 程式人生 > >Pytorch求索(3):使用訓練好的詞向量

Pytorch求索(3):使用訓練好的詞向量

nn.Embedding

Pytorch自帶Embedding模組,可以方便使用

self.embed = nn.Embedding(vocab_size, embedding_dim)

那麼,如何使用已經訓練好的詞向量呢?
詞向量其實是模型的embedding層的權重,所以,如下方法便可以實現:

self.embed = nn.Embedding(vocab_size, embedding_dim)
self.embed.weight.data.copy_(torch.from_numpy(pretrained_embeddings))

同時,使用已經訓練好的詞向量之後,我們又有如下選擇,即保持詞向量不更新(固定詞向量),或者基於載入的詞向量進行更新權重,很多人往往會忘記這一點。

不需要改變,因此就涉及到固定子層引數不更新的技巧。這個方法有很多,常用的是requires_grad和volatile,requires_grad = False等同於volatile = True。

self.embed = nn.Embedding(V, D)
self.embed.weight.data.copy_(torch.from_numpy(pretrained_embeddings))
self.embed.weight.requires_grad = False

因此我們可以設定embeding層的引數的parameter的requires_grad為False,這樣就不會計算其梯度了,這樣還會提升模型訓練的速度,因為預訓練的詞向量矩陣維度很大,如果每次反向傳播都計算它的梯度會極大地影響訓練的速度。此外,設定優化器的時候,第一個引數就不可以是model.parameter(),因為embeding層的梯度是沒有的,也就優化不了,因此要將它排除。程式碼如下:

optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=lr, weight_decay=opt.weight_decay)

程式碼使用了過濾器將requires_grad為False的過濾掉(預設為True),這樣就可以保證程式碼的正確性。