我使用其他库跑出了word2vec的结果后,希望能结合自己的模型做微调,这就必须要求能够将word2vec的那些词向量加入到我的模型中,并且是可训练的,作为一个没有摸清门道的初学者,我查找了大量的资料终于找到了答案。
在使用PyTorch的时候,常常会用到Embedding模型,这个模型的本质就是一个word2vec,可以理解为它的权重就是词向量,embedding的过程就是利用索引将词向量取出,因此,可以利用Embedding模型来将已有的word2vec加入并微调。
import gensim
import torch
import torch.nn as nn
word2vec = gensim.models.KeyedVectors.load_word2vec_format('word_vecs.txt', binary=False)
embedding = nn.Embedding.from_pretrained(torch.tensor(word2vec.vectors))
如果需要更新权重,下面提供两种方法:
- 第一种,加一行代码:
embedding.weight.requires_grad = True # 这样才能更新权重
- 第二种方法,利用
from_pretrained
函数的另一个参数freeze
:
embedding = nn.Embedding.from_pretrained(torch.tensor(word2vec.vectors), freeze=False)
这么做之后,embedding
就能够把你的输入转换为词向量啦,我们举个例子,假设现有batch_size = 2,seq_len = 3
的输入,比如:
[['hello', 'world', '<pad>'],
['hello', '<pad>', '<pad>']]
如果这些单词全部都在这个word2vec内出现过,则可以用这个word2vec的词典,将他们转换为数字id,比如hello这个单词就可以做如下操作拿到id:
hello_id = word2vec.vocab['hello'].index
如果把上面的输入全部用id表示,那么我们的输入可能会变成这样的:
[[1, 2, 0],
[1, 0, 0]]
上面的就是我们最后的input
啦,将他转换为tensor后传入embedding
,就能拿到词向量啦,embedded
的维度是[batch_size, seq_len, word_vec_dim]
input = torch.tensor(input)
embedded = embedding(input)
评论区