Pytorch求索(3):使用训练好的词向量

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wen_fei/article/details/83117324

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),这样就可以保证代码的正确性。

猜你喜欢

转载自blog.csdn.net/wen_fei/article/details/83117324