【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

整个模型通过优化这两个任务的损失,来训练整个模型

迁移学习