丹凤千字科普:3维单位列向量的值(详细资料介绍)


丹凤千字科普:3维单位列向量的值(详细资料介绍)  

使用简化版的BERT模型——DisTillBERT进行句子情感分类任务的教程

本文将为您提供一个详细的教程,介绍如何使用DisTillBERT模型完成句子情感分类任务。如果您是一名自然语言处理从业者,那么您一定听说过最近大火的BERT模型。本文是一份使用DisTillBERT模型完成句子情感分类任务的简化版教程,也是一份难得的BERT快速入门指南。

在过去的几年中,用于处理语言的机器学习模型取得了突飞猛进的进展。这些进展已经走出了实验室,开始为一些先进的数字产品赋能。其中,BERT是一个很好的例子。Google认为这一进步(或者在搜索中应用自然语言理解技术的进步)代表着“过去五年中最大的飞跃,也是搜索历史上最大的飞跃之一”。

本文将介绍如何使用不同的BERT模型对句子进行分类。我们将通过一个简单的例子来展示使用BERT过程中所涉及的关键概念。除了这篇博文,我们还准备了一份对应的notebook代码,您可以参考并运行。

数据集:SST2

在本示例中,我们使用了一个名为SST2的数据集,该数据集收集了一些影评中的句子,每个句子都有标注,好评被标注为1,差评标注为0。

模型:句子情感分类

我们的目标是创建一个分类器,它的输入是一句话(即类似于数据集中的句子),并输出一个表示情感的标签,积极或消极。整个模型的框架可以看作是由两个子模型组成:

1. DisTilBERT首先对句子进行处理,并将提取到的信息传递给下一个模型。DisTilBERT是BERT的缩小版,由Hugging Face团队开发并开源。它是一种更轻量级并且运行速度更快的模型,同时基本达到了BERT的性能。

2. 另一个模型是scikit-learn中的Logistic回归模型,它会接收DisTilBERT处理后的结果,并将句子分类为积极或消极(0或1)。

我们在两个模型之间传递的数据是768维的向量。我们可以把这个向量看作能够用于分类任务的句子嵌入。实际上,这个向量是以[CLS]为输入的第一个位置上的结果。

模型训练

尽管整个模型包含了两个子模型,但是我们只需要训练logistic回归模型。至于DisTilBERT,我们将直接使用已经在英文上预训练好的模型。这个模型不需要被训练或微调,就可以进行句子分类。BERT训练时的一般目标让我们已经有一定的句子分类能力了,尤其是BERT对于第一个位置的输出(也就是与[CLS]对应的输出)。我觉得这主要得益于BERT的第二训练目标——次句预测(Next sentence classification)。该目标似乎使得第一个位置的输出封装了句子级的信息。

教程概览

这篇教程的计划如下:我们使用预训练好的DisTilBERT来生成2000个句子的嵌入。接下来,我们将不再涉及DisTilBERT,剩下的工作都是Scikit-Learn的任务了。我们将把DisTilBERT的输出划分为训练集和测试集,然后就可以在训练集上训练逻辑回归模型了。每个预测值是怎么计算出来的呢?在我们深入研究训练模型的代码前,让我们先看一下训练好的模型是如何计算出其预测值的。假设我们正在对句子“a visually stunning rumination on love”进行分类。第一步要做的就是用BERT分词器(tokenizer)将这些单词划分成词(token)。然后,我们再加入句子分类所需的特殊词(在句子开始加入[CLS],末端加入[SEP])。分词器要将这些词(token)替换为嵌入表中对应的编号,我们可以从预训练模型中获取这张嵌入表。

现在,我们输入的句子是可以传递给DisTilBERT的形式了。如果读者读过“Illustrated BERT”,这一步也可以被可视化为下图:DisTilBERT的数据流将输入向量传递给DisTilBERT之后的工作方式就跟在BERT中一样,每个输入的词都会得到一个由768个浮点数组成的输出向量。由于这是个句子分类任务,我们只关心第一个向量(与[CLS]对应的向量)。该向量就是我们输入给logistic回归模型的向量。从这一步开始,logistic回归模型的任务就是:根据它在训练阶段学到的经验,对这个向量进行分类。我们可以将整个预测过程想象成这样:我们将在下一节中讨论整个训练过程及其相关代码。代码在本节中,我们将重点介绍训练这个句子分类模型的代码。读者可以从Colab和Github上获取完成本任务所需的所有notebook代码。我们需要导入相关的程序包。然后,我们需要导入预训练好的DisTilBERT模型和分词器。接下来,我们可以对数据集进行分词操作了。请注意,我们要对所有句子进行同一批次的分词处理。在这里,由于算力的问题,我们只用了2000个句子作为示例。现在,数据集变成了一个包含许多列表结构的列表或者Pandas的数据帧。在DisTilBERT可以接收它们作为输入数据之前,我们需要把这些向量整理成相同的维度(在较短的句子后面填充上编号“0”)。你可以在notebook中看到用于“填充”操作的代码,它们就是Python字符串和数组的简单操作。完成“填充”操作后,我们就得到了BERT可以接收的矩阵/张量了。现在我们要把这个三维的输出张量展开以便我们能从中提取我们需要的二维张量

  丹凤千字科普:3维单位列向量的值(详细资料介绍)