作者Jay Alammar编译量子比特制作|微信官方账号QbitAIBERT作为自然语言处理领域的C玩家,始终是NLPer不可回避的一部分。
不过如果是经验不多,基础薄弱的玩家,玩BERT还是有点难度。
现在,科技博主Jay Alammar创建了一篇文章《第一次使用BERT的图形化指南》,以非常简单明了的方式介绍了如何入门BERT。从BERT的原理到实际操作过程都有图,甚至图比代码还多。量子比特为大家编译运输如下~
本文以伯特变体句子的分类为例,主要介绍了伯特的用法。
最后一个入口也有Colab的地址。
数据集:SST2首先我们需要使用SST2数据集,里面的句子来自一些影评。
如果影评人正面赞赏影片,会有“1”的标签;
如果影评人不喜欢这部电影,做出负面评价,就会有“0”的标签。
数据集中的影评是用英文写的,看起来是这样的:
句子分类模型现在,在SST2影评数据集的帮助下,我们需要创建一个模型,对英语句子进行自动分类。
如果判断是肯定的,标记1;如果判断是否定的,打0分。
一般逻辑如下:
输入一句话,通过影评句子分类器输出肯定或否定的结果。
这个模型实际上是由两个模型组成的。
DistilBERT负责处理句子,提取信息,然后传递给下一个模型。这是HuggingFace做的BERT开源版本,轻量级,速度快,性能和原版差不多。
下一个模型是基本的逻辑回归模型。它的输入是DistilBERT的处理结果,输出为正或负。
我们在两个模型之间传递的数据是一个大小为768的向量,它可以作为一个句子嵌入,可用于分类。
虽然在模型的训练过程中我们会用到两个模型,但是我们只需要训练logistic回归模型。DistilBERT可以直接使用预训练版本。
然而,该模型从未被训练或微调用于句子分类的任务。我们从通用目标BERT中获得一些句子分类能力,特别是对于第一位置的BERT输出(与[CLS]令牌相关)。这是BERT的第二个训练目标,其次是句子分类。这个目标似乎是训练模型在第一个位置把整句意思封装到输出位置。
这个Transformer库为我们提供了DistilBERT的实现和模型的预训练版本。
概述这是本教程的整个计划。首先,我们使用训练好的蒸馏词生成2000个句子的句子嵌入。
之后,你就不用再碰DistilBERT了。这都是Scikit学习的内容,我们对该数据集进行常规培训和测试:
对第一个模型DistilBERT进行训练测试,并为我们的训练创建数据集,对第二个模型logistic回归模型进行评估。
然后在训练集上训练逻辑回归模型:
单一预测是如何工作的?在研究代码如何解释如何训练模型之前,我们先来看看一个经过训练的模型是如何进行预测的。
我们试着分类预测一下这句话:
对爱情的视觉震撼思考
视觉上对爱情的惊人反映
第一步是把句子分成两个记号;用BERT tokenizer
第二步,我们添加一个特殊的记号用于句子分类(第一个是【CLS】,句尾是【SEP】)。
第三步,tokenizer用表中嵌入的ID替换每个标记,成为训练模型的一个组件。
请注意,tokenizer完成了这行代码中的所有步骤:
1个记号赋予器。encode(‘一个视觉上惊艳的关于爱情的谣言’,add _ special _ tokens=true)现在我们的输入句子处于可以传递给DistilBERT的适当状态。
这一步看起来像这样:
从DistilBERT传入输入向量,传入DistilBERT,输出每个输入令牌的向量,每个向量由768个数字组成。
因为这是一个句子分类的任务,所以我们忽略除了第一向量以外的其他内容(第一向量与【CLS】token相关),然后将第一向量作为logistic回归模型的输入。
从这里开始,逻辑回归模型的工作就是根据它在训练过程中学习到的经验对这个向量进行分类。
本次预测计算过程如下:
现在,开始查看整个过程的代码。后来,你还可以在门户中看到GitHub代码和Colab上的runnable版本。
首先,导入贸易工具。
1 Import numpy as np2 Import pandas as pd3 Import torch 4 Import transformers as ppb # py torch transformers 5 from sk learn . linear _ model Import logisticregression 6 from sk learn . model _ selection Import cross _ val _ score 7 from sk learn . model _ select Import Train _ Test _ Split您可以在GitHub中找到这个数据集,这样我们就可以直接导入到pandas dataframe中。
1df=PD . read _ CSV(‘ 3359 github . com/claire TT/py torch-sentinel-class ification/raw/master/data/ss T2/train . tsv ‘,delimiter=’ \ t ‘,header=none)。您可以使用df.head()直接查看数据帧
1df.head()然后输出:
导入预训练的DistilBERT模型和tokenizer1 model _ class,tokenizer _ class,pretrained _ weights=(ppb。蒸馏模型,ppb。Distilberttokenizer,’ distilbert-base-uncased’)23##想要bert而不是distilbert取消注释以下行:4#model_class,tokenizer_class,pretrained_weights=(ppb。伯特模型,ppb。BertTokenizer,Bert-base-un cased ‘)56 # load pre trained model/tokenizer 7 tokenizer=tokenizer _ class . from _ pre trained(pre trained _ weights)8 model=model _ class . from _ pre trained(pre trained _ weights)现在可以对这个数据集进行令牌化了。
注意,这一步不同于上面的例子。这个例子只处理了一个句子,但是我们必须将所有的句子进行批处理。
令牌化1令牌化=df [0]。apply((lambda x : tokenizer . encode(x,add _ special _ tokens=true)))。这一步让每一句话都变成了ID的列表。
是数据集(或熊猫系列/数据框架)的当前列表。在DistilBERT处理它之前,我们需要统一所有向量的规范,并在短句中添加token 0。
填完0,现在有一个成型的矩阵/张量可以馈给BERT:
现在,为填充的令牌矩阵创建一个输入张量,并将其发送给DistilBERT。
1 input _ ids=torch . tensor(NP . array(padded))23 with torch . no _ grad():4 last_hidden_states=model(input _ ids)运行完这一步,last _ hidden _ States保留DistilBERT的输出。
打开BERT的输出张量以解压缩该三维输出张量,并首先检查其大小:
复习处理句子的过程。每一行都与数据集中的一个句子相关联。回头看,整个过程是这样的:
挑出句子分类的重要部分。我们只对伯特的[CLS]令牌输出感兴趣,所以我们只需挑出重要的部分。
以下是如何从3D张量中挑选出我们需要的2D张量:
1 #切片输出为所有序列的第一个位置,取所有隐藏单元输出2 features=last _ hidden _ States[0][:0,]。Numpy()现在有一个2D numpy数组,其中嵌入了我们数据集中所有句子的句子。
逻辑回归数据集现在我们有了BERT的输出,之前的逻辑回归模型已经训练好了。下图中的798列是要素,标注在初始数据集中。
在完成传统的机器学习训练测试后,我们可以采取logistic回归模型进行训练。
1 labels=df [1] 2 train _ features,test _ features,train _ labels,test _ labels=train _ test _ split(features,labels)将数据分为训练集/测试集:
接下来,在训练集上训练逻辑回归模型:
1lr _ clf=logistic regression()2lr _ clf . fit(train _ features,train _ labels)既然模型已经定型,请使用测试集对其进行评级:
LR _ CLF获得的模型的精度。分数(测试特征,测试标签)是81%。
评分基准作为参考,该数据集目前最高准确率评分为96.8。
在这个任务里,蒸馏器可以训练来提升分数,这个过程叫做微调(微调),可以更新伯特的权重,来实现更好的分类句子。
微调后的蒸馏啤酒可以实现90.7的准确率,完整的伯特模型能达到94.9的准确率。
传送门首次使用伯特的视觉指南贾拉玛街https://号。github。io/a-首次使用伯特的视觉指南/
代码https://github。com/jalammar/jalammar。github。io/blob/master/notebooks/BERT/A _ Visual _ Notebook _ to _ Using _ BERT _ for _ the _ First _ timeipynb
https://号。研究。谷歌。com/github/jalammar/jalammar。github。io/blob/master/notebooks/BERT/A _ Visual _ Notebook _ to _ Using _ BERT _ for _ the _ First _ timeipynb
蒸馏瓶https://培养基。com/拥抱脸/distilbert-8cf 3380435 b5
— 完—
量子位自量子位头条号签约
关注我们,第一时间获知前沿科技动态
暂无讨论,说说你的看法吧