BERT

作者: 学术界末流打工人 | 来源:发表于2020-04-20 13:50 被阅读0次

自然语言处理通用框架BERT原理解读

BERT任务目标概述

  • 自然语言处理通用解决方案
    • 需要熟悉word2vec, RNN 网络模型,了解词向量如何建模
    • 重点在于Transformer网络架构,BERT训练方法,实际应用
    • 开源项目,可以直接套用
    • 提供预训练模型,基本任务拿过来直接用

Transformer

  • 要做一件什么事
    • 基本组成依旧是机器翻译模型中常见的Seq2Seq网络
    • 输入输出都很直观,其核心架构就是下图中间的网络设计


      Transformer总体架构

传统RNN网络计算时的问题:RNN网络层数少,每个X输入都利用了上一个输出值,所以相互不独立,不能进行并行训练和加速。Transformer可以解决该问题

传统RNN网络结构
  • 传统的RNN网络

    • Self-Attention机制来进行并行计算,在输入和输出都相同
    • 输出结果是同时被计算出来的,现在基本已经取代RNN了


      传统的RNN网络结构
  • 传统的word2vec

    • 表示向量时有什么问题?
    • 如果‘干哈那’是一个词
    • 不同语境中相同的词如何表达
    • 预训练好的向量就永久不变了
word2vec词分类

上图为传统的word2vec分类,相同的词离得比较近,不同的词距离比较远。如果训练完一个词后,词向量基本就不会变了。不同的词在不同语义中应该表达不同的意思。因为这个缺点,BERT加入了不同上下文对词的影响。

Transformer结构

Self-attention

根据不同语境会理解词的意思,没有人工干预,自动理解上下文。例如下图的对it词编码,需要通过整个文章对其进行编码。


对it编码

Self-attention如何计算

  • 输入经过编码后得到向量。

  • 想得到当前词语上下文的关系,可以当做是加权。

  • 构建三个矩阵分别来查询当前词跟其他词的关系,以及特征向量的表达。


    self attention计算
  • 三个需要训练的矩阵

  • Q:query,要去查询的

  • K:key,等着被查的

  • V:value,实际的特征信息

self attention计算
  • q与k的内积表示有多匹配
  • 输入两个向量得到一个分值
  • K: key,等着被查的
  • V: value,实际的特征信息
计算过程

首先每个词的Q会和查询每一个词K值的关系,这个过程中用Q与K的内积表示(当两个向量线性无关时,垂直内积为0,相关时有夹角,内积有值),q与k内积为,矩阵的对应位置相乘的合。

  • 最终的得分值经过softmax就是最终上下文结果
  • Scaled Dot-Product Attention
    • 不能让分值随着向量维度的增大而增加
Softmax计算qkv

Softmax回忆


Softmax回忆
  • 每个词的Attention计算
    • 每个词的Q会跟整个序列中每一个K计算得分,然后基于得分再分配特征


      Attention计算
  • Attention整体计算流程
  • 每个词的Q会跟每一个K计算得分
  • Softmax后就得到整个加权结果
  • 此时每个词看的不只是它前面的序列
  • 而是整个输入序列 同一时间计算出所有词的表示结果


    Attention整体计算流程
    结果

Multi-head的作用

  • multi-headed机制 一组q,k,v得到了一组当前词的特征表达
  • 类似卷积神经网络中的filter
    • 能不能提取多种特征呢?


卷积中的特征图:


特征图
  • multi-headed机制 (一般来说做8个head就够了)
    • 通过不同的head得到多个特征表达
    • 将所有特征拼接在一起
    • 可以通过再一层全连接来降维


      multi-headed
  • multi-headed结果
    • 不同的注意力结果
    • 得到的特征向量表达也不相同
multi-headed结果 multi-headed结果

堆叠多层

计算方法都是相同的


堆叠多层

位置编码与多层堆叠

位置信息表达

  • 在self-attention中每个词都会考虑整个序列的加权,所以其出现位置 并不会对结果产生什么影响,相当于放哪都无所谓,但是这跟实际就 有些不符合了,我们希望模型能对位置有额外的认识。
位置信息表达

Add与Normalize

归一化:均值为0 标准差为1


连接:基本的残差连接方式


Transformer整体架构梳理

  • Decoder Attention

    • 计算不同
    • 加入了MASK机制(为了使还未输出的值变为不可以利用,只可以利用前面已经输出的结果)


  • 最终输出结果

    • 得出最终预测结果
    • 损失函数 cross-entropy即可


  • 整体梳理

    1. Self-Attention
    2. Multi-Head
    3. 多层堆叠,位置编码
    4. 并行加速训练


      整体流程

效果展示


不同语境的it指代

BERT模型训练方法

  • BERT训练的词向量有什么不同?

    • 在word2vec中,相同词对应的向量训练好后就固定了
    • 但在不同的场景中,‘干哈呢’的意思会相同吗?
  • 这名字该怎么解释?

    • Bidirectional Encoder Representations from TransformersEncoder
    • 说白了就是transformer的encoder部分
    • 并不需要标签,有预料就能训练了


      BERT就是encoder端
  • 如何训练BERT

    • 方法1:句子中有15%的词汇被随机mask掉

    • 交给模型去预测被mask的家伙到底是什么

    • 词语的可能性太多了,中文一般是字

    • 如果BERT训练的向量好,那分类自然OK


      方法1
    • 方法2:预测两个句子是否应该连在一起

    • [seq]:两个句子之前的连接符,[cls]:表示要做分类的向量


      方法2:两句话应该链接在一起
方法2:两句话不应该链接在一起
  • 如何使用BERT
  • 是不是需要先训练好向量的表达,然后再训练需要的模型呢?
  • 所需的任务融入BERT中即可,它俩一起训练的!


    分类任务
    分类任务

阅读理解应用
阅读理解题,输入是文章和问题, 输出是理解的答案位置。


如何设计网络呢?需要分别计算答案的起始和终止位置

需要额外训练两个辅助向量,一个开始索引一个结束索引,例如下图黄色start,蓝色end,圆点表示做内积。



References

  1. Python自然语言处理-BERT实战

相关文章

网友评论

      本文标题:BERT

      本文链接:https://www.haomeiwen.com/subject/egievhtx.html