LSTM 里面:遗忘门f_t,记忆门i_t,输出门o_t 输入:上一个细胞隐藏层状态:h_t-1,本时刻输入参数 细胞状态:c_t,临时细胞状态
bilstm里面:两层LSTM输入和输出信息的关系。
1 什么是LSTM和BiLSTM?
LSTM的全称是Long Short-Term Memory,它是RNN(Recurrent Neural Network)的一种。LSTM由于其设计的特点,非常适合用于对时序数据的建模,如文本数据。BiLSTM是Bi-directional Long Short-Term Memory的缩写,是由前向LSTM与后向LSTM组合而成。两者在自然语言处理任务中都常被用来建模上下文信息。
2 为什么使用LSTM与BiLSTM?
将词的表示组合成句子的表示,可以采用相加的方法,即将所有词的表示进行加和,或者取平均等方法,但是这些方法没有考虑到词语在句子中前后顺序。如句子“我不觉得他好”。“不”字是对后面“好”的否定,即该句子的情感极性是贬义。使用LSTM模型可以更好的捕捉到较长距离的依赖关系。因为LSTM通过训练过程可以学到记忆哪些信息和遗忘哪些信息。
但是利用LSTM对句子进行建模还存在一个问题:无法编码从后到前的信息。在更细粒度的分类时,如对于强程度的褒义、弱程度的褒义、中性、弱程度的贬义、强程度的贬义的五分类任务需要注意情感词、程度词、否定词之间的交互。举一个例子,“这个餐厅脏得不行,没有隔壁好”,这里的“不行”是对“脏”的程度的一种修饰,通过BiLSTM可以更好的捕捉双向的语义依赖。
主要分为两部分:CBOW和G-gram 一个是从一个词预测其周围的词,另一个是从周围的词预测中心词。
特点:要对每一个词都进行了预测、
缺点:词向量是固定的,不能解决词义消歧问题。
2.1 总体框架
总体框架如图1所示。
图1. LSTM总体框架
2.2 详细介绍计算过程
计算遗忘门,选择要遗忘的信息。
图2. 计算遗忘门
计算记忆门,选择要记忆的信息。
图3. 计算记忆门和临时细胞状态
计算当前时刻细胞状态
图4. 计算当前时刻细胞状态
计算输出门和当前时刻隐层状态
图5. 计算输出门和当前时刻隐层状态
最终,我们可以得到与句子长度相同的隐层状态序列
###补充:
C线的作用:?
1.确定了究竟记忆多少,遗忘多少? 2.由于加法的存在,避免了梯度消失和梯度爆炸。
2.3 GRU:在LSTM的基础上又做了进一步的修改
GRU和LSTM的区别:
GRU参数少,训练速度快。 LSTM训练参数多,可能对句子的理解更深刻。(但实际两者差不多)
前向的LSTM与后向的LSTM结合成BiLSTM。比如,我们对“我爱中国”这句话进行编码,模型如图6所示。
图6. 双向LSTM编码句子
对于情感分类任务来说,我们采用的句子的表示往往是。因为其包含了前向与后向的所有信息,如图7所示。
图7. 拼接向量用于情感分类
应用于NER中的biLSTM-CRF模型主要由Embedding层(主要有词向量,字向量以及一些额外特征),双向LSTM层,以及最后的CRF层构成。实验结果表明biLSTM-CRF已经达到或者超过了基于丰富特征的CRF模型,成为目前基于深度学习的NER方法中的最主流模型。在特征方面,该模型继承了深度学习方法的优势,无需特征工程,使用词向量以及字符向量就可以达到很好的效果,如果有高质量的词典特征,能够进一步获得提高。
bilstm 就是两串LSTM,一串从前向后,一串从后向前。从此图可以看出,对每一个输入的字embedding后的结果分别传递给了两串LSTM。两串LSTM运算的结果在通过一定的计算(求和或者求均值等等)得到复合的结果,会比LSTM效果更好。通过BiLSTM可以更好的捕捉双向的语义依赖。
受益点赞
参考:https://blog.csdn.net/miner_zhu/article/details/85761887
https://zhuanlan.zhihu.com/p/47802053
有所修改。
关于预训练模型,下面的都是,这种模型都包括预训练和微调两步
预训练可以大量的学习预料,一般是大厂做的,他们通过巨大的预料可训练模型中的局两份参数,训练好在之后,我们将其下载过来,根据不同的任务,输入我们的预料,并添加输出层。
可以选择freeze模型的所有参数,只训练输出层,也可以选择freeze部分参数,进行小幅调整。
举个例子,假设我们有大量的维基百科数据,那么我们可以用这部分巨大的数据来训练一个泛化能力很强的模型,当我们需要在特定场景使用时,例如做文本相似度计算,那么,只需要简单的修改一些输出层,再用我们自己的数据进行一个增量训练,对权重进行一个轻微的调整。
预训练的好处在于在特定场景使用时不需要用大量的语料来进行训练,节约时间效率高效,bert就是这样的一个泛化能力较强的预训练模型。
属于:自回归模型 AR
3.1 网络结构图:
其实也就是双层Bilstm。两层bilstm的前向层连在一起,反向层连在一起。底层lstm捕获到句法、语义方面信息,如POS,高层捕获到词义的上下文信息,如语义消歧。
一个蓝色圈,就是一个LSTM中的cell。
向量有:正反向LSTM中间向量、正反向结果向量和 静态向量。共2L+1个。L为层数,这里为2层
biLM每层学到的东西是不一样的,所以将他们叠加起来,对任务有较好的的提升。
3.2 目标函数
ELMo是分别以作为目标函数,独立训练处两个representation然后拼接起来。
3.3特点:动态的词向量
相对于Word2vec固定的词向量,无法解决一个多意,词义消歧问题。而Elmo是动态的词向量,其次想来那个的构成是这丫子
其中,α1、α2、α3是三个可变参数,可以选择固定不变,亦可以改变某一两个,也可以随着模型的训练都改变。
E1、E2、E3 分别指输入向量,中间层向量,和输出向量。其中,中间层向量和输出向量又分为前向和反向两种
3.3 任务:
3.3.1 词义消歧
第一层,第二层分别使用的结果显示,越高层,对语义理解越好,表示对词义消歧做的越好。这表明,越高层,越能捕获词意信息
3.3.2 词性标注
第一层效果好于第二层。表明,低层的更能学到词的句法信息和词性信息。
总体而言,biLM每层学到的东西是不一样的,所以将他们叠加起来,对任务有较好的的提升。
GPT模型参考了Elmo模型多层的结构,其有有两个特点,
第一:不同于ELMO和BERT,他是单向的
第二:他替换了ELMO模型中的LSTM结构,进而使用了transformer中的decoder结构,每一个蓝色的椭圆就是一层完整的decoder,包括decoder完整的三个结构。transformer中共有6层decoder。
GPT可以堆叠分多层decoder,没有固定的要求
训练的过程就是训练decoder层中的WQ、WK、WV矩阵参数。
属于:自自编码模型 AE
5.1 模型结构
和GPT类似,都是多个transformer结构组成的,但它和GPT仿佛对称,有两个特点:
第一:他是双向的结构,信息不但可以向后传递,也可以向前传递
第二:它是由transformer中的Encoder组成的,图中的每一个蓝色的椭圆圈就是一层完整的Encoder,里面包含完整的多头自注意和前向传播和残差连接以及层归一化等。
官方提供了两种模型,基础性包括12层Encoder,每一层最大长度限制位512(那么也就是一横排最多512个Encoder),每个Encoder有12个头,每个embedding是768维。共约1.1亿参数。large款也是限制最大输入词汇长度是512个,超过的选择性剪切掉。
5.2 BERT的预训练过程
相对于transformer,bert的训练过程主要多了三块 5.2.1-5.2.3
5.2.0 目标函数
对比ELMo,虽然都是“双向”,但目标函数其实是不同的,ELMo是分别以作为目标函数,独立训练处两个representation然后拼接起来。而Bert以作为训练目标函数,训练LM
接下来我们看看BERT的预训练过程,BERT的预训练阶段包括两个任务,一个是Masked Language Model,还有一个是Next Sentence Prediction。
5.2.1 Masked Language Model
MLM可以理解为完形填空,作者会随机mask每一个句子中15%的词,用其上下文来做预测,例如:
此处将hairy进行了mask处理,然后采用非监督学习的方法预测mask位置的词是什么,但是该方法有一个问题,因为是mask15%的词,其数量已经很高了,这样就会导致某些词在fine-tuning阶段从未见过,为了解决这个问题,作者做了如下的处理:
-
80%的时间是采用[mask],my dog is hairy → my dog is [MASK]
-
10%的时间是随机取一个词来代替mask的词,my dog is hairy -> my dog is apple
-
10%的时间保持不变,my dog is hairy -> my dog is hairy
那么为啥要以一定的概率使用随机词呢?这是因为transformer要保持对每个输入token分布式的表征,否则Transformer很可能会记住这个[MASK]就是"hairy"。至于使用随机词带来的负面影响,文章中解释说,所有其他的token(即非"hairy"的token)共享15%*10% = 1.5%的概率,其影响是可以忽略不计的。Transformer全局的可视,又增加了信息的获取,但是不让模型获取全量信息。 注意:
- 有参数dupe_factor决定数据duplicate的次数。
- 其中,create_instance_from_document函数,是构造了一个sentence-pair的样本。对每一句,先生成[CLS]+A+[SEP]+B+[SEP],有长(0.9)有短(0.1),再加上mask,然后做成样本类object。
- create_masked_lm_predictions函数返回的tokens是已经被遮挡词替换之后的tokens,从而提高了获取句子级信息的能力
- masked_lm_labels则是遮挡词对应位置真实的label。
5.2.2 Next Sentence Prediction 就是判断下一个句子是不是前一个句子的下一句。
选择一些句子对A与B,其中50%的数据B是A的下一条句子,剩余50%的数据B是语料库中随机选择的,学习其中的相关性,添加这样的预训练的目的是目前很多NLP的任务比如QA和NLI都需要理解两个句子之间的关系,从而能让预训练的模型更好的适应这样的任务。 个人理解:
-
Bert先是用Mask来提高视野范围的信息获取量,增加duplicate再随机Mask,这样跟RNN类方法依次训练预测没什么区别了除了mask不同位置外;
-
全局视野极大地降低了学习的难度,然后再用A+B/C来作为样本,这样每条样本都有50%的概率看到一半左右的噪声;
-
但直接学习Mask A+B/C是没法学习的,因为不知道哪些是噪声,所以又加上next_sentence预测任务,与MLM同时进行训练,这样用next来辅助模型对噪声/非噪声的辨识,用MLM来完成语义的大部分的学习。
5.2.3 Word embedding
bert的输入可以是单一的一个句子或者是句子对,实际的输入值是segment embedding与position embedding相加,具体的操作流程可参考上面的transformer讲解。、
BERT的输入词向量是三个向量之和:
Token Embeddin:768维:这不是特征向量,而是被随机映射到了一个768维空间中的向量,参数随机 Segment Embedding:768维:表明这个词属于哪个句子(NSP需要两个句子),前一个句子是E_A,后一个是E_B。 Position Embedding:768维:学习出来的embedding向量。这与Transformer不同,Transformer中是预先设定好的值。
这三个768维度的向量都是随机给的,随着模型不断更新调整的。
CLS:是除了句子之外另加了一个符号,他可以用来获取整个句子的特征信息。因此对于句子分类,句子填空等问题,可以直接拿输出的CLS符号进行分类任务等。 其中,CLS放在第一位是为了最后回去方便,他可以放在任意位置,因为transformer中每一个位置的词都可以attention到整个句子的信息。
SEP:就是分句符号,用于表示句子的结束。
Wordpiece:对于英文,采用了WordPiece策略,因此可以用较少的vocab,就可以组成更多的词。
5.3 总结
BERT的去除实验表明,双向LM和NSP带了的提升最大。
BERT预训练模型的输出结果,无非就是一个或多个向量。下游任务可以通过精调(改变预训练模型参数)或者特征抽取(不改变预训练模型参数,只是把预训练模型的输出作为特征输入到下游任务)两种方式进行使用。BERT原论文使用了精调方式,但也尝试了特征抽取方式的效果,比如在NER任务上,最好的特征抽取方式只比精调差一点点。但特征抽取方式的好处可以预先计算好所需的向量,存下来就可重复使用,极大提升下游任务模型训练的速度。 后来也有其他人针对ELMo和BERT比较了这两种使用方式的精度差异。下面列出基本结论:
5.3.2 总结下BERT的主要贡献:
- 引入了Masked LM,使用双向LM做模型预训练。LM 是language module的意思
- 为预训练引入了新目标NSP,它可以学习句子与句子间的关系。
- 进一步验证了更大的模型效果更好: 12 --> 24 层。
- 为下游任务引入了很通用的求解框架,不再为任务做模型定制。
- 刷新了多项NLP任务的记录,引爆了NLP无监督预训练技术。
BERT是谷歌团队糅合目前已有的NLP知识集大成者,刷新11条赛道彰显了无与伦比的实力,且极容易被用于多种NLP任务。宛若一束烟花点亮在所有NLP从业者心中。更为可贵的是谷歌选择了开源这些,让所有从业者看到了在各行各业落地的更多可能性。
5.3.3 BERT优点
-
Transformer Encoder因为有Self-attention机制,因此BERT自带双向功能
-
因为双向功能以及多层Self-attention机制的影响,使得BERT必须使用Cloze版的语言模型Masked-LM来完成token级别的预训练
-
为了获取比词更高级别的句子级别的语义表征,BERT加入了Next Sentence Prediction来和Masked-LM一起做联合训练
-
为了适配多任务下的迁移学习,BERT设计了更通用的输入层和输出层
-
微调成本小
5.3.4 BERT缺点
-
task1的随机遮挡策略略显粗犷,推荐阅读《Data Nosing As Smoothing In Neural Network Language Models》
-
[MASK]标记在实际预测中不会出现,训练时用过多[MASK]影响模型表现;
-
每个batch只有15%的token被预测,所以BERT收敛得比left-to-right模型要慢(它们会预测每个token)
-
BERT对硬件资源的消耗巨大(大模型需要16个tpu,历时四天;更大的模型需要64个tpu,历时四天。
关于BERT最新的各领域应用推荐张俊林的Bert时代的创新(应用篇)
5.3.5 思考
-
个人并不认为文章是模型的改进,更认可为任务的设计改进。
-
论文作者只比较了有没有task1的影响,并没有针对task2对比试验。提升是否来自好的预训练任务设计没有明说。
-
bert对nlp领域目前已有知识的有效“整合”,在硬件配置足够的情况下能提高nlp多领域性能
5.3.6 BERT适用场景
第一,如果NLP任务偏向在语言本身中就包含答案,而不特别依赖文本外的其它特征,往往应用Bert能够极大提升应用效果。典型的任务比如QA和阅读理解,正确答案更偏向对语言的理解程度,理解能力越强,解决得越好,不太依赖语言之外的一些判断因素,所以效果提升就特别明显。反过来说,对于某些任务,除了文本类特征外,其它特征也很关键,比如搜索的用户行为/链接分析/内容质量等也非常重要,所以Bert的优势可能就不太容易发挥出来。再比如,推荐系统也是类似的道理,Bert可能只能对于文本内容编码有帮助,其它的用户行为类特征,不太容易融入Bert中。
第二,Bert特别适合解决句子或者段落的匹配类任务。就是说,Bert特别适合用来解决判断句子关系类问题,这是相对单文本分类任务和序列标注等其它典型NLP任务来说的,很多实验结果表明了这一点。而其中的原因,我觉得很可能主要有两个,一个原因是:很可能是因为Bert在预训练阶段增加了Next Sentence Prediction任务,所以能够在预训练阶段学会一些句间关系的知识,而如果下游任务正好涉及到句间关系判断,就特别吻合Bert本身的长处,于是效果就特别明显。第二个可能的原因是:因为Self Attention机制自带句子A中单词和句子B中任意单词的Attention效果,而这种细粒度的匹配对于句子匹配类的任务尤其重要,所以Transformer的本质特性也决定了它特别适合解决这类任务。
从上面这个Bert的擅长处理句间关系类任务的特性,我们可以继续推理出以下观点:
既然预训练阶段增加了Next Sentence Prediction任务,就能对下游类似性质任务有较好促进作用,那么是否可以继续在预训练阶段加入其它的新的辅助任务?而这个辅助任务如果具备一定通用性,可能会对一类的下游任务效果有直接促进作用。这也是一个很有意思的探索方向,当然,这种方向因为要动Bert的第一个预训练阶段,所以属于NLP届土豪们的工作范畴,穷人们还是散退、旁观、鼓掌、叫好为妙。
第三,Bert的适用场景,与NLP任务对深层语义特征的需求程度有关。感觉越是需要深层语义特征的任务,越适合利用Bert来解决;而对有些NLP任务来说,浅层的特征即可解决问题,典型的浅层特征性任务比如分词,POS词性标注,NER,文本分类等任务,这种类型的任务,只需要较短的上下文,以及浅层的非语义的特征,貌似就可以较好地解决问题,所以Bert能够发挥作用的余地就不太大,有点杀鸡用牛刀,有力使不出来的感觉。
这很可能是因为Transformer层深比较深,所以可以逐层捕获不同层级不同深度的特征。于是,对于需要语义特征的问题和任务,Bert这种深度捕获各种特征的能力越容易发挥出来,而浅层的任务,比如分词/文本分类这种任务,也许传统方法就能解决得比较好,因为任务特性决定了,要解决好它,不太需要深层特征。
第四,Bert比较适合解决输入长度不太长的NLP任务,而输入比较长的任务,典型的比如文档级别的任务,Bert解决起来可能就不太好。主要原因在于:Transformer的self attention机制因为要对任意两个单词做attention计算,所以时间复杂度是n平方,n是输入的长度。如果输入长度比较长,Transformer的训练和推理速度掉得比较厉害,于是,这点约束了Bert的输入长度不能太长。所以对于输入长一些的文档级别的任务,Bert就不容易解决好。结论是:Bert更适合解决句子级别或者段落级别的NLP任务。
转自:https://blog.csdn.net/jiaowoshouzi/article/details/89073944
elmo:将上下文当作特征,但是无监督的语料和我们真实的语料还是有区别的,不一定的符合我们特定的任务,是一种双向的特征提取。
openai gpt就做了一个改进,也是通过transformer学习出来一个语言模型,不是固定的,通过任务 finetuning,用transfomer代替elmo的lstm。 openai gpt其实就是缺少了encoder的transformer。当然也没了encoder与decoder之间的attention。 openAI gpt虽然可以进行fine-tuning,但是有些特殊任务与pretraining输入有出入,单个句子与两个句子不一致的情况,很难解决,还有就是decoder只能看到前面的信息。其次bert在多方面的nlp任务变现来看效果都较好,具备较强的泛化能力,对于特定的任务只需要添加一个输出层来进行fine-tuning即可。
相对于GPT来说,BERT是双向结构的,而GPT是单向的。
以上就是本篇文章【LSTM、Bilstm、ELMo、openAI GPT、Bert模型简介】的全部内容了,欢迎阅览 ! 文章地址:http://sicmodule.glev.cn/quote/469.html 行业 资讯 企业新闻 行情 企业黄页 同类资讯 网站地图 返回首页 歌乐夫资讯移动站 http://sicmodule.glev.cn/mobile/ , 查看更多