自然语言处理BERT模型

自然语言处理BERT模型

课程安排

  • 通俗讲解知识点,项目实战驱动
  • 当下主流解决框架,一站式搞定NLP任务
  • 环境配置:选一款IDE即可,基于谷歌开源项目
  • 提供所有数据与代码,追随热点持续更新

BERT

  • 需要熟悉word2vec,RNN网络模型,了解词向量如何建模
  • 重要在于Transformer网络架构,BERT训练方法,实际应用
  • 开源项目,都是现成的,套用进去就ok
  • 提供预训练模型,基本任务拿过来直接用都成

Transformer

要做一件什么事呢?

  • 基本组成依旧是机器翻译模型中常见的Seq2Seq网络
  • 输入输出都很直观,其核心架构就是中间的网络设计了

对比传统的RNN网络:

计算时有什么问题?

是依次串行处理的,现在处理的需要依赖上一步处理后的数据。

而Self-Attention机制来进行并行计算(得益于QKV的矩阵),在输入和输出都相同,输出结果是同时被计算出来的,现在基本已经取代RNN了。

image-20221117145723293

传统的word2vec

  • 表示向量时有什么问题?

训练好的词向量是固定的,但是应用到不同的情景中原有的词含义并不合适

  • 如果‘干哈那’是一个词?

不同语义中不同的含义

  • 不同语境中相同的词该如何表达
  • 预训练好的向量就永久不变了

整体架构

  • 输入如何编码?
  • 输出结果是什么?
  • Attention的目的?
  • 怎样组合在一起?

Attention是什么意思呢?

对于输入的数据,所关注的点是什么?不同的句子有不同的关注点。

那么如何才能让计算机关注到这些有用的信息呢?

Self-attention是什么?

在上面的句子中,不同的情景下it所代指的是不一样的。

self-attention实质上就是当前词自己self,融合了该词所在句子中其他单词的含义,只不过对不同的词添加了不同的权重。

所谓的各种模型,实际上都是在进行加权平均

self-attention如何计算?

考虑如何获得一个句子中不同的单词对该词自身selt的影响,考虑添加一个query、key、value矩阵来,在开始的时候初始化,不断的训练中会改变,其实质上就是一个权重参数矩阵。

  1. 输入经过编码后得到向量
  2. 想得到当前词语上下文的关系,可以当作是是加权
  3. 构建三个矩阵分别来查询当前词跟其他词的关系,以及特征向量的表达。

image-20221117154213948

三个需要训练的矩阵:

Q:query ,要去查询的

K:key,等着被查询的

V:value,实际的特征信息

image-20221122145315126

首先:

q与k的内积表示有多匹配,向量垂直,内积为0、相近的话内积接近于1。

输入了两个向量,得到一个分值。q、k。得到的是两个矩阵查询出来的结果。

其中k代表了等着被查的,v代表了q*k后的实际的特征信息。

image-20221122145824269

在Q * K转制后也就是得到了一个实际的内积值,因为多个计算结果不同的值之间方差比较大,所以我们去除以了根号下k的维度,然后做了一个softmax,结果可能是:

【0.2、0.12、0.34、0.37 。。】

这实际上对应的是当前词和和不同词之间的相关度(这里使用概率值来表示)然后和V矩阵相乘后得到z矩阵,也就是当前词根据上下文信息后得到的综合向量embedding。

image-20221122150458880

最终的得分值经过softmax就是最终上下文结果

除以根号的原因在于,不能让其分值随着向量维度的增大而增加,所以这里做了一个缩小除法。

softmax公式回忆:

image-20221122150719368

把一些输入映射为0-1之间的实数,并且归一化保证和为1。

每个词的Attention计算

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

Attention整体计算流程

  • 每个词的Q会跟每一个K计算得分
  • Softmax后(和V矩阵相乘后)就得到整个加权结果
  • 此时每个词看的不只是它前面的序列而是整个输入序列
  • 会在同一时间计算出所有词的表示结果

image-20221122151553690

首先是输入文本,然后转换成embedding,然后新建Q、K、V三个矩阵并随机初始化,然后q1*k1、q2*k2等等得到一个相关内积,然后除以k矩阵的维度,再经过softmax后得到概率值,然后和v矩阵相乘,就得到了如:

Z1 = 0.88v1 + 0.12 v2 这样的表示方式。

Multi-headed机制

  • 一组q、k、v得到了一组当前词的特征表达。
  • 我们设想类似cnn中的filter,能不能提取多种特征呢?
  • 多头注意力机制类似于我们从不同的视角去分析问题,对于selt-attention的信息抽取同样是包含这种思想在里面的。

image-20221122154124438

实质上就是借鉴了:

image-20221122155225292

通过不同的head得到了多个特征表示 ,然后将所有特征拼接在一起,然后再进经过一层全链接来降维:

image-20221122155346655

Multi-headed结果

不同注意力的结果,得到的特征向量表达也不相同。

image-20221122155509768

堆叠多层

一层不够,需要堆叠多层。计算方法都是相同的。

image-20221122155721316

位置信息表达

在上文描述的self-attention中每个词都会考虑整个序列的加权,所以其出现位置对结果并不会产生什么影响,相当于放在哪里都是无所谓的,但是这就跟实际有些不相符了,所以希望模型对位置信息有一些额外的认识,于是引入了位置变量。

在Encoder层和Decoder层中都用到了Add&Norm操作,即残差连接和层归一化操作。

什么是残差连接呢?

残差连接就是把网络的输入和输出相加,即网络的输出为F(x) + x ,在网络结构比较深的时候,网络梯度反向传播更新参数时,容易造成梯度消失的问题,但是如果每层的输出都加上一个x的时候,就会变成F(x)+x,对x求导结果为1,所以就相当于每一层求导时都加上了一个常数项1,有效的解决了梯度消失的问题。

加入未学习的原向量使得到的结果的效果至少不弱于原来的结果

Norm操作

Norm操作 首先要明白Norm做了一件什么事,从刚开始接触Transformer开始,我认为所谓的Norm就是BatchNorm,但是有一天我看到了这篇文章,才明白了Norm是什么。

假设我们输入的词向量的形状是(2,3,4),2为批次(batch),3为句子长度,4为词向量的维度,生成以下数据:

[[w11, w12, w13, w14], [w21, w22, w23, w24], [w31, w32, w33, w34] [w41, w42, w43, w44], [w51, w52, w53, w54], [w61, w62, w63, w64]] 1 2 如果是在做BatchNorm(BN)的话,其计算过程如下:BN1=(w11+w12+w13+w14+w41+ w42+w43+w44)/8,同理会得到BN2和BN3,最终得到[BN1,BN2,BN3] 3个mean

如果是在做LayerNorm(LN)的话,则会进如下计算:LN1=(w11+w12+w13+w14+w21+ w22+w23+w24+w31+w32+w33+w34)/12,同理会得到LN2,最终得到[LN1,LN2]两个mean

如果是在做InstanceNorm(IN)的话,则会进如下计算:IN1=(w11+w12+w13+w14)/4,同理会得到IN2,IN3,IN4,IN5,IN6,六个mean,[[IN1,IN2,IN3],[IN4,IN5,IN6]] 下图完美的揭示了,这几种Norm

  1. 通过解决ICS(内部协变量偏移)的问题,使得每一层神经网络的输入分布稳定,在这个基础上可以使用较大的学习率,加速了模型的训练速度
  2. 起到一定的正则作用,进而减少了dropout的使用。当我们通过BN规整数据的分布以后,就可以尽量避免一些极端值造成的overfitting的问题
  3. 使得数据不落入饱和性激活函数(如sigmoid,tanh等)饱和区间,避免梯度消失的问题。


Decoder

Attention计算不同

并且加入了MASK机制

最终的输出结果

得出最终预测结果

损失函数使用cross-entropy即可

image-20221122182800177

整体梳理一下

img

首先输入Embedding和positional Encoding,然后输入到Self-attention,并且使用multi-head多层堆叠,位置编码,然后使用Add & Norm 残差连接和归一化,并且使用多个transformer块进行训练。

在decoder方面,为了使得中间隐层向量的解码带有注意力,而不是一视同仁地统一解码,所以需要某种计算机制来生成一种记录训练过程中语义倾向的值。

encoder-decoder attention 用到的策略的名称叫做encoder-decoder attention, 用原博中的两个gif就能解释,首先通过最末尾的一个encoder保留KV,初始化Q得到decoder的第一个输出

图示中的I就是decoder的第一个输出, 接下来这个输出当做下一个decoder的Q,然后再获取之前的encoder的KV,继续做self attention 如下图所示:

这样一来就能够通过transformer得到对应的一个不带位置编码的输出 一句话总结就是: encoder-decoder attention中,Q来自于decoder的上一个输出,KV来自于encoder的输出

源码

Pre-trained models

预训练的模型包含如下:

README中介绍.zip包含3大块:

  • A TensorFlow checkpoint (bert_model.ckpt) containing the pre-trained weights (which is actually 3 files). 权重参数和偏置
  • A vocab file (vocab.txt) to map WordPiece to word id. 词表
  • A config file (bert_config.json) which specifies the hyperparameters of the model.超参数
这种表格