使用pytorch获取bert词向量

本文主要为如何使用pytorch来获取bert词向量。

首先安装pytorch-pretrained-bert包:

pip install pytorch-pretrained-bert

然后加载预训练模型

from pytorch_pretrained_bert import BertTokenizer, BertModel, BertForMaskedLM
# Load pretrained model/tokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

如果是第一次使用,执行上述代码后程序会开始自动下载相应的模型,但是会耗费大量时间,因此最好事先下载好相应的模型,然后指定目录。

tokenizer = BertTokenizer.from_pretrained('data/cased_L-12_H-768_A-12') #改为自己存放模型的目录
model = BertModel.from_pretrained('data/cased_L-12_H-768_A-12')

如何下载模型:

Bert模型下载地址如下,根据自己的需求下载相应模型。

https://github.com/google-research/bert#pre-trained-models

该链接下载后的模型是支持tensorflow的而不是支持pytorch的,因此需要将其进行转化,生成pytorch_model.bin文件。

(也可以直接照pytorch_model.bin的链接下载,但是下载起来太慢了而且可能打不开,所有还是建议用上面的链接然后再转化)

详情可参考https://blog.csdn.net/weixin_41287060/article/details/105080705

转换完成之后,存放模型的目录下应有以下三个文件:

使用pytorch获取bert词向量_第1张图片

获取隐藏层向量

text = " the man went to the store "
tokenized_text = tokenizer.tokenize(text) #token初始化
indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text) #获取词汇表索引
tokens_tensor = torch.tensor([indexed_tokens]) #将输入转化为torch的tensor
with torch.no_grad(): #禁用梯度计算 因为只是前向传播获取隐藏层状态,所以不需要计算梯度
    last_hidden_states = model(tokens_tensor)[0]

隐藏状态的四个维度(参考 Bert词向量指南):

使用pytorch获取bert词向量_第2张图片

从输出可知,模型为每个单词输出了12个隐藏层向量,那么该如何利用这些隐藏层向量获取最终的词向量?

Bert作者利用不同的向量组合作为输入特征进行NER实验来测试这一点。

使用pytorch获取bert词向量_第3张图片

以下为通过最后四层的连接和求和来创建单词向量的示例

token_embeddings=[]
for token_i in range(len(tokenized_text)):
    hidden_layers=[]
    for layer_i in range(len(last_hidden_states)):
        vec=last_hidden_states[layer_i][0][token_i] #如果输入是单句不分块中间是0,因为只有一个维度,如果分块还要再遍历一次
        hidden_layers.append(vec)
    token_embeddings.append(hidden_layers)
concatenated_last_4_layers = [torch.cat((layer[-1], layer[-2], layer[-3], layer[-4]), 0) for layer in token_embeddings] #连接最后四层 [number_of_tokens, 3072]	
summed_last_4_layers = [torch.sum(torch.stack(layer)[-4:], 0) for layer in token_embeddings] #对最后四层求和 [number_of_tokens, 768]

 pytorch获取bert词向量的一些相关文章:

  1. https://github.com/huggingface/transformers
  2. https://blog.csdn.net/u011984148/article/details/99921480  (这个博主写得非常明白)

 

你可能感兴趣的:(python,深度学习,人工智能)