原来你是这样的BERT,i了i了! —— 超详细BERT介绍(三)BERT下游任务
BERT(Bidirectional Encoder Representations from Transformers)是谷歌在2018年10月推出的深度语言表示模型。
一经推出便席卷整个NLP领域,带来了革命性的进步。
从此,无数英雄好汉竞相投身于这场追剧(芝麻街)运动。
只听得这边G家110亿,那边M家又1750亿,真是好不热闹!
然而大家真的了解BERT的具体构造,以及使用细节吗?
本文就带大家来细品一下。
前言
本系列文章分成三篇介绍BERT,上两篇分别介绍了BERT主模型的结构及其组件相关和BERT预训练相关,这一篇是最终话,介绍如何将BERT应用到不同的下游任务。
文章中的一些缩写:NLP(natural language processing)自然语言处理;CV(computer vision)计算机视觉;DL(deep learning)深度学习;NLP&DL 自然语言处理和深度学习的交叉领域;CV&DL 计算机视觉和深度学习的交叉领域。
文章公式中的向量均为行向量,矩阵或张量的形状均按照PyTorch的方式描述。
向量、矩阵或张量后的括号表示其形状。
本系列文章的代码均是基于transformers库(v2.11.0)的代码(基于Python语言、PyTorch框架)。
为便于理解,简化了原代码中不必要的部分,并保持主要功能等价。
阅读本系列文章需要一些背景知识,包括Word2Vec、LSTM、Transformer-Base、ELMo、GPT等,由于本文不想过于冗长(其实是懒),以及相信来看本文的读者们也都是冲着BERT来的,所以这部分内容还请读者们自行学习。
本文假设读者们均已有相关背景知识。
目录
序列分类任务就是输入一个序列,输出整个序列的标签。
输入的序列可以是单句也可以是双句。
单句序列分类任务就是文本分类(text classification)任务,包括主题(topic)、情感(sentiment)、垃圾邮件(spam)等的分类任务;双句序列分类任务包括相似度(similarity)、释义(paraphrase)、蕴含(entailment)等的分类任务。
根据标签数量分,可以分成单标签和多标签(multi-label)的分类任务。
根据标签的类别数量分,可以分成二分类或三分类、五分类等多分类任务。
BERT中的序列分类任务包括单句和双句的单标签回归或分类任务,涉及到语言可接受性(linguistic acceptability)、情感、相似度、释义、蕴含等特征的分类,即GLUE(General Language Understanding Evaluation)中的任务。
如下为一个相似度回归任务的例子(来自transformers库的示例):
5.000A plane is taking off. ||| An air plane is taking off.
3.800A man is playing a large flute. ||| A man is playing a flute.
3.800A man is spreading shreded cheese on a pizza. ||| A man is spreading shredded cheese on an uncooked pizza.
其中,最左边的是标签,表示两句话的相似度分数,分数越高,相似度越高,分数的取值范围是\([0, 5]\)。
再如下为一个双句释义二分类任务的例子(来自transformers库的示例):
1He said the foodservice pie business ... ||| The foodservice pie business ...
0Magnarelli said Racicot hated ... ||| His wife said he was ...
0The dollar was at 116.92 yen against the yen ... ||| The dollar was at 116.78 yen JPY ...
其中,最左边的是标签,如果后句是前句的释义,即解释说明,那么标签为1,否则为0。
序列分类代码如下:
代码
# BERT之序列分类
class BertForSeqCls(BertPreTrainedModel):
def __init__(self, config):
super().__init__(config)
self.config = config
# 标签