本文概览:
Autoregressive语言模型:指的是依据前面(或后面)出现的单词来预测当前时刻的单词,代表有 ELMo, GPT等。
Autoencoder语言模型:通过上下文信息来预测被mask的单词,代表有 BERT , Word2Vec(CBOW) 。
Autoregressive语言模型:
Autoencoder语言模型:
如下图所示,AutoEncoder框架包含两大模块:编码过程和解码过程。通过 将输入样本 映射到特征空间 ,即编码过程;然后再通过 将抽象特征 映射回原始空间得到重构样本 ,即解码过程。优化目标则是通过最小化重构误差来同时优化encoder和decoder,从而学习得到针对输入样本 的抽象特征表示 。
这里我们可以看到,AutoEncoder在优化过程中无需使用样本的label,本质上是把样本的输入同时作为神经网络的输入和输出,通过最小化重构误差希望学习到样本的抽象特征表示 。这种无监督的优化方式大大提升了模型的通用性。
对于基于神经网络的AutoEncoder模型来说,则是encoder部分通过逐层降低神经元个数来对数据进行压缩;decoder部分基于数据的抽象表示逐层提升神经元数量,最终实现对输入样本的重构。
这里值得注意的是,由于AutoEncoder通过神经网络来学习每个样本的唯一抽象表示,这会带来一个问题:当神经网络的参数复杂到一定程度时AutoEncoder很容易存在过拟合的风险。
为了缓解经典AutoEncoder容易过拟合的问题,一个办法是在输入中加入随机噪声,Vincent等人提出了Denoising AutoEncoder,即在传统AutoEncoder输入层加入随机噪声来增强模型的鲁棒性;另一个办法就是结合正则化思想,Rifai等人提出了Contractive AutoEncoder,通过在AutoEncoder目标函数中加上encoder的Jacobian矩阵范式来约束使得encoder能够学到具有抗干扰的抽象特征。
下图是Denoising AutoEncoder的模型框架。目前添加噪声的方式大多分为两种:
DAE模型的优势:
推荐阅读论文:
【1】Extracting and composing robust features with denoising autoencoders, Pascal Vincent etc, 2008.
【2】Contractive auto-encoders: Explicit invariance during feature extraction, Rifai S etc, 2011.
Transformer模型使用经典的encoder-decoder架构,由encoder和decoder两部分组成。
输入是原始词表中词的。接着进行Input Embedding,把词转换成分布式的表示。在语言模型中词的顺序还是很重要的,因此Transformer加入了Positional Encoding,也就是加入了词的位置信息。encoder的输入是Input Embedding 加上对应位置的Positional Encoding。
Input Embedding 加上对应位置的Positional Encoding作为encoder的输入,首先会经过Multi-Head Attention,学习输入中词与词之间的相关性。接着是Add & Norm层,Add残差的方式对不同的输出相加,是借鉴CV中的残差网络思想解决梯度消失问题;Norm用的是Layer Norm。然后进行Feed Forward的前向计算,这一层就是全连接的神经网络。最后再接一层Add & Norm,防止梯度消失。
通过encoder部分已经获得了所有输入的信息,把这些信息当作decoder后面Multi-Head Attention的输入,也就是self-attention中的、来自encoder部分输出的特征,来自decoder部分的输入。
decoder之前解码出的单词当作本次decoder的输入,也是通过Output Embedding 加上对应位置的Positional Encoding输入到Masked Multi-Head Attention,再经过Add & Norm层,这里还把decoder输入和Masked Multi-Head Attention输出做了残差连接,最后得到的输出就是我们上面提到的了。
把encoder部分获得的所有输入的信息和decoder前半部分得到的输入信息,一同送到后面这个Multi-Head Attention中,它学习哪些输入信息和之前输出信息的特征更有利于解码,最后还经过了Add & Norm层、Feed Forward层和Add & Norm层,得到了decoder的最终输出。
解码这里要特别注意一下,编码可以并行计算,一次性全部encoding出来,但是解码不是一次把所有序列解出来的,而是像RNN一样一个一个解出来的,因为要用前几个位置单词的结果当作self-attention的query。
拿到decoder的输出做一个线性变换,最后通过一个计算对应位置的输出词的概率。Transformer本次的输出当作下一步decoder的输入。
关于Transformer更详细的内容,可以参考我之前写的一篇文章:《Self-Attention与Transformer》
面试题:为什么NLP中的模型一般使用Layer Norm,而不是Batch Norm?
回答:
BERT的全称是Bidirectional Encoder Representation from Transformers,模型是基于Transformer中的Encoder并加上双向的结构,因此一定要熟练掌握Transformer的Encoder。BERT模型的主要创新点都在pre-train方法上,即用了Masked Language Model和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。
在用Masked Language Model方法训练BERT的时候,随机把语料库中15%的单词做Mask操作。对于这15%的单词做Mask操作分为三种情况:80%的单词直接用[Mask]替换、10%的单词直接替换成另一个新的单词、10%的单词保持不变。
因为涉及到Question Answering (QA) 和 Natural Language Inference (NLI)之类的任务,增加了Next Sentence Prediction预训练任务,目的是让模型理解两个句子之间的联系。与Masked Language Model任务相比,Next Sentence Prediction更简单些,训练的输入是句子A和B,B有一半的几率是A的下一句,输入这两个句子,BERT模型预测B是不是A的下一句。
由于注意力计算开销是输入序列长度的平方,较长的序列会影响训练速度,为了加快实验中的预训练速度,所以90%的steps都用序列长度为128进行预训练,余下10%的steps预训练为512长度的输入。
BERT预训练之后,会保存它的Embedding table和层Transformer权重(BERT-BASE)或层Transformer权重(BERT-LARGE)。使用预训练好的BERT模型可以对下游任务进行Fine-tuning,比如:文本分类、相似度判断、阅读理解等。
BERT模型在现实中的应用:
如果机器不足、预料不足,一般都会直接考虑用原始的BERT、Roberta、XLnet等在下游任务中微调,这样我们就不能在预训练阶段进行改进,只能在Fine-tuning阶段进行改进。改进方案如下图所示:
BERT模型作为当今NLP应用的大杀器,具有易于使用、稳定性强等诸多优点。本文深入了解BERT的原理,如何做到BERT的预训练改进以及Fine-tuning中所涉及到的常见改进策略。另外,本文也讲述了BERT模型在实际场景中的应用及在实践中的一些tricks。
本文部分内容是Microstrong在观看徐路在B站上讲解的视频《BERT模型精讲》的笔记,地址:https://www.bilibili.com/video/BV1M5411x7FZ?from=search&seid=7509511278753452725 ,剩余部分是Microstrong从BERT论文及下列参考文章中整理而来。
【1】Devlin J, Chang M W, Lee K, et al. Bert: Pre-training of deep bidirectional transformers for language understanding[J]. arXiv preprint arXiv:1810.04805, 2018.
【2】BERT模型精讲,地址:https://www.bilibili.com/video/BV1M5411x7FZ?from=search&seid=7509511278753452725
【3】LayerNorm是Transformer的最优解吗?,地址:https://mp.weixin.qq.com/s/W4gI9SWJm3MjbQHYgvFKbg
【4】The Illustrated Transformer,地址:https://jalammar.github.io/illustrated-transformer/
【5】一文看懂AutoEncoder模型演进图谱 - 深度的文章 - 知乎 https://zhuanlan.zhihu.com/p/68903857
【6】【NLP】Google BERT详解 - 李如的文章 - 知乎 https://zhuanlan.zhihu.com/p/46652512
推荐阅读
这个NLP工具,玩得根本停不下来
征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)
完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)
从数据到模型,你可能需要1篇详实的pytorch踩坑指南
如何让Bert在finetune小数据集时更“稳”一点
模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法
文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化
Node2Vec 论文+代码笔记
模型压缩实践收尾篇——模型蒸馏以及其他一些技巧实践小结
中文命名实体识别工具(NER)哪家强?
学自然语言处理,其实更应该学好英语
斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用
关于AINLP
AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。
阅读至此了,分享、点赞、在看三选一吧?