NLP技术(从今至古语言模型和算法)

学习摘要,都是最基础的东西,3月份整理的,有从博客文章里看的,也有自己的一些想法,也许存在一些错误,欢迎批评指正,大家选择性阅读:)
参考论文:
【1】论文名称:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
【1】论文地址:https://arxiv.org/abs/1810.04805
【2】论文名称:Attention Is All You Need
【2】论文地址:https://arxiv.org/abs/1706.03762
太多了,有空补

写在前面:训练语言模型到底学到了什么

  • 首先,针对预训练语言模型已经有很多解释分析的工作,以华为20年的一篇工作为例,他们通过分析Bert和RoBerta在COQA(包含抽取、否定、计数等较为复杂的语言任务)任务上的表现,发现:
    1.Bert缺乏语言抽象能力,通常依赖实体名称或词序等表面特征解决问题,
    2.Roberta相对于Bert学到了更好的词汇表达,但还不能解决复杂的合成语义理解。这篇工作主要是专注针对语言知识进行分析。
  • 其次,对于世界知识,也就是我们的实体知识,有很多工作表明,语言模型中是存储了大量的世界知识的,甚至有些工作尝试把语言模型当作知识库来使用,但是也有些工作发现语言模型对于实体间复杂依赖关系的建模是比较弱的,因此也有很多工作尝试用知识去增强语言模型。

为什么预训练有效呢,大概是因为预训练任务需要模型具有的能力与下游任务需要模型具有的能力有重合部分,这种重合越大,预训练越有效。以及预训练的数据集往往远大于下游任务的数据集,因此通过预训练把两种任务共同需要的能力训练的更好。


1 现代化的语言模型

1.1 Bert

  • BERT的全称是Bidirectional Encoder Representations from Transformer,也就是基于Transformer的双向编码器表征。

1.1.1 论文简述

  • 它的整个流程是这样的:

  • 首先输入是token embedding、segmentation和position embedding的叠加,也就说每个单词的embedding是三个embedding的叠加。对于token embedding,token是使用WordPiece分词获得的,也就是通过单词表来实现的;而position embedding用来表示句子中单词的位置信息;segmentation embedding则是对于句子整体而言,不同的句子有不同的嵌入,它用来实现句子级别的任务。

  • 接下来就是把上述三个embedding的和送入Transformer。每个Transformer由若干个Transformer层组成,每个Transformer层由三部分组成:
    1.第一部分是多头自注意力层:多头自注意力,对于之前的单头自注意力层,通过Q矩阵K矩阵V矩阵计算的是每个向量的query key 和value,之后通过query *key计算出注意力分数,再经过SoftMax除以根号dk得到最后的注意力分数,后再乘以value得到输出,而对于多头自注意力层来说,设头数为h,则query key value分别乘以h个线性层后得到h个query key value,这h个query key value分别计算一个输出,拼接起来,经过一个线性层得到最后的输出。这里的multi-head的含义是,每个Transformer结构会有多层结构完全一样的,但权重矩阵不同的Attention组成,也就是我们上面提到的Attention结构。这么做的目的是为了防止模型只关注到模型的一部分特征,却忽略了其他特征,所以增加模型的厚度,让模型拥有多层结构相同,但是权重不同的Attention,每一个head都关注到了不同的特征,那么模型整体就会关注到更多的特征。
    2.之后是线性层,这个全连接层的作用是弥补多头注意力层的非线性转化能力不足,用FFN来提供非线性变换
    3.再进行残差连接和Layer Normalization,就得到了最后的输出。

图片来源参考论文3

  • Bert在做预训练的时候,有MLM和NSP两大任务

  • 损失函数
    第一部分是来自 MLM 的单词级别分类任务;,另一部分是句子级别的分类任务;通过这两个任务的联合学习,可以使得 BERT 学习到的表征既有 token 级别信息,同时也包含了句子级别的语义信息。官方代码中给出的所用的损失函数叫做负对数似然函数。

细节:Layer Normalization与Batch Normalization
  • Layer Normalization的思想与Batch Normalization非常类似,只是BN是在每个神经元对一个mini batch大小的样本进行规范化,而LN则是在每一层对单个样本的所有神经元节点进行规范化。不管在哪个维度上做noramlization,本质都是为了让数据在这个维度上归一化,因为在训练过程中,上一层传递下去的值千奇百怪,什么样子的分布都有。BN就是通过对batch size这个维度归一化来让分布稳定下来。LN则是通过对Hidden size这个维度归一化来让某层的分布稳定BN取的是不同样本的同一个特征,而LN取的是同一个样本的不同特征。在BN和LN都能使用的场景中,BN的效果一般优于LN,原因是基于不同数据,同一特征得到的归一化特征更不容易损失信息。但是有些场景是不能使用BN的,例如batchsize较小或者在RNN中,这时候可以选择使用LN,LN得到的模型更稳定且起到正则化的作用。LN能应用到小批量和RNN中是因为LN的归一化统计量的计算是和batchsize没有关系的。
    实际上LSTM训练的时候我们会把一个batch中的序列按照长度降序,长度短的计算完了就不带它继续计算了,相当于batch size缩小了,batch size越小,BN的意义也就越小了。

  • 在Transformer中也是一样的,比如我们用绝对位置编码的BERT,把序列长度都padding或者裁剪到512,那么不存在RNN序列变长问题,也不存在LSTM中batch缩小的问题,但是这个时候虽然序列长度一致了,但是好多embedding是没有意义的,有意义的embedding不应该和它们的分布一致,如果使用BN会导致有意义的embedding损失信息,所以用LN更合适

1.1.2 Bert的下游任务

NER(命名实体识别)
  • 通过BIO标注法我们把NER转化为序列标注问题。具体的解决方案就是BERT+SOFTMAX:把token序列输入bert后针对输出的向量序列用SOFTMAX做分类。
  • 还可以做LSTM+CRF来做(LSTM和Bert都相当于是一个表示层,softMax和CRF则是分类层,拿到表示后对向量进行分类)
MRC(阅读理解)
  • 阅读理解模型常见的形式为:将问题与文本拼接在一起,要求模型在文本中找到答案。如果用BERT实现的话一般使用SPAN标注方式,也就是用头尾指针标注出答案的开始和结束,事实上很多问题都能转化为阅读理解来做,比如说NER,关系抽取,时间抽取等都可以通过阅读理解来解决。
    在这里插入图片描述

MRC也是一种理解文本的任务,它的大体模式是:机器阅读文档,并回答相关的问题。
BERT-MRC模型能取得比其他模型更好的性能的原因是它特殊的数据处理方法,在输入文本前加上了实体类型的描述信息,这些实体类型的描述作为先验知识提高了模型抽取的效果,所以BERT-MRC模型在数据量匮乏的场景下,通过在输入文本前面拼接的query获得了一定的先验信息,提升了性能。

模型的输入
与其他模型不同,在使用BERT-MRC模型之前,需要进行大量的数据预处理操作,例如,有一个实体识别数据集,该数据集中有(人名、地名、机构名)三种类型的实体,在数据预处理阶段需要将实体类型的描述作为query,拼接到每个输入句子的前面,然后针对性的修改原有的标注。举个例子,我们现在有一句话作为输入文本:比尔盖茨和他的好友艾伦一起创办了微软公司。由于数据集共有三种类型的实体,所以需要为这句话构建三条数据,首先以人名的描述作为query,这条数据中标注有两个人名类型的实体(比尔盖茨,艾伦),然后以地名的描述作为query,这条数据中没有实体;以机构名作为query的这条数据有一个实体。可以发现,BERT-MRC模型增加了数据的规模,并通过query增加了先验信息,但是同时也造成一条数据中的实体更少了,这回增加标签不平衡问题。同时作为query的实体类型的描述,也会很大地影响BERT-MRC模型的性能,在BERT-MRC模型的论文中,作者就提出了多种不同的方式作为query,例如举一些实体的例子等,但是实验结果表明,还是自然语言形式的实体描述效果最佳。也就是在问这句话中人物的名称是谁,不要再给模型举例子了。

模型结构
在使用BERT编码得到词向量之后,训练三个分类器,分别用于预测开始、结束位置标签以及一个概率矩阵。开始、结束位置序列是和输入文本等长的一个序列,对应每个字符是否是实体片段的开始和结束位置,概率矩阵代表文本中每个片段是否是实体片段的概率。
上述两个标签序列和一个矩阵三个分类器在训练过程中共可以求三个loss,模型的总loss是上述三个loss之和。
在实验过程中发现片段的概率矩阵在数据量较大的情况下会占用很多内存和显存,所以当数据超过一定规模时,需要将文本片段的概率矩阵分类器去掉,否则模型将会难以训练。

1.2 GPT

太多了,三篇论文,摆烂了放了李沐老师的讲解视频

https://www.bilibili.com/video/BV1AF411b7xQ?share_source=copy_web

区别:BERT和GPT(也可以类比自编码和自回归的区别)

  • 首先,从结构上来说,Bert使用的是双向注意力的Transformer,GPT使用的是单向注意力的Transformer;
  • 其次从预训练任务上来说,Bert预训练任务是MLM和NSP,GPT的预训练任务是预测下文;
  • 第三,从模型性质上来讲,Bert属于自编码模型,GPT属于自回归模型;
  • 第四,从词表来源上讲,Bert使用的是wordPiece算法,GPT使用的是BPE算法。

自编码模型是一种无监督学习输入的特征的方法:用一个神经网络把输入变成特征,同时增加一些噪声,然后再用一个Decoder尝试把特征恢复成原始的信号。基于此,自编码语言模型能很自然的把上下文信息融合到模型中

自回归模型就是指通过上文预测去预测下一个token的概率分布,并最大化正确token的概率,再把模型输出的最大概率的token加在原本的上文后面作为新的上文,不断重复这个过程。所以自回归模型对于生成类NLP任务有天然的优势,比如文本摘要,机器翻译等,在实际生成内容的时候,就是从左向右的,自回归语言模型天然匹配这个过程。

分词

  • 为什么要做分词
    为了解决OOV问题,减少未登录词出现的情况(减少了词表大小)。
  • 如何去做分词:【BPE、WordPiece、ULM】
    这三个都是基于统计的分词方法,统计哪些字母共同出现的概率比较高,就把这些单词作为一个词根加入到词表当中。
  1. Bert用的是WordPiece算法
    它可以看作是BPE的变种。不同点在于,WordPiece基于概率生成新的subword而不是下一最高频字节对。也就是说与BPE不同的是它从所有可能的subword单元中选择加入语言模型后能最大程度地增加训练数据概率的单元作为新的单元。
  2. GPT用的是BPE(字节对编码)
    1.首先准备一个足够大的语料库进行统计。
    2.其次把单词拆分成字符序列并在末尾添加后缀。
    3.第一轮统计每一个连续字节对出现的频率,将出现频率最高的字节对,就把它更新为一个从没有出现过的字节。
    4.重复刚才的操作,直到字节对的种类数量符合我们预期的词表大小

1.3 T5

T5是谷歌2019年的工作,他的核心思想是把所有任务都转化为text-to-text的形式,这样的好处在于可以用同样的模型,同样的损失函数,同样的训练过程,同样的解码过程来完成所有 NLP 任务,有利于实现更好的迁移学习。在确定这个核心之后,谷歌进行了一系列的实验,首先是不同的架构,实验表明,encoder-decoder架构是最佳选择,其次是预训练任务,实验证明bert的MLM是最佳选择,第三是MLM的形式,实验证明replace span(小段替换)法是最佳选择,第四是Mask的比例,作者发现和Bert一样,15%是最佳选择。之后作者还进行了一系列的实验,比较了模型的大小和语料库的大小对模型性能的影响,发现模型大小是最核心的影响因素
T5的预训练任务详细来说就是在输入序列中随机选择15%的span进行遮蔽,被遮蔽的span按先后顺序被替换为M0,M1,一直到Mn,其中每个span长度是通过几何分布随机确定的,然后要求模型输出M0到Mn对应的span.

1.4 Bert的改进型

1.4.1 RoBERTa

  • 首先RoBERTa使用了更长的训练时间,更大的Batchsize,更多的训练数据,实验证明这三点对模型的性能都有很大的提升.
  • 其次,RoBRERTa使用动态Mask策略,即对于每个样本,每次取出时都Mask不同的位置,其次它去掉了NSP任务,NSP任务表现不佳的原因是过于简单,负样本采样时会采样不同文档中的句子,导致模型很容易就能预测出结果。

1.4.2 一系列针对Mask方式的改进

  • 首先是WWM也就是whole word mask,顾名思义,它在mask时会mask被选中的整个词
  • 其次是Ernie,使用whole phrase mask和whole entity mask,也就是对整个的短语和实体进行遮蔽。
  • 最后是span Bert,它以几何分布随机确定span的长度,并随机选择span的开始位置,并mask被选中的整个span

这三种方法都不改变bert的分词方式,仍然以subword为单位。这三种方法本质上来讲都是提高了MLM的难度,要求模型从更宽广的上下文中去预测一个完整的语义单元,避免了模型仅通过前后的token就预测出被mask的token,有助于模型更好的理解语言。

1.4.3 知识增强

以三个典型工作为例:

  • 首先是Ernie,Ernie的Whole entity mask 可以看作一种知识增强的方式,在训练过程中,通过对实体的预测,增强了模型对实体信息的理解,并且能够一定程度上记忆一些实体知识。
  • 其次是K-Bert,它把实体在知识图谱中对应的三元组以文本的形式拼接在句子中,并通过控制注意力矩阵的方式,使得只有实体能注意到自己的三元组,通过这种方式将知识图谱的知识引入到语言模型中,增强模型对于实体的理解。
  • 第三是Erica,在知识图谱中,具有相同关系的三元组头实体和头实体之间是相似的,尾实体和尾实体是相似的,Erica利用这一特点,使用对比学习去学习实体间的相似性,它把具有相同关系的头实体和尾实体作为正样本,拉近他们的向量表示。

1.4.4 句向量表示学习

  • 首先是Albert,它针对NSP任务过于简单的问题进行改进,它在选择NSP的负样本时,会选取同一文档内的句子。
  • 其次是两个运用对比学习的方法,对比学习的核心思想是拉近相似正样本的向量表示,疏远负样本的向量表示,对比学习的关键在于正负样本的选取SimCSE提出将同一个句子的向量表示经过两次不同的Dropout得到的不同向量作为正样本,同一batch中其他句子向量作为负样本,而Clear则是使用使用随机词删除、跨段删除、同义词替换和重新排序等四种数据增强手段生成两个相似句子并将其作为对比学习的正样本。
对比学习

对比学习的核心思想就是拉近相似事物(也就是正样本)的向量表示,疏远负样本的向量表示
例如对比学习在句子表示上的应用:

  1. SimCSE:将同一个句子经过带有Dropout的Encoder(BERT)两次编码得到的略有不同的向量作为对比学习的正样本, 其余向量作为负样本
  2. CLEAR: 使用随机词删除、跨段删除、同义词替换和重新排序等四种数据增强手段生成两个相似句子并将其作为对比学习的正样本

对比学习的损失函数

  1. NT-Xent函数:
    在这里插入图片描述

  2. SimCSE
    在这里插入图片描述
    以e为底正样本之间的相似度/以e为底正样本与所有样本的相似度的和,之后再取负对数

1.5 Transformer及其变种

  1. 针对位置编码:T5
    T5模型去掉了绝对位置编码转而使用相对位置编码的方式,对于两个位置i和j,在它们的注意力分数Ai,j上,加上一个可学习的偏置项:贝塔ij。这个位置偏移函数是使用了一个类似分桶处理的方式去做的。

  2. 针对注意力:稀疏注意力BigBird
    Transformer解决长程依赖问题的能力非常优秀,这主要是由他的全局自注意力层决定的,但与此同时,自注意力层也带来了时间复杂度过高的问题,因此Google的研究人员提出了Big Bird这个模型,使用了稀疏注意力机制,将复杂度从n方降到了线性复杂度。
    具体来讲,Big Bird的注意力机制主要由3个部分组成,首先是random attention,对于每个tokeni,随机选择若干个token计算注意力,其次是window attention,用滑动窗口选择注意力计算的范围,最后是global attention,BigBird把若干个token设置为global token,global token对所有token都要计算注意力,其余token只需要对global token计算注意力。

  3. 通过循环的方式解决超长文本问题的:TransformerXL
    理论上,attention机制可以让Transformer模型捕获任意距离的token之间的依赖关系,但是受限于算力问题,Transformer通常会将本文分割成长度小于等于 512的segment,每个segment之间互相独立,互不干涉。
    这也就意味着,segment之间的依赖关系,或者说距离超过512的token之间的依赖关系就完全无法建模抽取。同时,这还会带来一个context fragmentation的问题,因为segment的划分并不是根据语义边界,而是根据长度进行划分的,可能会将一个完整的句子拆成两个。那么在对这样被拆分的句子进行预测时,可能就会缺少必要的语义信息。
    Transformer-XL提出了Segment-level Recurrence来解决这个问题。
    用一句话概括Segment-level Recurrence,就是,在对当前segment进行处理的时候,缓存并利用上一个segment中所有layer的隐向量,而且上一个segment的所有隐向量只参与前向计算,不再进行反向传播。

2 近代的语言模型

2.1 LSTM

首先,传统的RNN由于其结构简单,以及梯度消失问题,不能很好的建模长程依赖,LSTM通过门控机制对这些问题进行解决,具体而言,对于每个时刻t,LSTM有两个状态分别是cell状态Ct和输出状态Ht,以及三个门,分别是遗忘门、输入门和输出门,遗忘门、输入门和输出门分别由前一时刻的输出Ht-1和当前时刻的输入Xt计算得到,他们分别控制前一时刻的Ct-1有多少能进入当前时刻的Ct,以及当前时刻的输入Xt和上一时刻的输出Ht-1有多少能进入当前时刻的Ct,和当前时刻的Ct有多少会被输出到当前时刻的输出Ht.
Transformer相对与LSTM能更好的处理长程依赖问题,因为自注意力机制天然对于位置不敏感。
在LSTM迭代过程中,针对 在这里插入图片描述而言,每一步在这里插入图片描述可以自主的选择在[0,1]之间,或者大于1,因为 在这里插入图片描述是可训练学习的。那么在这里插入图片描述也就不会一直减小,远距离梯度不至于完全消失,也就能够解决RNN中存在的梯度消失问题。LSTM虽然能够解决梯度消失问题,但并不能够避免梯度爆炸问题,仍有可能发生梯度爆炸。但是,由于LSTM众多门控结构,和普通RNN相比,LSTM发生梯度爆炸的频率要低很多。梯度爆炸可通过梯度裁剪解决。
LSTM遗忘门值可以选择在[0,1]之间,让LSTM来改善梯度消失的情况。也可以选择接近1,让遗忘门饱和,此时远距离信息梯度不消失。也可以选择接近0,此时模型是故意阻断梯度流,遗忘之前信息。

2.2 GRU

GRU有两个门,更新门(能关注的机制)和重置门(能遗忘的机制),以及一个当前状态Ht,更新门和重置门分别由当前输入Xt和上一时刻的输出Ht-1计算得到的,重置门控制前一时刻的输出Ht-1有多少能进入当前时刻的Ht tiled,更新门则控制当前时刻的输出有多少由Ht-1和Ht tiled组成。
在这里插入图片描述
在这里插入图片描述

2.3 ELMO

ELMO的结构是多层双向LSTM,预训练任务也是基于上文预测下一个单词,和基于下文预测上一个单词

3 较久远的语言模型和算法

  1. 独热编码的三个缺点
    一是维度爆炸,内存装不下;二是词汇鸿沟,不能很好的表示词与词之间的相似性;三是强稀疏性,整个向量中有用的信息特别少,几乎没有办法做运算
  2. 分布式表示 Distributed Representation
    可以克服独热编码的缺点,通过训练将某种语言中的每一个词 映射成一个固定长度的短向量,就可以根据词之间的距离来判断它们之间的语法、语义上的相似性了。
    为什么叫做分布式表示?一个简单的解释是这样的:对于One-Hot Representation,向量中只有一个非零分量,非常 集中(有点孤注一掷的感觉);而对于分布式表示,向量中有大量非零分量,相对分散(有点风险平摊的感觉),把词的信息分布到各个分量中去了
    如何获取词向量呢?利用神经网络算法是一种常用的方法大部分情况下,词向量和语言模型都是捆绑在一起的,训练完成后两者同时得到。

3.1 Word2Vec

  • Word2Vec是轻量级的神经网络,其模型仅仅包括输入层、隐藏层和输出层,模型框架根据输入输出的不同,主要包括CBOW和Skip-gram模型。 CBOW的方式是在知道词的上下文的情况下预测当前词.而Skip-gram是在知道了词的情况下,对词的上下文进行预测

  • CBOW的结构
    在这里插入图片描述

  1. input layer输入的X是单词的one-hot representation、
  2. 输入层到隐藏层之间有一个权重矩阵W,隐藏层得到的值是由输入X乘上权重矩阵得到的
  3. 隐藏层到输出层也有一个权重矩阵W’,因此,输出层向量y的每一个值,其实就是隐藏层的向量点乘权重向量W’的每一列
  4. 最终的输出需要经过softmax函数,将输出向量中的每一个元素归一化到0-1之间的概率,概率最大的,就是预测的词
  • 函数:是求概率的最大值,为了方便运算取了log函数,这个概率是知道上下文来预测当前值的最大值,是用softmax算概率

  • 一般神经网络语言模型在预测的时候,输出的是预测目标词的概率,也就是说我每一次预测都要基于全部的数据集进行计算,这无疑会带来很大的时间开销。不同于其他神经网络,Word2Vec提出两种加快训练速度的方式,一种是Hierarchical softmax,(哈夫曼树做的)

  • 另一种是Negative Sampling(负采样)与Hierarchical Softmax相比,NEG不再使用复杂的Huffman树,而是利用相对简单的随机负采样,能大幅度提高性能。随机负采样的过程中,根据词频选择若干个负样本,通过损失函数增大模型预测正样本的概率同时降低负样本的概率

3.2 CRF

之所以在序列标注模型中引入CRF,是为了建模标注序列内部的依赖或约束,常见的任务就是NER了。以BIO标注方案为例,显然IBI是一个显然不合理的序列,如果直接在神经网络上层用softmax为每个词产生一个标注,那么很可能产出的标注序列是无意义的。所以一种方案就是在得到神经网络上层表示后,作每个标注决策时“偷看”一下前面的标注,也就是套用一个可学习的CRF层来获得整个序列上最大似然的结果

3.3 ELMO

ELMO的结构是多层双向LSTM,预训练任务也是基于上文预测下一个单词,和基于下文预测上一个单词。


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值