【NLP】模型 bert - hippowc/hippowc.github.io GitHub Wiki
预备知识
模型发展
- 2013.1 Word2Vec
- 获取词向量
- 2014.2 GloVe
- 无监督学习,获取词向量
- 2016.7 Fasttext
- 轻量级文本分类器
- 2017.6 Transformer
- 基于encoder-decoder结构 + attention 在机器翻译任务表现超过RNN、CNN
- 2018 ELMo、ULmfit
- 面向NLP的迁移学习模型,只需要极少标注数据,文本分类精度达到和数千倍标记数据同等水平
- 出现在BERT之前,没有采用Transformer结构
- 2018.10 BERT
- 用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的表示
- BERT之后
- Transformer-XL:Transformer的升级版,在速度方面比Transformer快1800多倍
- GPT-2:无需针对性训练就能横扫各种特定领域的语言建模任务
- ERNIE:基于百度自己的深度学习框架飞桨(PaddlePaddle)搭建
- XLNET:类似BERT的模型,是一种通用的自回归预训练方法
- RoBERTa:Facebook提出,改进了预训练方法
- Salesforce CTRL:具有强大且可控的人工文本生成功能
- ALBERT:谷歌发布的轻量级BERT模型
- 评估语言模型的方法之一是Glue Benchmark,刚刚发布的时候,BERT模型的性能位居榜首,但截至2020年1月2日,BERT已经排名到了19位
文本表征
要让机器识别文字,处理文字,需要将语言文字编码为数字表示,文本表征即文本的“数字表示“。
- 模型运算需要数字
- 模型的运算是连续的,而文本数据是离散的
常见的文本表征模型:
- 传统
- one-hot(问题:维度高)
- tf-idf(词频统计)
- 基于词向量
- Word2vec
- doc2vec
- glove
- festext(基于特定任务、结构简单)
- 基于语言模型
- ELMO
- GPT
- BERT (基于文本特征的,需要大量数据集)
词向量的问题
大部分模型首先需要进行的就是词汇的embedding,即将词汇映射到一个固定维度的向量上,来表征文本。最常见的Embedding的方法是 word2vec,种词向量能够学习到词语间的共现关系,但它是存在问题的:
- 词向量的建立在分布式假设前提下:即,相同上下文语境的词有相似的含义
- 依照词向量的建模方法,如果一对同义词,拥有不同的上下文,就会有不同的词向量
Attention机制
Attention机制最早是应用于图像领域的,九几年就被提出来的思想,2017年,google机器翻译团队发表的《Attention is all you need》中大量使用了自注意力(self-attention)机制来学习文本表示。
特点
Attention(注意力)机制如果浅层的理解,跟他的名字非常匹配。他的核心逻辑就是「从关注全部到关注重点」。Attention机制其实就是一系列注意力分配系数,也就是一系列权重参数
- 参数少:模型复杂度跟 CNN、RNN 相比,复杂度更小,参数也更少。所以对算力的要求也就更小
- 速度快:Attention 解决了 RNN 不能并行计算的问题。Attention机制每一步计算不依赖于上一步的计算结果,因此可以和CNN一样并行处理。
- 效果好:在 Attention 机制引入之前,有一个问题大家一直很苦恼:长距离的信息会被弱化,就好像记忆能力弱的人,记不住过去的事情是一样的。Attention 是挑重点,就算文本比较长,也能从中间抓住重点,不丢失重要的信息。
原理
加权求和
- query 和 key 进行相似度计算,得到权值
- 将权值进行归一化,得到直接可用的权重
- 将权重和 value 进行加权求和
bert(Bidirectional Encoder Representations from Transformer)
预训练模型、基于深度transformer的双向编码表征
- 迁移学习
- 蒸馏
- attention
- trasformer
bert原理
整体结构:Embedding + Transformer Encoder + Loss优化
Embedding
embedding简单理解就是:将词汇映射到一个固定维度的向量上,bert的embedding方式是:word embedding(无预训练) + position embedding + type embedding
BERT输入的数据是两句话,通过【sep】分隔符标记,分割符前称为前段,分隔符后面的称为后段,一次输入两句,是为了后面计算一个叫classification的loss
- type embedding:在输入前段的词都是 [公式] ,后段的词都是 [公式]
- position embedding:为了解决attention机制中忽略词的顺序
Transformer Encoder
整体结构:Multi_Head Attention (多头注意力机制) + Feed Forward (前向传播)
使用multi_head attention进行编码
- 第一步,将输入的embedding 进行维度扩展,同attention那篇论文中讲的那样,一个维度作为Key,一个维度作为query,一个维度作为Value。
- 第二步,进行multi_head划分,将扩展后的每一个维度,都进行划分
- 第三步,对于划分出的每一个头,与输入中的其他词做self-attention,内部自注意力机制,得到新的向量表示。
- 第四步,将每一个头 自注意力后的向量表示进行concat,简单拼接,形成每一个词的向量表示。
- 第五步,增加一个dropout层,由于是深度transformer,深度越深有可能产生梯度消失、梯度爆炸的问题,因此,这里采用了残差连接,将原始的word embedding与tansformer后的向量表示相加。最后再来一个layer norm 层归一化。
Feed Forward
比较简单
Loss优化
整体结构:Mask Language Model + Next sentence prediction
Mask Language Model
将输入句子mask(挖)掉一个词,然后通过上下文的词来预测这个词。通过预测的loss,计算Mask LM Loss
Next sentence prediction
模型的输入是由【sep】标记分割的两句话,因此这两句话有两种可能
- 两句话出自同一篇文章,上下两句是连续的,classfication 为True
- 两句话不相关,不是上下文关系,classfication 为False
整个模型通过优化这两个任务的损失,来训练整个模型