自然语言处理python

BERT使用手册

2021-10-22  本文已影响0人  晓柒NLP与药物设计

transformers是huggingface提供的预训练模型库,可以轻松调用API来得到你的词向量。transformers的前身有pytorch-pretrained-bert,pytorch-transformers,原理基本都一致。本文以bert为例,主要介绍如何调用transformers库以及下游任务的使用方法。

1. transformers相关配置

2. 整理架构

3. 参数详解

3.1 配置 Bert 模型 transformers.PretrainedConfig

3.2 加载 Bert 模型 transformers.PreTrainedModel

from transformers import BertConfig, BertModel
# 从huggingface.co 下载模型和配置并缓存。
model = BertModel.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('./test/saved_model/')
# 在加载期间更新配置
model = BertModel.from_pretrained('bert-base-uncased', output_attentions=True)
assert model.config.output_attentions == True
config = BertConfig.from_json_file('./tf_model/my_tf_model_config.json')
model = BertModel.from_pretrained('./tf_model/my_tf_checkpoint.ckpt.index', from_tf=True, config=config)
# Loading from a Flax checkpoint file instead of a PyTorch model (slower)
model = BertModel.from_pretrained('bert-base-uncased', from_flax=True)

3.3 优化器 Optimization

3.3.1transformers.AdamW
3.3.2 transformers.Adafactor
3.3.3transformers.AdamWeightDecay(Tensorflow2)
3.3.4 Examples:
from transformers.optimization import Adafactor, AdafactorSchedule
optimizer = Adafactor(model.parameters(), scale_parameter=True, relative_step=True, warmup_init=True, lr=None)
lr_scheduler = AdafactorSchedule(optimizer)
***training step***
    optimizer.step()
    scheduler.step()

3.4 加载分词模型 transformers.PreTrainedTokenizer

3.5 BERT的应用微调

4.1 模型应用案例

BertForSequenceClassification(文本分类)

本文将在这一节重点介绍Bert的全系使用方法,包括工具引入、数据处理、计算资源选择、模型训练与测试使用。由于Bert不同任务存在重叠性,后续讲不再赘述重合部分,而是专注于网络结构。

BertForSequenceClassification(文本分类 Tensorflow2)

Tensorflow2上应用预训练模型进行文本分类的一个简单例子。

BertForTokenClassification(token分类)

以NER任务为例,命名实体识别任务是NLP中的一个基础任务。主要是从一句话中识别出命名实体,下为Bert+CRF的模型结构,训练过程与数据预处理部分参考上章内容,后续不再赘述,此处展示两种BERT使用方法

BertForTokenClassification(QA得分)

此类适用于问答系统,输入中将上面几个模型中的label改成了start_position和end_position,即答案在原文中起始和结束位置,输出是将预测分数改成了对答案起始位置和结束位置的预测分数。下面为直接使用预训练模型的代码参考

5.1 Bert原理简介

BERT的全称为Bidirectional Encoder Representation from Transformers,是一个预训练的语言表征模型。它强调了不再像以往一样采用传统的单向语言模型或者把两个单向语言模型进行浅层拼接的方法进行预训练,而是采用新的masked language model(MLM),以致能生成深度的双向语言表征。BERT论文发表时提及在11个NLP(Natural Language Processing,自然语言处理)任务中获得了新的state-of-the-art的结果,令人目瞪口呆。

该模型有以下主要优点:

5.1.1 Bert结构

以往的预训练模型的结构会受到单向语言模型(从左到右或者从右到左)的限制,因而也限制了模型的表征能力,使其只能获取单方向的上下文信息。而BERT利用MLM进行预训练并且采用深层的双向Transformer组件(单向的Transformer一般被称为Transformer decoder,其每一个token(符号)只会attend到目前往左的token。而双向的Transformer则被称为Transformer encoder,其每一个token会attend到所有的token)来构建整个模型,因此最终生成能融合左右上下文信息的深层双向语言表征。关于Transformer的详细解释可以参见Attention Is All You Need 或者 The Illustrated Transformer,经过多层Transformer结构的堆叠后,形成BERT的主体结构

img

5.1.2 模型输入

BERT的输入为每一个token对应的表征(图中的粉红色块就是token,黄色块就是token对应的表征),并且单词字典是采用WordPiece算法来进行构建的。为了完成具体的分类任务,除了单词的token之外,作者还在输入的每一个序列开头都插入特定的分类token([CLS]),该分类token对应的最后一个Transformer层输出被用来起到聚集整个序列表征信息的作用。

由于BERT是一个预训练模型,其必须要适应各种各样的自然语言任务,因此模型所输入的序列必须有能力包含一句话(文本情感分类,序列标注任务)或者两句话以上(文本摘要,自然语言推断,问答任务)。那么如何令模型有能力去分辨哪个范围是属于句子A,哪个范围是属于句子B呢?BERT采用了两种方法去解决:

上面提到了BERT的输入为每一个token对应的表征,实际上该表征是由三部分组成的,分别是对应的token分割位置 embeddings(位置embeddings的详细解释可参见Attention Is All You NeedThe Illustrated Transformer),如下图:

preview

5.1.3 模型输出

C为分类token([CLS])对应最后一个Transformer的输出,T_i则代表其他token对应最后一个Transformer的输出。对于一些token级别的任务(如,序列标注和问答任务),就把T_i输入到额外的输出层中进行预测。对于一些句子级别的任务(如,自然语言推断和情感分类任务),就把C输入到额外的输出层中,这里也就解释了为什么要在每一个token序列前都要插入特定的分类token。

5.1.4 Bert的预训练任务

5.2 Bert的优缺点

5.2.1 BERT存在哪些优缺点?

ALBERT:提出了两种参数缩减技术,以降低内存消耗并提高BERT的训练速度

XLNet:XLnet是Transformer XL模型的一个扩展,该模型使用自回归方法预先训练,通过最大化输入序列分解顺序的所有排列的期望似然来学习双向上下文

Roberta:建立在BERT的基础上,修改关键的超参数,删除next-sentence pretraining的预训练目标,并以更大的mini-batches和learning rates进行训练

GPT2:超大规模语料上通过transformer结构进行的无监督训练的语言模型,适用于各项生成任务

img
上一篇下一篇

猜你喜欢

热点阅读