目前NLP最前沿的研究领域基本上已经被大型语言模型+迁移学习这一范式所垄断了。2017年6月,Google研究人员在Attention is all you need中提出了Transformer编码解码结构, 这一结构也成为了后续一系列工作的基石。2018年10月,基于Transformer,Google的研究人员发布了“全面超越人类”的BERT,一种融合了双向上下文信息预训练语言模型,该模型当时一举打破了11项纪录。从此之后,BERT的继任者们百花齐放,不断刷新各leaderboard最高成绩。现在,这些研究被称为BERTology,不完全的名单包括:Transformer-XL, XLNet, Albert, RoBERTa, DistilBERT, CTRL,XLM-R…
所以现在碰到NLP问题,几乎就是无脑BERT了,但是直接基于原始的BERT去进行开发对于大多数人来说都很麻烦。现在介绍一个开源库huggingface/transformers,在它的基础上去做开发就会轻松很多。
Transformers
Transformers提供了数千种经过预训练的模型,可以对100多种语言的文本执行任务,例如文本分类,信息提取,问题回答,文本摘要,翻译,文本生成等。其目的是使BERT系列的算法易于所有人使用。
Transformers提供了API,可在给定的文本上快速下载和使用那些经过预训练的模型,在自己的数据集上对其进行微调,然后在我们的模型中心上与社区共享。同时,每个定义架构的python模块都可以独立使用,并可以进行修改以进行快速的研究实验。
Transformers得到了两个最受欢迎的深度学习库PyTorch和TensorFlow的支持,它们之间具有无缝集成,允许您使用一个模型训练模型,然后加载模型以进行推理。
Transformers基础操作
安装
pip install transformers
预定义任务
transformers本身内置很多模块可以轻松实现各种预定义好的NLP任务,比如直接用预训练好的模型执行相关任务
情感分析
from transformers import pipeline
# Allocate a pipeline for sentiment-analysis
classifier = pipeline('sentiment-analysis')
classifier('We are very happy to include pipeline into the transformers repository.')
[{
'label': 'POSITIVE', 'score': 0.9978193640708923}]
问题回答
from transformers import pipeline
# Allocate a pipeline for question-answering
question_answerer = pipeline('question-answering')
question_answerer({
... 'question': 'What is the name of the repository ?',
... 'context': 'Pipeline have been included in the huggingface/transformers repository'
... })
{
'score': 0.5135612454720828, 'start': 35, 'end': 59, 'answer': 'huggingface/transformers'}
embedding获取
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")>>> model = AutoModel.from_pretrained("bert-base-uncased")
inputs = tokenizer("Hello world!", return_tensors="pt")>>> outputs = model(**inputs)
同时Transformers内置了很多标准的NLP任务,比如文本分类
from transformers import BertForSequenceClassification
from transformers import AdamW
from transformers import BertTokenizer
from torch.nn import functional as F
# 定义模型
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')
model.train()
# finetune参数
no_decay = ['bias', 'LayerNorm.weight']
optimizer_grouped_parameters = [
{
'params': [p for