Natural Language Understanding with BERT and Transforme

发布于:2023-09-27 ⋅ 阅读:(124) ⋅ 点赞:(0)

作者:禅与计算机程序设计艺术

1.简介

BERT (Bidirectional Encoder Representations from Transformers)是一种预训练语言模型,它提出了一种全新的基于transformer的预训练方法,可以学习到词、句子和段落的上下文表示,并且达到了相对更好的性能。NLU (Natural Language Understanding)任务就是将自然语言文本转换成机器可读的形式,如识别 intent(任务)、slot filling(填充槽位)、question answering(问答)等。本文通过介绍BERT的基本概念、原理及其应用场景,介绍如何利用Transformer-based的BERT进行NLU任务。

2.基本概念及术语

2.1 Transformer概述

2.2 BERT概述

BERT(Bidirectional Encoder Representations from Transformers),中文名叫做“双向编码器表征”,是一种预训练语言模型,它是transformer的一种变体。其提出了一种全新的基于transformer的预训练方法,可以学习到词、句子和段落的上下文表示,并且达到了相对更好的性能。BERT不仅在NLP领域取得了很大的成功,而且已被越来越多的科研工作所采用。

在英文当中的“BERT”一词的含义实际上是指的是一种预训练模型——“BERT for pre-training text representations”或“Bidirectional Encoder Representations from Transformers”,表示这个模型是从Transformer提取特征并进行fine-tuning,用来解决自然语言理解的问题。BERT是一个带有两个encoder和两个decoder的Transformer-based的预训练模型。

2.3 NLU任务

NLU (Natural Language Understanding)任务就是将自然语言文本转换成机器可读的形式,如识别 intent(任务)、slot filling(填充槽位)、question answering(问答)。而本文只讨论两种任务:intent classification 和 slot filling。

Intent classification 是意图识别,也就是确定用户的真实目的。举个例子,假设有一个电话客服系统,用户可能会询问“我想换一个手机号码”。为了帮助用户快速找到正确的服务,电话客服系统需要根据用户的输入判断是要查询服务还是更换手机号码。基于BERT的intent classification可以分成以下几个步骤:

  1. 数据预处理:将原始数据(如用户输入的文本)转化为BERT能够接受的输入格式。例如,对于一句话,需要切分为词汇、标记各个词汇的标签、添加特殊字符标记等。
  2. WordPiece tokenizer: 对输入文本进行分词,并用WordPiece算法将每个词汇按照子词的方式重新切分,每一个词汇可能包含多个子词。例如,“running”可以被切分成“run”和“ning”两个子词。
  3. Token embeddings:通过WordPiece embedding生成输入序列对应的token embedding。
  4. Masked language model: 使用掩码语言模型损失函数,使得模型只能看到部分输入信息。
  5. Next sentence prediction task: 用下一句预测任务,帮助模型预测句子之间的相关性。
  6. Intent classifier: 将word embedding和下一句预测信息作为输入,训练一个二元分类模型,用来识别输入文本的意图类别。

Slot filling 是槽位填充,也就是识别出语句中的实体及其类别。比如,在一个旅行网站上,用户可能会问“想要什么类型的酒店?”系统需要识别出“酒店”是一个实体,“类型”是一个槽位,因此需要填充“酒店”实体的类别。

基于BERT的slot filling可以分成以下几个步骤:

  1. 数据预处理:同样需要将原始数据转化为BERT接受的输入格式。
  2. Sentence piece tokenizer: 将输入文本切分成句子。
  3. Token embeddings: 生成句子对应的token embedding。
  4. Multi-label classification task: 根据实体库建立一套多标签分类任务。
  5. Slot labeler: 根据实体类别、上下文等条件进行标记。
  6. Slot recognizer: 在BERT输出结果上添加一个额外的分类器,用来识别出每个标记的实体类别。

以上分别是基于BERT进行intent classification 和 slot filling 的基本流程。

3.核心算法原理和具体操作步骤及数学公式讲解

3.1 BERT原理

3.1.1 Transformer概览

首先,我们来看一下transformer的基本结构。如下图所示,Transformer由Encoder和Decoder两部分组成。 Encoder和Decoder两部分都由N个相同的Layer组成,每层由两个sub-layer构成。第一个是Multi-Head Attention Layer,又称self-attention layer。该层的输入包括输入序列的所有token及mask,输出包括token序列的每个元素的加权求和及每个attention head的权重系数。第二个是Positionwise Feedforward Layer,用来实现对序列中每个元素的非线性映射,并得到最终的表示。

然后,我们再看一下bert的基本结构。如下图所示,BERT由三个模块组成:Embedding Module,Transformer Module,Output Module。Embedding Module负责将文本序列转换成词嵌入向量,Transformer Module负责对序列中的每个词向量进行多头注意力操作,Output Module则负责将各个层次的表示拼接起来,并通过最后一层的dense层进行分类。

3.1.2 自注意力机制

自注意力机制是指对输入序列不同位置上的token之间关联性建模的机制。本质上来说,自注意力机制是一种多头注意力机制,其中每个头关注于整个输入序列,从而能够捕获不同位置的依赖关系。但是,由于输入序列可能非常长,因此自注意力机制在计算复杂度较高时,通常会采用局部性关注策略。

自注意力机制有几种不同的形式。第一种是multi-head self-attention。在这种形式中,一个输入序列中的所有token都被分割成若干个子序列,这些子序列会被并行地输入到不同的注意力头中。第二种是single-head self-attention,也称为vanilla self-attention。在这种形式中,只有一个注意力头被用来获取序列中所有token之间的关联性。第三种是local self-attention,它只关注邻近的范围内的token。

值得注意的是,自注意力机制中的缩放因子(scale factor)对于训练有重要影响。如果缩放因子过小,那么模型容易出现爆炸或梯度消失现象。反之,如果缩放因子过大,那么模型容易出现精度低下或梯度爆炸现象。一般情况下,初始的缩放因子设置为$\sqrt{d_k}$,其中$d_k$是隐藏状态维度。另外,在softmax层之前施加Dropout层,减轻过拟合。

3.1.3 编码器-解码器架构

编码器-解码器架构是指使用一个固定的编码器网络来处理输入序列,另一个独立的解码器网络则用于生成输出序列。编码器的输出序列的每个元素都是输入序列的一个元素的特征表示。通过这种方式,编码器可以将输入序列的全局信息编码到隐变量表示中,而解码器则可以使用这些隐变量表示来生成相应的输出序列。

encoder-decoder架构中的编码器由多层self-attention和feedforward神经网络组成。每个层的输入是来自前面各层的输出,并且输出时激活后的特征表示。在encoder端,这些特征表示被输入到一个多层的MLP中,其中每一层都跟随一个残差连接。

在decoder端,decoder也由多层self-attention、feedforward和embedding层组成。在embedding层,输入的词序列被转换成固定长度的词向量。在注意力机制层和MLP层,decoder使用与encoder相同的结构,但对输入序列中的每个位置都产生输出。在每个时间步,输出都会被输入到下一个解码器层,直至生成结束符或者解码器内部的长度限制。

3.1.4 BERT预训练目标

BERT的训练目标与NLP领域的其他预训练模型不太一样,它具有以下四点关键特性:

  1. Masked LM:采用随机遮盖一部分词汇,让模型去预测被遮盖的词汇,从而进一步增强输入序列的信息流通。
  2. Next Sentence Prediction:采用句子对,提升模型的序列理解能力。
  3. Segment Embedding:引入额外的token segment embedding,从而使模型能够区分不同句子的语法信息。
  4. Position Embedding:引入位置向量作为输入,能够改善模型的位置敏感性。

Masked LM的训练过程可以分成以下五步:

  1. 从一个长文档中随机采样一个句子。
  2. 搜索候选词汇,并将所有选中的词汇替换成特殊标记【MASK】。
  3. 预测被遮盖的词汇,并计算一个loss。
  4. 更新模型参数。
  5. 返回第2步,重复执行以上过程。

Next Sentence Prediction的训练过程可以分成以下五步:

  1. 从一个长文档中随机采样两个句子,并用分隔符来区分它们。
  2. 用分隔符来区分两个句子。
  3. 预测是否为同一个句子。
  4. 计算损失函数。
  5. 更新模型参数。
  6. 返回第2步,重复执行以上过程。

Segment Embedding的训练可以分成以下三步:

  1. 为输入文本添加额外的token segment embedding。
  2. 训练模型预测正确的segment embedding。
  3. 更新模型参数。

Position Embedding的训练可以分成以下两步:

  1. 为输入序列添加位置向量。
  2. 训练模型预测正确的位置向量。

3.1.5 BERT Fine-tune目标

Fine-tune阶段的目的是为了调整BERT预训练模型的参数,从而获得更适合特定任务的性能。对于BERT,Fine-tune目标可以分成两大类:

  1. Supervised learning:指fine-tune过程中,针对特定任务,仅更新BERT的参数,而保持其余参数不变。如对NLI任务的fine-tune。
  2. Unsupervised learning:指fine-tune过程中,针对特定任务,联合更新BERT的参数及其Embedding层的参数。如GPT-2。

Supervised learning的训练可以分成以下六步:

  1. 从训练集中随机抽取一批样本作为task的正例。
  2. 从训练集中随机抽取一批样本作为task的负例。
  3. 拼接正例和负例。
  4. 添加句子顺序标签。
  5. 对拼接后的样本进行BERT预训练。
  6. 对task进行Fine-tune。

Unsupervised learning的训练可以分成以下七步:

  1. 从训练集中随机抽取一批样本。
  2. 将样本随机打散。
  3. 通过输入文本的序列和随机顺序的位置索引进行BERT预训练。
  4. 使用正态分布初始化BERT参数。
  5. 将预训练好的BERT模型固定住。
  6. 以自监督的方式,对BERT模型进行微调。
  7. 输出fine-tuned模型的预测结果。
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到