一本读懂BERT(原理篇)知识抽取

整理于2020年12月上旬,献给不甘平凡的你

更多机器学习知识请查收于: https://blog.csdn.net/weixin_45316122/article/details/110865833

trick:此文为《一本读懂BERT(原理篇)》知识抽取

目录

NLP发展史

2001 - Neural language models(神经语言模型)

2008 - Multi-task learning(多任务学习)

2013 - Word embeddings(词嵌入)

2013 - Neural networks for NLP(NLP神经网络)

2014 - Sequence-to-sequence models

2015 - Attention(注意力机制)

2015 - Memory-based networks(基于记忆的网络)

2018 - Pretrained language models(预训练语言模型)

对抗学习

强化学习

BERT:一切过往, 皆为序章

Attention机制讲解

Seq2Seq

Attention

Transrofmer模型讲解

Transformer总体结构

Self-Attention

scaled dot-product attention

    Multi-Headed Attention

  Positional Encoding

   Layer normalization

        Decoder层

BERT原理详解:

        结构:

        预训练模型

        BERT的预训练过程

输入

总结

 


 

 

NLP发展史

 

 


2001 - Neural language models(神经语言模型)

在这里插入图片描述

这个模型将从表C中查找到的n个单词作为输入向量表征。这种向量被现在的学者们称做“词嵌入”。

这些词嵌入级联后被输入到一个隐藏层中,该隐藏层的输出又被输入到softmax层

语言建模通常是应用RNN时的第一步,是一种非监督学习形式

  • 词嵌入:word2vec 的目标是简化语言建模。

  • sequence-to-sequence 模型:这种模型通过一次预测一个单词生成一个输出序列。

  • 预训练语言模型:这些方法使用来自语言模型的表述进行迁移学习。

2008 - Multi-task learning(多任务学习)

多任务学习是在多个任务上训练的模型之间共享参数的一种通用方法

在神经网络中,可以通过给不同层施以不同的权重,来很容易地实现多任务学习。

2013 - Word embeddings(词嵌入)

Word2vec有两种风格

连续字袋 CBOW 和 skip-gram。不过他们的目标不同:一个是根据周围的单词预测中心单词(CBOW),而另一个则相反。

在这里插入图片描述

虽然这些嵌入在概念上与使用前馈神经网络学习的嵌入在概念上没有区别,

但是在一个非常大的语料库上训练之后,它们就能够捕获诸如性别、动词时态和国家-首都关系等单词之间的特定关系,如下图所示。

!

2013 - Neural networks for NLP(NLP神经网络)

使用最广泛的三种主要的神经网络是:循环神经网络、卷积神经网络和递归神经网络。
循环神经网络(RNNs) 循环神经网络是处理 NLP 中普遍存在的动态输入序列的一个最佳的技术方案。

在这里插入图片描述

卷积神经网络(CNNs) 文本的卷积神经网络只在两个维度上工作,其中滤波器(卷积核)只需要沿着时间维度移动。

在这里插入图片描述
   

    Q :CNNs 优点是比 RNN 更可并行化的理由
    A :卷积神经网络在每个时间步长的状态只依赖于本地上下文(通过卷积运算),而不是像 RNN 那样依赖过去所有的状态。
    Q :使用膨胀卷积
    A :使用膨胀卷积,可以扩大 CNN 的感受野,使网络有能力捕获更长的上下文


  Trick:CNN 和 LSTM 可以组合和叠加(Wang等,2016),卷积也可以用来加速 LSTM(Bradbury等, 2017)。

递归神经网络     

在这里插入图片描述
    RNN 和 CNN 都将语言视为一个序列。
    Q:为什么出现递归神经
    A: 从语言学的角度来看,语言本质上是层次化的:
        单词被组合成高阶短语和从句,这些短语和从句本身可以根据一组生产规则递归地组合。
        将句子视为树而不是序列的语言学启发思想产生了递归神经网络
    Q:详解递归神经网络
    A: 递归神经网络从下到上构建序列的表示,这一点不同于从左到右或从右到左处理句子的 RNN。
        在树的每个节点上,通过组合子节点的结果来计算新的结果。
        Trick:由于树也可以被视为在 RNN 上强加不同的处理顺序,所以 LSTM 自然地也被扩展到树上

2014 - Sequence-to-sequence models


    这是一个使用神经网络将一个序列映射到另一个序列的通用框架。

  在该框架中,编码器神经网络逐符号处理一个句子,并将其压缩为一个向量表示;

然后,一个解码器神经网络根据编码器状态逐符号输出预测值,并将之前预测的符号作为每一步的输入,
    框架现在是自然语言生成任务的首选框架,其中不同的模型承担了编码器和解码器的角色。

!

    重要的是,解码器模型不仅可以解码一个序列,而且可以解码任意表征。如下图

在这里插入图片描述

sequence-to-sequence 学习甚至可以应用于 NLP 中输出具有特定结构的结构化预测任务。为了简单起见,输出被线性化,如下面的图所示,用于进行选区解析。(这里不是很懂,句法分析树)

现在有了sequence to sequence 的技术,只要把上图的树状图描述成一个sequence,那就只要学习一个sequence to sequence 的model,output就是句法分析树。

在这里插入图片描述

2015 - Attention(注意力机制)


    sequence-to-sequence模型的主要瓶颈是需要将源序列的全部内容压缩为一个固定大小的向量。
    注意力机制通过允许解码器回头查看源序列隐藏状态来缓解这一问题,然后将其加权平均作为额外输入提供给解码器,如下面的图所示

在这里插入图片描述
   

简短的概述。注意力机制广泛适用于任何需要根据输入的特定部分做出决策的任务
 注意力机制的一个额外的功能是,可以通过检查输入的哪些部分与基于注意力权重的特定输出相关来了解模型的内部工作方式。(不是很了解)
   

2015 - Memory-based networks(基于记忆的网络)


    注意力机制可以看作是模糊记忆的一种形式
    记忆由模型的隐藏状态组成,模型选择从记忆中检索内容。

记忆的访问通常基于与当前状态的相似度,类似于注意力,通常可以写入和读取。

    记忆的概念是非常通用的:知识库或表可以充当记忆,而记忆也可以根据整个输入或它的特定部分填充。

2018 - Pretrained language models(预训练语言模型)


    预训练的词嵌入与上下文无关,仅用于初始化模型中的第一层。
     预训练的语言模型已经被证明可以用更少的数据进行学习。由于语言模型只需要无标记的数据,因此对于标记数据稀缺的低资源语言尤其有用

对抗学习

强化学习

BERT:一切过往, 皆为序章

Attention机制讲解

attention是一种能让模型对重要信息重点关注并充分学习吸收的技术,它不算是一个完整的模型,应当是一种技术,能够作用于任何序列模型中。

Seq2Seq


    Trick:该模型分为encoder层与decoder层,并均为RNN或RNN的变体构成

在这里插入图片描述
  

  在encode阶段,第一个节点输入一个词,之后的节点输入的是下一个词与前一个节点的hidden state,
    最终encoder会输出一个context,这个context又作为decoder的输入,
    每经过一个decoder的节点就输出一个翻译后的词,并把decoder的hidden state作为下一层的输入。

    该模型对于短文本的翻译来说效果很好,但是其也存在一定的缺点,如果文本稍长一些,就很容易丢失文本的一些信息,
    为了解决这个问题,Attention应运而生。

Attention

    Attention,该模型在decode阶段,会选择最适合当前节点的context作为输入。
    Attention 与Seq2Seq模型主要有以下两点不同。
    1)encoder提供了更多的数据给到decoder,encoder会把所有的节点的hidden state提供给decoder,
        而不仅仅只是encoder最后一个节点的hidden state。

在这里插入图片描述
    2)decoder并不是直接把所有encoder提供的hidden state作为输入,
    而是采取一种选择机制,把最符合当前位置的hidden state选出来,
    具体的步骤如下
        确定哪一个hidden state与当前节点关系最为密切

        计算每一个hidden state的分数值(具体怎么计算我们下文讲解)

        对每个分数值做一个softmax的计算,这能让相关性高的hidden state的分数值更大,相关性低的hidden state的分数值更低

Trick:上面看懂就行,下面截图部分 有点迷

这里我们以一个具体的例子来看下其中的详细计算步骤:如下:

在这里插入图片描述
   

流程本来我是懂了


   

在这里插入图片描述

  

Trick Attention 模型精髓

Q:理解 Attention模型最重要的两句话
    Attention模型并不只是盲目地将输出的第一个单词与输入的第一个词对齐。实际上,它在训练阶段学习了如何在该语言对中对齐单词(示例中是法语和英语)。
    Attention函数的本质可以被描述为一个查询(query)到一系列(键key-值value)对的映射。

在这里插入图片描述
    在计算attention时主要分为三步,第一步是将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;
    然后第二步一般是使用一个softmax函数对这些权重进行归一化;最后将权重和相应的键值value进行加权求和得到最后的attention。
目前在NLP研究中,key和value常常都是同一个,即key=value, 即self-attention

在这里插入图片描述
       

Transrofmer模型讲解


    Attention Is All You Need

Transformer总体结构


    和Attention模型一样,Transformer模型中也采用了 encoer-decoder 架构。
    论文中encoder层由6个encoder堆叠在一起,decoder层也一样。

在这里插入图片描述

    每一个encoder和decoder的内部简版结构如下图

在这里插入图片描述

Q:模型的主要组件
        encoder,包含两层,一个self-attention层和一个前馈神经网络,self-attention能帮助当前节点不仅仅只关注当前的词,从而能获取到上下文的语义
        decoder也包含encoder提到的两层网络,但是在这两层中间还有一层attention层,帮助当前节点获取到当前需要关注的重点内容。(如上图)
    Q:模型实现的细节
        首先,模型需要对输入的数据进行一个embedding操作,(也可以理解为类似w2c的操作),embedding结束之后,输入到encoder层,

self-attention处理完数据后把数据送给前馈神经网络,
        前馈神经网络的计算可以并行,得到的输出会输入到下一个encoder(attention计算不依靠上下文。(如下图)

在这里插入图片描述
       

   

Self-Attention

原生attention的计算方式:

这里体现他和seqtoseq的不同之处

4、下一步就是把Value和softmax得到的值进行相乘,并相加,得到的结果即是self-attetion在当前节点的值。

在实际的应用场景,为了提高计算速度,我们采用的是矩阵的方式,直接计算出Query, Key, Value的矩阵,然后把embedding的值与三个矩阵直接相乘,把得到的新矩阵Q与K相乘,乘以一个常数,做softmax操作,最后乘上V矩阵

这种通过 query 和 key 的相似性程度来确定 value 的权重分布的方法被称为scaled dot-product attention。其实scaled dot-Product attention就是我们常用的使用点积进行相似度计算的attention,只是多除了一个(为K的维度)起到调节作用,使得内积不至于太大。

在这里插入图片描述

scaled dot-product attention

在这里插入图片描述

    Multi-Headed Attention

在这里插入图片描述


        把8个矩阵降为1个,首先,我们把8个矩阵连在一起,这样会得到一个大的矩阵,再随机初始化一个矩阵和这个组合好的矩阵相乘,最后得到一个最终的矩阵。

        在长距离依赖上,由于self-attention是每个词和所有词都要计算attention,所以不管他们中间有多长距离,最大的路径长度也都只是1。可以捕获长距离依赖关系。

      

  Positional Encoding


            在偶数位置,使用正弦编码,在奇数位置,使用余弦编码。
            最后把这个Positional Encoding与embedding的值相加形成每个位置编码矢量,作为输入送到下一层。

   Layer normalization


            在transformer中,每一个子层(self-attetion,ffnn)之后都会接一个残差模块,并且有一个Layer normalization

Trick:(self-attetion,ffnn)feed forward:如下图

在这里插入图片描述

            normalization  输入转化成均值为0方差为1的数据。

            Q:为什么要用normalization
            A: 在把数据送入激活函数之前进行normalization(归一化),因为我们不希望输入数据落在激活函数的饱和区。

            Q:为什么Batch Normalization过程中产生偏差
            A: 说到 normalization,那就肯定得提到 Batch Normalization。BN的主要思想就是:
            在每一层的每一批数据上进行归一化。我们可能会对输入数据进行归一化,但是经过该网络层的作用后,我们的数据已经不再是归一化的了。
            随着这种情况的发展,数据的偏差越来越大,我的反向传播需要考虑到这些大的偏差,
            这就迫使我们只能使用较小的学习率来防止梯度消失或者梯度爆炸。
              

            Q: 什么是 Layer normalization 呢?

            A: 它也是归一化数据的一种方式,不过 LN 是在每一个样本上计算均值和方差,而不是BN那种在批方向计算均值和方差
                在transformer中,每一个子层(self-attetion,ffnn)之后都会接一个残差模块,并且有一个Layer normalization

            Q: self-attention需要强调的最后一点是其采用了残差网络中的short-cut结构
            A:解决深度学习中的退化问题

在这里插入图片描述

        Decoder层

在这里插入图片描述

可以看到decoder部分其实和encoder部分大同小异,不过在最下面额外多了一个masked mutil-head attetion,这里的mask也是transformer一个很关键的技术,
            Q: 关键技术 Mask 作用
            A: mask 表示掩码,它对某些值进行掩盖,使其在参数更新时不产生效果。

            Transformer 模型里面涉及两种 mask,分别是 padding mask 和 sequence mask。
            其中,padding mask 在所有的 scaled dot-product attention 里面都需要用到,而 sequence mask 只有在 decoder 的 self-attention 里面用到。
           

            Q:什么是 padding mask 

            A:因为每个批次输入序列长度是不一样的也就是说,我们要对输入序列进行对齐。具体来说,就是给在较短的序列后面填充 0。
                但是如果输入的序列太长,则是截取左边的内容,把多余的直接舍弃。
                因为这些填充的位置,其实是没什么意义的,所以我们的attention机制不应该把注意力放在这些位置上,所以我们需要进行一些处理。
            具体的做法是,把这些位置的值加上一个非常大的负数(负无穷),这样的话,经过 softmax,这些位置的概率就会接近0!
            而我们的 padding mask 实际上是一个张量,每个值都是一个Boolean,值为 false 的地方就是我们要进行处理的地方。此句重中之重

            Q: 什么是 Sequence mask
            A: sequence mask 是为了使得 decoder 不能看见未来的信息
                也就是对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。
                因此我们需要想一个办法,把 t 之后的信息给隐藏起来。

            Q: 那么具体怎么做呢?
            A: 产生一个上三角矩阵,上三角的值全为0。把这个矩阵作用在每一个序列上,就可以达到我们的目的。
                对于 decoder 的 self-attention,里面使用到的 scaled dot-product attention,同时需要padding mask 和 sequence mask 作为 attn_mask,具体实现就是两个mask相加作为attn_mask。
                其他情况,attn_mask 一律等于 padding mask。
           

        输出层:
            添加一个全连接层和softmax层

Trick:全连接层 把整体连接起来,softmax分类层
       

BERT原理详解:


        结构:

Trick:  L表示的是transformer的层数,H表示输出的维度,A表示mutil-head attention的个数(cased是保留大小写)

在这里插入图片描述

从模型的层数来说其实已经很大了,但是由于transformer的残差(residual)模块,层数并不会引起梯度消失等问题,但是并不代表层数越多效果越好,

有论点认为低层偏向于语法特征学习,高层偏向于语义特征学习


        预训练模型

           Q:什么是预训练模型

           A:举个例子,假设我们有大量的维基百科数据,那么我们可以用这部分巨大的数据来训练一个泛化能力很强的模型,当我们需要在特定场景使用时,例             如做文本相似度计算,那么,只需要简单的修改一些输出层,再用我们自己的数据进行一个增量训练,对权重进行一个轻微的调整
           

预训练的好处在于在特定场景使用时不需要用大量的语料来进行训练,节约时间效率高效,bert就是这样的一个泛化能力较强的预训练模型。

        BERT的预训练过程


          BERT的预训练阶段包括两个任务,一个是Masked Language Model,还有一个是Next Sentence Prediction。
       
           
       
       duplicate(副本)

BERT预训练模型的输出结果,无非就是一个或多个向量。

下游任务可以通过精调(改变预训练模型参数)或者特征抽取(不改变预训练模型参数,只是把预训练模型的输出作为特征输入到下游任务)两种方式进行使用。

在这里插入图片描述

Trick:【sep】对应的向量没有实际的意义嘛,仅仅就是用来分隔两个句子

【CSL】就是一个向量,只是不是某一个字的向量,是一个够代表整个文本的的语义特征向量,取出来就可以直接用于分类了。对于Bert的任何微调任务,只会有一个[CLS],但[SEP]就不一定了,比如进行文本匹配任务,格式是:[cls]文本1[sep]文本2[sep],就会有两个[sep]。所以一般来说就会取唯一的[CLS]

参考于:https://blog.csdn.net/qq_42189083/article/details/102641087

输入

总结

https://blog.csdn.net/jiaowoshouzi/article/details/89073944

猜你喜欢

转载自blog.csdn.net/weixin_45316122/article/details/110233959