一文学会Pytorch版本BERT使用

一、前言:

coder们最常用的Pytorch版本的BERT应该就是这一份了吧 https://github.com/huggingface/pytorch-pretrained-BERT 

这份是刚出BERT的时候出的,暂且叫它旧版

这是博主在学习使用旧版的时候粗略记过的一些笔记:https://blog.csdn.net/ccbrid/article/details/88732857

随着BERT的出现,更多的预训练模型(BERT, GPT-2, RoBERTa, XLM, DistilBert, XLNet, CTRL...)也如雨后春笋般涌出,Hugging Face的这款BERT工具也在不管的更新迭代

本文是针对于新版的学习👇

 

二、BERT相关网址

BERT论文:https://arxiv.org/abs/1810.04805

Google_BERT代码(tensorflow):https://github.com/google-research/bert 

Pytorch版本的BERT:https://github.com/huggingface/transformers(本文记录该工具的使用)

该工具使用文档:https://huggingface.co/transformers/

BERT部分使用文档:https://huggingface.co/transformers/model_doc/bert.html#bertmodel

优化器部分使用文档:https://huggingface.co/transformers/main_classes/optimizer_schedules.html

快速浏览版:https://github.com/huggingface/transformers#quick-tour

 

三、安装步骤

1. 要求Python 3.5+, PyTorch 1.0.0+ 或 TensorFlow 2.0.0-rc1

2. 推荐使用虚拟环境 例如:

conda create -n transformers python=3.6

source activate transformers

(conda env list 查看已有虚拟环境)

3. 首先 you need to install one of, or both, TensorFlow 2.0 and PyTorch. (本文PyTorch)

安装PyTorch可访问网址:https://pytorch.org/get-started/locally/#start-locally

在该网址上选择对应的安装环境,可以直接得到如下命令:

conda install pytorch torchvision cudatoolkit=10.1 -c pytorch

由于博主本机cuda不支持1.4的torch,所以重新安装

pip install torch==1.2.0 torchvision==0.4.0 -f https://download.pytorch.org/whl/torch_stable.html

4. pip install transformers

5. (此步可省略)下到本地方便查看源码 git clone https://github.com/huggingface/transformers.git

 

 

四、使用方法

 

1. 必备import

from transformers import BertTokenizer, BertModel, BertForMaskedLM

2. 数据的处理
我们知道,在BERT的输入中,cls是一个,sep是大于等于一个。'[CLS]'必须出现在样本段落的开头,一个段落可以有一句话也可以有多句话,每句话的结尾必须是'[SEP]'。
例如:['[CLS]', 'this', 'is', 'blue', '[SEP]', 'that', 'is', 'red', '[SEP]']

我们需要对输入BERT的数据进行处理
例如:

words = [self.CLS_TOKEN] + words + [self.SEP_TOKEN]

3. Tokenizer
调用tokenizer,使用tokenizer分割输入,将tokens转为ids。如下:

self.bert_tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
words = self.bert_tokenizer.tokenize(''.join(words))
feature = self.bert_tokenizer.convert_tokens_to_ids(sent + [self.PAD_TOKEN for _ in range(max_sent_len - len(sent))])

如果觉得BERT给的token不够用,或希望在BERT给的token中加入自己的token,加入以下代码即可:
例如,想要加入大写字母:

self.bert_tokenizer.add_tokens([chr(i) for i in range(ord("A"), ord("Z") + 1)])
args.len_token = len(self.bert_tokenizer)


此处使用了len_token记录self.bert_tokenizer新的token大小,因为要对模型进行更新。

4. 模型使用
调用BertModel,因为改变了tokenizer所以对模型的token参数进行更新,然后就可以正常使用BERT-Model啦!

self.BertModel = BertModel.from_pretrained('bert-base-chinese')
# 加入了A-Z,重新resize一下大小
self.BertModel.resize_token_embeddings(self.args.len_token) 
outputs = self.BertModel(input_ids=ii, token_type_ids=tti, attention_mask=am)

注:
5. 
本文使用了预训练模型bert-base-chinese做例子,其余的预训练模型具体可参考:https://github.com/google-research/bert

6. 
若想对Bert进行fine-tuning,如果存在out-of-memory的问题,可能会用到GPU并行:
self.BertModel = nn.DataParallel(self.BertModel, device_ids=args.bert_gpu_ids, output_device=torch.cuda.current_device())

GPU并行的其他注意事项小可爱们可以移步这里:Pytorch | 多GPU并行 DataParallel

公众号:NLP笔记屋

投稿、交流&合作 欢迎扫码进群

记得备注 “昵称-学校(公司)”呦~

  • 13
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PyTorch使用BERT(Bidirectional Encoder Representations from Transformers)是一种自然语言处理(NLP)模型,它基于Transformer架构,并且在预训练阶段使用了大量的无标签文本数据。下面是使用PyTorch实现BERT的一般步骤: 1. 安装PyTorch和Transformers库:首先,你需要安装PyTorch和Transformers库。可以通过pip命令来安装它们: ``` pip install torch pip install transformers ``` 2. 加载预训练的BERT模型:使用Transformers库中的`BertModel`类来加载预训练的BERT模型。你可以选择不同的预训练模型,如BERT-base或BERT-large。加载模型的代码如下: ```python from transformers import BertModel model = BertModel.from_pretrained('bert-base-uncased') ``` 3. 准备输入数据:BERT模型接受输入数据的格式是tokenized的文本序列。你需要将文本转换为对应的token,并添加特殊的标记,如[CLS]和[SEP]。可以使用Transformers库中的`BertTokenizer`类来完成这个任务: ```python from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') text = "Hello, how are you?" tokens = tokenizer.tokenize(text) input_ids = tokenizer.convert_tokens_to_ids(tokens) ``` 4. 输入数据编码:将输入数据编码为模型可以接受的形式。BERT模型需要输入的是token的索引序列,以及每个token的attention mask和segment mask。可以使用Transformers库中的`BertTokenizer`类的`encode_plus`方法来完成编码: ```python encoding = tokenizer.encode_plus( text, add_special_tokens=True, max_length=512, padding='max_length', truncation=True, return_attention_mask=True, return_token_type_ids=True, return_tensors='pt' ) input_ids = encoding['input_ids'] attention_mask = encoding['attention_mask'] token_type_ids = encoding['token_type_ids'] ``` 5. 使用BERT模型进行预测:将编码后的输入数据传递给BERT模型,即可进行预测。可以使用PyTorch的`torch.no_grad()`上下文管理器来关闭梯度计算,以提高推理速度: ```python with torch.no_grad(): outputs = model(input_ids, attention_mask=attention_mask, token_type_ids=token_type_ids) # 获取模型输出 last_hidden_state = outputs.last_hidden_state ``` 以上是使用PyTorch实现BERT的一般步骤。你可以根据具体的任务和需求对模型进行微调或进行其他操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值