本文(部份内容)翻译自文章A Visual Guide to Using BERT for the First Time,其做者为Jay Alammar,访问网址为:http://jalammar.github.io/a-visual-guide-to-using-bert-for-the-first-time/ ,能够做为那些不熟悉BERT的读者首次阅读。文章中若有翻译不当之处,还请批评指正。html
本文是关于如何使用BERT的变异版原本进行句子分类的简单教程。该例子足够简单,所以能够做为首次使用BERT的介绍,固然,它也包含了一些关键性的概念。python
本文中使用的数据集为SST2,它包含了电影评论的句子,每一句带有一个标签,或者标注为正面情感
(取值为1),或者标注为负面情感
(取值为0)。
git
咱们的目标是建立一个模型,它可以处理一个句子(就行咱们数据集中的句子那样)而且输出1(代表该句子具备正面情感)或者0(代表该句子具备负面情感)。咱们设想它长这样:
事实上,该模型包含两个模型:github
DistillBERT
会处理句子并把它提取后的信息传递给下一个模型。DistillBERT
是BERT
的变异版本,由HuggingFace
小组开发和开源。它是BERT
的更轻量、更快速的版本,同时它的表现基本与BERT
相近。逻辑回归模型
(Logistic Regression model),它会利用 DistillBERT
的处理结果,而后将句子进行分类成正面情感
或者负面情感
(分别为1或者0)。在两个模型之间传递的数据为1个768维的向量。咱们能够把这个向量理解为这个句子的嵌入向量(Embedding Vector),用于分类。
ide
尽管咱们用了两个模型,可是咱们只会训练逻辑回归模型
。对于DistillBERT
,咱们会使用已经预训练好的英语模型。该模型,既不会被训练也不会作微调(fine-tuned)
,直接进行句子分类。这是由于,咱们能够从BERT
中得到句子分类的能力。这尤为适合BERT
输出的第一个位置(跟[CLS]标志相关)。我相信这是因为BERT
的第二个训练模型——下一句分类(Next sentence classification)
。该模型的目标在于封装句子级别的语料进行训练,并输出第一个位置。transformers
库已经提供了DistillBERT
的操做,做为其预训练模型版本。
gitlab
如下是该教程的计划安排。首先咱们会使用DistillBERT
来产生2000个句子的句子向量。
这一步以后咱们不会接触DistillBERT
。接下去只是Scikit Learn的操做。咱们将数据集分为训练集和测试集。
接下来咱们在训练集上使用逻辑回归模型
进行训练。
测试
在咱们讲解代码和解释如何训练模型以前,让咱们看一下已预训练好的模型如何进行预测。
咱们尝试着预测句子“a visually stunning rumination on love”。第一步是使用BERT tokenizer 将句子划分红tokens。而后加上句子分类的特殊tokens([CLS]在开始位置,[SEP]在句子结尾)。
第三步是经过已预训练好的模型的嵌入表(embedding table)将每个tokens映射成各自的id。这一步能够参考word embedding
,参考阅读文章The Illustrated Word2vec。
咱们注意到,tokenizer仅须要一行代码就能完成以上步骤。ui
tokenizer.encode("a visually stunning rumination on love", add_special_tokens=True)
咱们的输入句子如今已经处理成DistilBERT
能够处理的格式了。
若是你已经读过Illustrated BERT,那么这一步的可视化以下:
翻译
DistilBERT
处理输入向量的流程相似于BERT
。输出是每个token对应一个向量。每一个向量由768个浮点型数字组成。
由于这是一个句子分类任务,故咱们忽略其余向量而只取第一个向量(跟[CLS]相关的那个)。这个向量咱们会做为逻辑回归模型
的输入。
从这里开始,就是逻辑回归模型
的事儿了,它负责将输入的向量进行分类。咱们设想一个预测的流程长这样:
3d
文章中用到的数据集下载网址为:https://github.com/clairett/pytorch-sentiment-classification/raw/master/data/SST2/train.tsv。下载DistillBERT
模型文件,网址为:https://www.kaggle.com/abhishek/distilbertbaseuncased 。
原文中这部分的代码讲解比较多,我这边忽略过去了,笔者想按本身的思路来处理,所以这部份内容会有调整。完整的思路以下:
下载数据集和模型文件,与代码放在同一目录下。创建jupyter脚本,先载入必要的模块:
接着咱们利用pandas读取训练集数据,并统计标签值的频数:
读取DistillBERT
模型文件并建立tokenizer:
经过tokenizer完成句子切分红tokens,并映射到id:
因为每一个句子的长度可能会不一样,所以须要对句子进行填充(Padding),保持每一个句子的输入维度一致,句子填充的长度为该数据集中句子长度的最大值。
对句子进行填充后,而后再进行Masking。这是由于若是咱们直接将padded传入BERT
,这会形成必定的困扰。咱们须要建立另外一个变量,来告诉模型去mask以前的填充结果。这就是attention_mask的做用:
咱们的输入已经准备完毕,接下来咱们尝试着用DistillBERT
来获取向量,也就是以前说的第一步。这一步的处理结果会返回last_hidden_states
,而咱们的分类模型只须要获取[CLS]
这个token对应的输出向量。
可视化的操做说明以下图:
这样,咱们就把以前的每个句子映射成了1个768维的句子向量,而后就利用逻辑回归模型
直接进行训练就能够了。
最后,咱们来看一下这个模型在测试集上的效果:
本文主要介绍了如何利用DistillBERT
和已经封装好的transformers
模块,结合逻辑回归模型
对英文句子进行文本二分类。后续笔者还会研究在中文上的文本分类以及如何进行微调(Fine_tuning)。
本项目的Gitlab地址为:https://gitlab.com/jclian91/sentence_classify_using_distillBERT_LR,原文章做者的Github地址为https://github.com/jalammar/jalammar.github.io/blob/master/notebooks/bert/A_Visual_Notebook_to_Using_BERT_for_the_First_Time.ipynb 。 感谢你们阅读~