侧边栏壁纸
  • 累计撰写 59 篇文章
  • 累计创建 34 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录

如何将已有的word2vec作为预训练模型?

生榆
2021-03-01 / 0 评论 / 0 点赞 / 882 阅读 / 2621 字
温馨提示:
本文最后更新于 2023-07-19,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

我使用其他库跑出了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)
0

评论区