transformer_bert学习
一、参考资料
(1)github代码
(2)详解transformer
https://zhuanlan.zhihu.com/p/48508221
https://jalammar.github.io/illustrated-transformer/
(3)transformer位置向量是什么
https://zhuanlan.zhihu.com/p/338592312
(4)nlp中的mask
https://zhuanlan.zhihu.com/p/139595546
(5)美团年货
(6)一些问题
https://zhuanlan.zhihu.com/p/149634836
二、复述
transformer模型结构,multi-head attention、mask、positional-embedding?
transformer怎么训练的?
transformer应用?
transformer优缺点?
transformer中输入为enc_inputs,dec_inputs。用它来训练,outputs是与target_batch做比较的。训练好之后用得时候dec_inputs是什么?
bert同理
(一)transformer一些问题
1.为什么除以根号k
论文中解释是:向量的点积结果会很大,将softmax函数push到梯度很小的区域,scaled会缓解这种现象。
在输入的数量级很大时,梯度消失为0,造成参数更新困难。
假设向量 和 的各个分量是互相独立的随机变量,均值是0,方差是1,那么点积 的均值是0,方差是
2.为什么使用multi-head
每个头关注不同方面的信息,使得语义表征能力更强
3.为什么是layer-norm/batch-normalization
什么是bn
Batch Normalization,简称BatchNorm或BN,翻译为“批归一化”,是神经网络中一种特殊的层,如今已是各种流行网络的标配。
如果batch size为<span class="MathJax_Preview"><span id="MathJax-Element-11-Frame" class="MathJax" data-mathml="<math xmlns="http://www.w3.org/1998/Math/MathML"><mi>m</mi></math>"><span id="MathJax-Span-71" class="math"><span id="MathJax-Span-72" class="mrow"><span id="MathJax-Span-73" class="mi">mm,则在前向传播过程中,网络中每个节点都有<span class="MathJax_Preview"><span id="MathJax-Element-12-Frame" class="MathJax" data-mathml="<math xmlns="http://www.w3.org/1998/Math/MathML"><mi>m</mi></math>"><span id="MathJax-Span-74" class="math"><span id="MathJax-Span-75" class="mrow"><span id="MathJax-Span-76" class="mi">mm个输出,所谓的Batch Normalization,就是对该层每个节点的这<span class="MathJax_Preview"><span id="MathJax-Element-13-Frame" class="MathJax" data-mathml="<math xmlns="http://www.w3.org/1998/Math/MathML"><mi>m</mi></math>"><span id="MathJax-Span-77" class="math"><span id="MathJax-Span-78" class="mrow"><span id="MathJax-Span-79" class="mi">mm个输出进行归一化再输出。减去均值除以方差
什么是ln
4.bert中CLS标记
更“公平”地融合文本中各个词的语义信息,从而更好的表示整句话的语义。这个token对应的向量后续会用在分类任务上;如果是句子对的任务,那么两个句子间使用特定的token“[seq]”来分割。
5.transformer中decoder部分初始输入是什么
6.decoder部分self-attention/encoder-decoder-attention中qkv分别是什么
三、transformer笔记
(一)简介
Transformer是谷歌提出来解决Sequence to Sequence(Seq2Seq)问题的模型,本质是一个编码-解码结构(Encoder-Decoder),
编码器Encoder由6个编码Block组成,Encoder中的每个block包含Multi-head Attention和FFN(Feed-Forward Network)
同样解码器Decoder也是6个解码block组成,每个block包含Multi-Head Attention、Encoder-Decoder Attention和FFN
(二)结构重点详解
(0)embedding
a.encoder的embedding
是src_embedding+pos_embedding
src_embedding矩阵的行数为src_vocab_size,列数为d_model。src_emb = nn.Embedding(src_vocab_size, d_model)
pos_embedding矩阵的行数为tgt_len+1,列数为d_model。pos_emb = nn.Embedding.from_pretrained(get_sinusoid_encoding_table(src_len+1, d_model),freeze=True),事先定义好的。
b.decoder部分的embedding
是tgt_embedding+pos_embedding
(1)Multi-head Attention
Multi-Head Attention实际上是h个self-attention的集成,h代表头的个数
(进encoder和decoderblock前先算好了mask,只用到enc_inputs,dec_inputs)
a.encoder部分的attention,Q是enc_inputs、K是enc_inputs、V是enc_inputs,mask是对输入pad位的mask表示enc_inputs中的每个token对pad位施加的注意力为0
b.decoder部分的attention,Q是dec_inputs,K是dec_inputs,V是dec_inputs,mask是对输出pad位的mask以及避免信息泄露对token后面位置的mask
c.decoder-encoder部分的mask,Q是dec_outputs,K是enc_outputs,V是enc_outputs,mask是对输入中pad位的mask
(2)FFN
point-wise feed-forward networks,该模块是为了提高模型的非线性能力提出来的,它就是全连接神经网络。
Transformer Layer就是通过这种自注意力机制层和普通非线性层实现对输入信号的编码,得到信号的表示
(三)损失函数
为:nn.CrossEntropyLoss
将模型的输出又映射为词袋,projection = nn.Linear(d_model, tgt_vocab_size, bias=False),
最终输出的size为dec_logits : [batch_size x src_vocab_size x tgt_vocab_size]
四、bert笔记
(一)综述
bert是一个预训练模型。BERT(bidirectional encoder representation from transformer)是基于transformer的深度双向语言表征模型,本质上是利用Transformer结构构成一个多层双向的Encoder网络。
(二)模型结构
输入表示:针对不同的任务,bert 模型的输入可以是单句或者句对,对于每一个输入的token。它的表征由其对应的词表征(Token Embedding)、段表征(Segment Embedding)和位置表征(Position Embedding)相加而成
预训练目标:bert预训练过程包含两个不同的预训练任务,分别是Masked Language Model和Next Sentence Prediction
MLM:随机掩盖一些词(80%替换成<MASK>、10%随机替换为其他词,10%保留原词),然后预测这些被遮盖的词来训练双向语言模型,并且使每个词的表征参考上下文信息
NSP: 从语料库中抽取句子对,包括两个句子A和B来进行生成,其中50%的概率B是A的下一个句子,50%的概率B是语料中的一个随机句子。
NSP任务预测B是否是A的下一句,NSP 的目的是获取句子间的信息,这点是语言模型无法直接捕捉的
(三)模型轻量化方法
1.低精度化.在模型训练和推理中使用低精度(float16甚至int8)表示取代原有精度(float32)
2.模型裁剪和剪枝.减少模型层数和参数规模
3.模型蒸馏.通过知识蒸馏方法基于原始bert模型蒸馏出符合上线要求的小模型
(四)bert应用
基于训练好的BERT模型可以支持多种下游NLP任务,BERT 在下游任务中的应用方式主要有两种
(1)feature-based:将BERT作为文本编码器获取文本表征向量,从而完成文本相似度计算,向量召回
(2)在预训练模型的基础上,使用具体任务的部分训练数据进行训练,从而针对性地修正预训练阶段获得的网络参数
基于bert模型微调可以支持的任务类型,包括句对分类、单句分类、问答和序列标注任务
1.句对分类任务和单句分类任务是句子级别的任务.预训练中的NSP任务使得BERT中<CLS>位置的输出包括整个句子对(句子)的信息,我们利用其在有标注的数据上微调模型
给出预测结果。单句分类:细粒度情感分析,query意图分类,序列标注
2.问答和序列标注属于词级别的任务.预训练中的MLM任务使得每个Token位置的输出都包含了丰富的上下文语境以及token本身的信息,我们对BERT中的每个Token的输出都做
一次分类,在有标注的数据上微调模型并给出预测
五、预训练
预训练语言模型的发展
2013word2vec-2018ELMO-2018GPT-2018BERT-2019ALBERT
NLP研究新范式:使用大量无监督语料进行语言模型预训练,再使用少量标注语料进行微调来完成具体NLP任务
使用深度神经网络进行NLP模型训练时,首先需要将待处理文本转为词向量作为神经网络的输入,词向量的效果会影响到最后模型效果。
词向量的效果主要取决于训练语料的大小,很多NLP任务中有限的标注语料不足以训练出足够好的词向量,通常使用跟当前任务无关的大规模
未标注语料进行词向量预训练,预训练的另外一个好处是能增强模型的泛华能力。
预训练语言模型用到下游目标任务中有两种方式。
1.Feature-based,使用预训练语言模型的词向量作为特征输入到下游目标任务中,如word2vec、ELMO
2.微调fine-tuning,直接在深层Transformer网络上进行语言模型训练,收敛后针对下游目标任务进行微调