最新模型架构整理

整理一下,时下最新深度模型架构相关知识点~

关键字包括:RNN、Multimodal learning、seq2seq model、encoder/decoder、LSTM、beam search、attention、Transformer、ELMo、Bert、ERNIE、XLNet等

 

Transformer:Google 2017

Bert:Google 2018


下面以【问答】的形式进行模型架构梳理!

问:什么是Multimodal learning?

答:多模态深度学习,输入和输出是两种类型的数据,可以通过模型训练产生一种类型数据来预测/生成另一种类型的数据;(类型和长度都不一定相同)

比如text-->text(翻译系统,问答系统)  image-->text(看图说话)  text-->code(自动生成代码)voice-->text(语音识别系统)

问:什么是seq2seq model?

答:端到端模型,Multimodal learning所使用的模型就是端到端模型,将一种类型数据来预测/生成另一种类型的数据。

模型构建主要包括Encoder层与Decoder层。

什么是beam search?

答:在decoder阶段,输入一个词,在词库中预测出概率最高出现在下一个的词!没错,概率最高top1=贪心算法=局部最优解!

而全局最优解=整句话预测完后每个词累加的概率最高!(计算量庞大)

鉴于此,于是有了beam search,是介入两者之间的:选出词库中概率top-k的词往后继续推测!【这是一个通用思想,不止用于seq2seq】


问:RNN是什么?

答:循环神经网络(Recurrent Neural Network,RNN),是一个时序模型,解决序列型数据问题,比如:文章、语音等

结构:

将input循环输入神经元中,按照时间维度将其展开就得到下图

由于RNN存在的问题:

随着时间步骤长度的增大,它无法从差得很远的时间步骤中获得上下文环境!!

梯度消失/梯度爆炸     如何产生,如何解决?

答:RNN在使用BPTT算法习得参数过程中,反向传递是将每层梯度(偏导)累积的(连续相乘),所以如果循环层数(句子中单词数量)过多:

当梯度大于1时,累积则会出现梯度爆炸

当梯度小于1时,累积则会出现梯度消失

梯度爆炸,解决办法:Gradient clipping(梯度裁剪)/正则化,设置阈值,将梯度约束在一个范围内。

梯度消失--核心--长时序问题【long-term dependency】:引入LSTM,LSTM神经元内的三个门gates使得梯度不容易消失。


问:什么是LSTM?

长短期记忆网络(long-short term memory)

哪3个门?forget 、 input、 output

通过forget门中的sigmoid函数输出0-1之间,决定保留上一时刻多少信息。

 

LSTM存在的问题?如何解决?

答:这2个问题也是RNN的问题

存在问题一:只能依赖上文,无法依赖到下文?

LSTM是从前往后依次输入,所以下文只能依赖上文,可是有时当前词可能会依赖于下文,这时就无法准确预测了!(RNN/LSTM/GRU都存在)

答:使用双向LSTM,即Bidirectional+LSTM。将双向循环神经网络与LSTM模块相结合可以显著地提高性能!

(这是一个伪双向,真正的双向应该是上下文同时会影响当前词,而这里双向LSTM是2个独立模型的合体,先参考上文,后参考下文,并不是同时兼并)

 

存在问题二:bottleneck of rnn,RNN/LSTM作为Encoder层的输出表意能力弱?

context vecter是静态的。

时序模型都存在的问题,拿翻译场景举例:输入一篇长文,RNN/LSTM最后输出一个100维的向量可以称之为context vecter,后续decoder层全依赖于这个context vecter,假如这个context vecter训练输出得不好,那么会大大影响后续的翻译,并且不是翻译每个词都需要整篇长文的信息context vecter的。

答:于是乎,Attention注意力机制孕育而生!

 

Attention注意力机制是什么?在LSTM中如何使用的?

答:Attention注意力机制可以分为两大类。Attention注意力机制很好得处理了时序模型的瓶颈!

一、Attention在decoder阶段对context vecter引入注意力机制】

1.图片类(看图说话image captioning):将图片分割成3*3会对应一个3*3的矩阵,9个值和为1(值域为0~1)

2.文本场景:给每个词都分配注意力权重,会使用context vecter与注意力权重作为decoder阶段的输入。(decoder每一时刻都有一个注意力权重)

结果:LSTM+Attention可以优化context vecter表意弱,long-term dependency问题,但句子超长时还是无法完全解决的。

毕竟时序模型,就需要BPTT,就需要考虑梯度消失问题!于是乎,Transformer诞生了!

 

二、self-Attention=自注意力在encoder阶段就采取注意力机制

♥ Transformer

 


Transformer是什么?transformer介绍

答:Transformer是非时序模型,但可以处理时序数据任务!它是一个基于self-attention的模型。

先甩出几个结论吧!

【优点】

1.使用自注意力机制,解决当前词在句中含义和与其他词的相关性,不会因为距离远而捕获不到(不会梯度消失)【天涯若比邻】

2.同时使用上下文信息来计算当前词

3.计算速度快:可并行计算,很快收敛

 

一览结构图吧!

Add&Norm:简单的层归一化+残差网络的结合 ,防止梯度消失!

Feed Forward:前馈神经网络,提供非线性变换。

 

transformer中的self-attention?

答:目的就是为了更好得表示当前词在整个句子(上下文)中的语义,所以在encoder和decoder中都加入了self-attention机制更佳挖掘词在句中含义。

self-attention计算过程?

self-attention有3个参数:Q,K,V三个矩阵。每个词的Embedding分别与QKV相乘得到qkv。计算过程如下图

如上图,qk计算接softmax得到注意力权重系数与v相乘=z

我们说过时序模型RNN/LSTM会随着输入信息的越多,随着距离的拉远,当前包含前面输入信息就越来越少;

而transformer不存在,因为它横向计算当前词与所有词的相似度(利用词向量的点积来估算词与词之间的相似度)

什么是multi-head attention(多头注意力)?

答:上面讲了一个attention就一组QKV参数,multi-head就是有n*(QKV),输出n*(z),然后将n个z concate一下再*wo,再输入到feed forward中。

为什么需要引入multi-head attention?

答:1.它拓展了模型关注不同位置的能力。

2.它为attention层提供了多个“representation subspaces”。(表意空间)

transformer输入是什么?

答:token embedding+position embedding

为什么要position embedding?怎么的来的?

答:tranformer不是时序模型,所以要处理时序类数据任务,必然需要在输入中添加上位置信息。

位置编码可以通过学习得到,也可以通过设置一个跟位置或者时序相关的函数得到,比如设置一个正弦或者余弦函数。

encoder层与decoder层中的attention有什么区别?

答:看模型图可以看出,decoder中的attention叫:masked multi-head attention。

encoder层重点在于理解词在整句中的含义,所有需要与每个词向量进行点积,所有是完整自注意力;

而decoder层重点在于依赖encoder输出+decoder前一时刻的词来预测下一个词,所以不能看到下文信息的,所以attention应该做masked处理。

什么是masked?

答:mask在深度学习领域有2种作用

1.Padding-mask:应对padding补齐句子长度添加的0,但又不能影响模型计算,用mask矩阵0/1告诉模型pad矩阵对应位置是否参与计算。

2.Seqence-mask:两种作用:1)隐藏掉下文信息,对角线矩阵;2)随机隐藏掉词达到添加噪音效果

tranformer模型中decoder层使用的masked是为了隐藏掉下文信息。

 

tranformer存在问题?

答:

【计算量大,存储空间损耗】因为input的词,两两之间都需要计算QKV;假如8头注意力模型,输入10000个词的长文章,那么需要计算108*8,float型=800M空间

于是乎,有了transformer XL (解决Transformer对于长文档NLP应用不够友好的问题)

 

tranformer XL核心思路?

答:将文章分段(segment)进行多个encoder层并将encoder之间横向加入RNN连接,这样解决block之间的词相关,并且也对input中的position embedding进行了改在,从abusolute position embedding-->relate position embedding.

 


Unsupervised pretraining?

答:无监督预训练,好火

1.Word Embedding(词向量)-->skipgram、Glove

2.Contextualized Word embedding(上下文中词含义)-->ElMo、BERT、XLNet

 

什么是ELMo?

Embedding from Language Model

之前讲过词向量word2vecter,这是预训练好的,静态的,最大的问题是无法解决一词多义的问题;所以需要一个模型在读取每一句话时都能get各词的含义。

于是就有了ELMo模型

1.使用的是双层Bi+LSTM来encoder进行预训练  (双层加权平均得到embedding)

2.上下文无关的static向量变成上下文相关的dynamic向量,比如苹果在不同语境vector不同。

ELMo存在的问题?

答:1.不是真正的双向

2.毕竟时序模型,计算慢,无法并行计算

3.存在梯度消失,long-term dependency问题

4.see itsself,自己看到自己问题

 

语言模型相关?

答:比如通过N-Gram或者RNN/LSTM生成的一个语言模型,它可以用来:生成句子,句子分类等任务。

But常规生成语言模型的方法存在2个问题:

用的都是时序模型,存在时序模型通用痛点:无法捕获长距离信息;使用了Bi+LSTM也会出现“see itself”问题,不可同时参考上下文。

所以咱们的需求是:

如何通过上下文去学习出当前词的含义??(动态的)

方法一:于是乎,BERT惊艳问世!(创造非语言模型)

方法二:于是乎,XLNet诞生了~(改进语言模型)


了解BERT之前先说两句,mask?

答:AutoEncoder是一种无监督学习,降维模型,通过encoder层和decoder层将输入向量进行降维更好得表达源输入的含义。

而De-noisy AutoEncoder是升级版本,通过增加噪音来进行同类相似文本上的区分,其中核心就是x=x+Δx

这个称之为Masked language model

 

什么是MTL(Multi-Task Learning)?为什么需要MTL?

答:数据决定了上限,而模型和算法只是无限逼近这个上限

有监督的模型效果好,但是有标签的数据获取却非常难。

一种有效的解决方案是采用多任务学习(Multi Task Learning MLT)

一方面可以在数据标注较少的情况下利用其它相似任务的标注数据,

另一方面可以降低针对特定任务的过拟合,起到正则化l的作用。


什么是BERT?

答:BERT=Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder

BERT是预训练+微调的一整套解决方案

两大特点?

答:1.【一个框架】使用Transformer的Encoder作为主要框架,自注意力机制能更彻底的捕获上下文的信息

2.【两个任务】使用了Mask Language Model(MLM)  和 Next Sentence Prediction(NSP) 的多任务训练目标

BERT结构图?

BERT分2种版本:BERT(base版)=12层tranformer,BERT(large版)=24层tranformer

BERT输入是什么?

token embedding + position embedding + segment embedding

input首位需要添加[cls],双句情况需要添加2个[SEP]来分隔!

[cls]可以理解用来占用符,后面输出时包含整句话的含义,单句时可以用来N分类,双句时可以用来二分类判断是否为前后句。

 

两个任务分别在做什么?

答:

任务一:【MLM】Mask Language Model

这个思想是从DAE(De-noisy AutoEcoder)借鉴过来的,mask就是“遮掩”的意思

就是随机mask掉部分词,通过上下文来预测中心词(有点CBOW的味道)

具体:在整句中,选15%进行mask处理,其中80%用[mask]替换,其中10%用其他词来混淆(从词库中选),其中10%不做改动(相当于自己看见自己进行预测)。

  • 80%:my dog is hairy -> my dog is [mask]
  • 10%:my dog is hairy -> my dog is apple
  • 10%:my dog is hairy -> my dog is hairy

(tip:因为序列长度太大(512)会影响训练速度,所以90%的steps都用seq_len=128训练,余下的10%步数训练512长度的输入)

任务二:【NSP】Next Sentence Prediction

如果是单句预测,那么输入单句(比如:情感分析,新闻分类等)

如果是双句预测,那么输入双句(比如:翻译,问答等)

所以增加了第二个预训练任务,目的是让模型理解两个句子之间的联系!

具体:输入时会有segment embedding来标识上下句关系,输出时会多一个vecter来标识上下句关系,只要随便接一个二分类即可完成任务训练。

总结起来就是BERT通过2个任务的预训练,2个loss之和作为模型的损失来进行优化训练的。

 

BERT如何改造下游任务?

答:有4种经典场景,分别是:句子关系、单句分类、阅读理解、序列标注

(场景一:情感分类,文章分类)

(场景二:词性标注,命名实体识别)

(场景三:翻译,答问)

(场景四:阅读理解)

 

 

如何finetune微调Bert?

答:官方给出两种方式:

1.使用BERT作为特征提取器,在其上层接入其他网络,在训练时只finetune上层网络参数。【finetune上层模型】
2.在BERT后直接入全连接层,训练时只finetune BERT模型参数。【finetune Bert模型】

论文结论:后者优于前者

But论文中没提出,同时训练上层模型+Bert模型效果如何?

答:存在困境~效果不好!

1.若使用小学习率:上层模型收敛慢,效果不好
2.若使用大学习率:严重破坏预训练好的bert结构

实际工作中会使用方式?

答:

step1、先固定bert参数训练上层模型,直到收敛【finetune上层模型】
step2、再同时训练bert参数和上层模型,达到最佳精度【finetune Bert模型+上层模型】

这种容易导致过拟合!

所以改进成:

step1、使用bert+全连接层,finetune bert参数【finetune Bert模型】
step2、使用bert+上层模型,固定住bert参数,finetune上层模型【finetune上层模型】
step3、使用bert+上层模型,同时finetune bert+上层模型【finetune Bert模型+上层模型】

 

使用bert的3个小技巧?
答:
1.early stopping,然后使用更大batch-size或者使用组合式loss继续进行训练
(分类举例:loss=focal loss+cross entropy loss+hinge loss)

2.先使用multitask training,在对目标任务单独训练

3.bert层使用小学习率,上层使用大学习率

 

BERT优缺点?

答:

缺点:

1.【训练集和测试集不一致】在训练时会进行mask标记,但预测时是不存在mask这种标记的,所以存在一定误差。

2.【条件并非独立】在训练时会进行mask标记,bert假如被mask掉的词集中相互独立预测,可是实际上很有可能被mask掉的两词存在关联关系

3.【中文mask不好】中文句子中只能mask掉,这样不佳,应该以来进行mask

4.不是生成模型,不能用于生成

5.mask15%的词导致收敛较慢

 

ERNIE是什么?

答:可以简单理解为中文版bert,更为强大!

ERNIE模型在BERT的基础上,加入了海量语料中的实体、短语等先验语义知识,建模真实世界的语义关系

mask任务,在中文句子中只能mask掉,这样不佳,应该以来进行mask,可是bert做不到,于是有了ERNIE!

ERNIE 2.0模型在英语任务上几乎全面优于BERT和XLNet;中文任务上,ERNIE 2.0模型在所有 9 个中文 NLP 任务上全面优于BERT。


XLNet是什么?XLNet

答:XLNet是一个预训练+微调的解决方案,主要理论创新点就是Permutation LM(排列语言模型)

XLNet是核心思路的?
答:
自回归语言模型【Autoregressive LM】:ELMo
存在问题:不是真的双向,无法同时获取单词的上下文信息

自编码语言模型【Autoencoder LM】:Bert
存在问题:1.在Finetune阶段,模型是看不到[mask]标记的,带来一定误差  2.不是生成模型

想解决以上问题,将两者完美结合,于是想出了XLNet

XLNet的思路采用的是自回归语言模型,根据上文来预测下一个单词,但是在上文中添加了下文信息,这样就既解决了[mask]带来的两阶段不一致问题和无法同时引入上下文信息的问题。

思想:
通过将句中词进行随机排列组合,然后随机采样其中的排列组合进行训练。

实际做法:
并不是进行重新排序然后输入,而是正常input,在transformer的内部,通过Attention Mask,把其它没有被选到的单词Mask掉,不让它们在预测单词Ti的时候发生作用。如此而已。看着就类似于把这些被选中的单词放到了上文Context_before的位置了。

我们把这种做法称之为:“双流自注意力模型

双流自注意力?Two-stream Attention

答:

【Content Stream内容流】标准的Transformer的计算过程

【Query Stream查询流】Bert做法是mask掉词,而XLNet是忽略词的token embedding,只保留词的位置信息。

(其实就是用来代替Bert的那个[Mask]标记的,因为XLNet希望抛掉[Mask]标记符号,但是比如知道上文单词x1,x2,要预测单词x3,此时在x3对应位置的Transformer最高层去预测这个单词,但是输入侧不能看到要预测的单词x3,Bert其实是直接引入[Mask]标记来覆盖掉单词x3的内容的,等于说[Mask]是个通用的占位符号。而XLNet因为要抛掉[Mask]标记,但是又不能看到x3的输入,于是Query流,就直接忽略掉x3输入了,只保留这个位置信息,用参数w来代表位置的embedding编码。其实XLNet只是扔了表面的[Mask]占位符号,内部还是引入Query流来忽略掉被Mask的这个单词。和Bert比,只是实现方式不同而已)

 

XLNet思想?

答:XLNet引入了三“家”思想

1.【PLM】

与Bert采取De-noising Autoencoder方式不同的新的预训练目标:Permutation Language Model(简称PLM);这个可以理解为在自回归LM模式下,如何采取具体手段,来融入双向语言模型。这个是XLNet在模型角度比较大的贡献,确实也打开了NLP中两阶段模式潮流的一个新思路。

2.【Transformer XL】

引入了Transformer-XL的主要思路:相对位置编码以及分段RNN机制。实践已经证明这两点对于长文档任务是很有帮助的;

3.【GPT2.0】

加大增加了预训练阶段使用的数据规模;Bert使用的预训练数据是BooksCorpus和英文Wiki数据,大小13G。XLNet除了使用这些数据外,另外引入了Giga5,ClueWeb以及Common Crawl数据,并排掉了其中的一些低质量数据,大小分别是16G,19G和78G。可以看出,在预训练阶段极大扩充了数据规模,并对质量进行了筛选过滤。这个明显走的是GPT2.0的路线。

 

XLNet优秀场景?

答:

1.XLNet对于长文档NLP任务相比Bert应该有直接且比较明显的性能提升作用!

2.XLNet在生成类NLP任务上是一块优势领域!


各模型参数比较?

答:

ELMo(94M)
BERT(340M)
GPT(1542M)

2

发表评论

电子邮件地址不会被公开。 必填项已用*标注

微信扫一扫

微信扫一扫

微信扫一扫,分享到朋友圈

最新模型架构整理
嘿!有什么能帮到您的吗?
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close