您的位置:首页 > 国内新闻

BERT模型超酷炫,上手又太难?请查收这份BERT快速入门指南!

时间:2020-02-09

数据集:SST2

本例中使用的数据集是“SST2”。这个数据集从电影评论中收集一些句子。每个句子用1表示好的评论,用0表示不好的评论。

句子

label

一个激动人心的、有趣的、最后被转移的关于美女与野兽的再想象和20世纪30年代恐怖电影

1

显然是从任何给定的日间肥皂剧

0

的剪辑室地板上重新组合起来的他们认为他们的观众不会坐着不动去上社会学课

0

这是一个关于爱情、记忆, 历史和艺术与商业之间的战争

1

jonathan parker的bartleby应该是现代办公室失范电影

1

Model:句子情感分类

我们的目标是创建一个分类器,其输入是一个句子(即类似于数据集中的一个句子)并输出1(表示句子反映积极情感)或0(表示句子反映消极情感)。 整体框架如下图所示:

事实上,整个模型由两个子模型组成:

DistilBERT首先处理句子,然后将提取的信息传递给下一个模型。蒸馏伯特是伯特的缩小版,由HuggingFace的一个团队开发并开源。它重量更轻,运行速度更快,基本达到BERT的原始性能。

另一个模型是scikit learn中的逻辑回归模型,它接收蒸馏伯特处理的结果,并将句子分类为正或负(0或1)。

我们在两个模型之间传递的数据是768维向量。我们可以把这个向量想象成可以用于分类任务的句子嵌入。

如果你读过我以前关于图解伯特的文章( . github . io/图解伯特/),这个向量实际上是以单词[CLS为输入的第一个位置的结果。

模型训练

虽然整个模型包括两个子模型,但我们只需要训练逻辑回归模型。至于酿酒厂,我们将直接使用已经过英语培训的模式。然而,这个模型可以在没有训练或微调的情况下对句子进行分类。BERT训练的总体目标是使我们具备一定的句子分类能力,尤其是BERT对第一个位置的输出(即对应于[CLS的输出)。我认为这主要是由于BERT的第二个训练目标句预测。目标似乎使其第一个位置的输出封装句子级信息。变形金刚库为我们提供了一个蒸馏伯特的实现和一个预先训练好的模型。

教程概述

本教程的计划如下:我们首先使用预先训练好的蒸馏伯特生成2000个句子嵌入。在

之后,我们就不再谈论蒸馏伯特了。其余的是Scikit Learn的工作。接下来我们需要做的是将数据集分成训练集和测试集。

在将蒸馏伯特(模型#1)的输出分成训练集和测试集之后,我们获得了用于训练和评估逻辑回归(模型#2)的数据集。请注意,实际上,sklearn会在将数据划分为训练集和测试集之前对样本进行加扰,而不是按照数据的原始顺序直接取前75%。

接下来,我们将在训练集中训练逻辑回归模型:

如何计算每个预测值?

在我们进入训练模型的代码之前,让我们看看训练模型是如何计算其预测值的。假设我们将句子分类为“对爱情的视觉研究”。第一步是使用BERT标记器将这些单词分成标记。然后,我们添加句子分类所需的特殊单词(句子开头是words,结尾是[塞普)。

participator的第三步是查找表并用嵌入表中的相应数字替换这些单词(令牌)。我们可以从预训练模型中得到这个嵌入表。如果你对单词嵌入不太了解,请参阅“图解单词2VEC”:

注意,完成参与者的所有工作只需要一行代码:

标记器。编码(“爱情的视觉震撼工具”,add _ special _ tokens=true)

现在,我们输入的句子是可以传递给蒸馏伯特的形式。

如果您已经阅读了“图解伯特”( . git hub . io/图解伯特/),此步骤也可以如下图所示:

DisTriBut的数据流

在将输入向量传递给DisTriBut后,其工作原理与伯特的一样。每个输入字将得到一个由768个浮点数组成的输出向量。

由于这是一项句子分类任务,我们只关心第一个向量(对应于[CLS的向量)。

这个向量是我们输入逻辑回归模型的向量。

从这一步开始,逻辑回归模型的任务是根据它在训练阶段学到的经验对这个向量进行分类。我们可以想象整个预测过程如下:

我们将在下一节讨论整个训练过程及其相关代码。

Code

在本节中,我们将重点讨论训练这个句子分类模型的代码。读者可以从colab和github获得完成这项任务所需的所有笔记本代码(链接见本文第二段)。

首先,我们需要导入相关的包。

import numpy asnp

import panels aspd

import torch

import transformers asppb # pytorch transformers

fromsk learn . linear _ model import logisticRegression

fromsk learn . model _ selec import cross _ val _ score

fromsk learn . model _ selec到importtrain _ test _ split

数据集的链接如下:我们可以直接将其导入熊猫数据帧。

df=PD . read _ CSV(' hub . com/clairett/pytorch-情感-分类/raw/master/data/SSt2/train . tsv ',分隔符='t ',标头=无)

我们可以通过“df.head”查看前五行数据帧的内容:

df.head

输出如下:

导入预先训练好的DistilBERT模型和分割器

model_class,tokenizer_class,pretended _ weights=(ppb蒸馏模型,ppb。蒸馏器标记器,“基于蒸馏器的未标记”)

# #想要伯特而不是蒸馏器?取消注释以下行:

#model_class,tokenizer_class,pre retained _ weight=(ppb。BertModel,ppb。#

load pretended model/tokenizer tokenizer=tokenizer _ class . from _ pretended(pretended _ weight)

model=model _ class . from _ pretended(pretended _ weight)

现在我们可以对数据集进行分段。请注意,我们在这里要做的与文章中的例子不同。在上面的例子中,只有一个句子被分割和处理。在这里,我们将把所有的句子分成一批来处理。在笔记本中,考虑到计算能力的问题,我们只使用了2000个句子。

participle

tokenized=df [0]。应用((* lambda * x : tokenizer . encode(x,add _ special _ tokens=true))

t

以上代码将所有句子转换为编号列表。

现在,数据集已经成为包含许多列表结构(或熊猫的数组和数据帧)的列表。在DistilBERT可以将它们作为输入数据处理之前,我们需要将这些向量组织到同一个维度中(数字“0”填充在较短的句子之后)。您可以在笔记本中看到对应于“填充”操作的代码。它们是python字符串和数组的简单操作。

完成“填充”操作后,我们得到了BERT可以接收的矩阵/张量。处理

蒸馏伯特

现在,我们基于填充的令牌矩阵创建一个输入张量。并将其传递给distilbert

input _ ids=torch . tendor(NP . array(padded))

with torch . no _ grad :

last_hidden_states=model(input _ ids)

完成此步骤后,distilbert的输出将被分配给“last _ hidden _ States”。这是一个具有维度的元组(句子数量、序列中的最大单词数量、蒸馏伯特模型中的隐藏层数)。在这个例子中,这个维度是(2000,66,768),因为我们有2,000个句子,2,000个句子的最长序列长度是66,并且在蒸馏伯特模型中有768个隐藏层。

展开BERT的输出张量

接下来我们将展开这个三维输出张量。我们可以先分析它的尺寸:

复习这些句子的“生活”。

每行代表数据集中的一个句子。第一句的处理如下图所示:

Slice Get Regional Parts

对于句子分类任务,我们只对BERT获得的对应于[CLS]的输出感兴趣,所以我们只将对应于[CLS]的Slice保留在“立方体”中,并删除其他内容。

这是如何从三维张量中得到我们需要的二维张量:

#对所有序列的第一个位置的输出进行切片。获取所有隐藏单元输出

功能=最后隐藏状态[0] [:0,]。numpy

now,“features”是一个二维numpy数组,包含数据集内所有句子的嵌入。

张量我们从BERT输出中切片。

逻辑回归中的数据集

现在我们已经获得了BERT的输出,并为训练逻辑回归模型组装了数据集。这768列是特性,我们也给出了原始数据集中的标签。

我们用来训练逻辑回归的标记数据集。这些特征是BERT中对应于[CLS(位置#0)的部分,这是我们上图中的切片部分。每行对应于数据集中的一个句子,每列对应于BERT/DistilBERT模型中顶层变压器模块中前馈神经网络的隐藏单元。

在完成机器学习的传统训练集/测试集划分操作后,我们可以创建自己的逻辑回归模型并用我们的数据集进行训练。

labels=df [1]

train _ features,test _ features,train _ labels,test _ labels=train _ test _ split(features,labels)

上面的代码将数据集分为训练集和测试集:

接下来,我们将在训练集上训练逻辑回归模型。

lr _ clf=logistic回归

lr _ clf.fit (train _ features,train _ labels)

既然模型已经过训练,我们就可以用测试集对其进行评估。

lr _ clf.score (test _ features,test _ labels)

上述代码的输出告诉我们模型已经达到81%的准确性。以“评分标准”为参考,该数据集可达到的最高准确率为96.8%。在这个任务中,我们还可以训练DistilBERT来提高它的分数,这通常被称为调优过程。这个过程可以更新BERT的权重参数,使其在句子分类任务(通常称为“下游任务”)中获得更好的性能。调谐后,DistilBERT的精度可达到90.7,而完整的BERT可达到94.9。

笔记本代码

本文开头给出了相关笔记本代码的链接。你自己探索吧!

这是这篇文章的全部内容,应该非常适合那些第一次接触BERT的人。下一步是查看文档并尝试对其进行调整。您还可以返回并将代码中的DistilBERT转换为BERT,看看它是如何工作的。回到搜狐看更多

vr在线播放免费人成视频|美国一级欧洲一级e|久久爱www免费人成

  • 友情链接:
  • 鄢陵农业网 版权所有© www.freesignartwork.com 技术支持:鄢陵农业网| 网站地图