Bert系列之 Transformer详解

Bert整体的模型结构使用的是Transformer的Encode模块 进行层次叠加,唯一的不同点是位置编码 position embedding 使用的是随机初始化矩阵,没有使用三角函数,transformer中的位置编码使用的是 三角函数

一.Transformer初步认识

从上文中得到的信息是Transformer 由Encoder 和 Decoder两个部分组成,Encoder 和 Decoder 都是包含6个 block ,大致的处理流程如下:

 1. 获取输入句子的word embedding 表示X,位置表示向量 Y ,最终得到输入模型的向量表示为Z, Z= X+Y,  向量Z 是直接由向量X 和 向量Y  相加获取

2. 得到向量矩阵 Z 传入 Encoder模块,经过6个 Encoder  block模块 后得到句子的所有的编码语义信息,即为矩阵C

3. 将矩阵C输入给 Decoder中, Decoder依次经过 当前翻译过的词语如 1~ i 翻译接下一个单词 i+1

二. Transformer的整体结构

2.1 初步认识 Encoder 和 Decoder 模块

从上图所示,左边部分是 Encoder模块,右边是Decoder模块,Encoder模块主要的流程如下

1. input Embedding 和 Position Embedding 相加得到模型的输入,后面经过 Attention注意力模块(Multi-Head Attention ,后面着重介绍)

2. 接着经过一个Add & Norm 层, Add 表示的是残差连接 (Residual Connection) 用于防止网络退化,Norm 表示 Layer Normalization,用于对每一层的激活值进行归一化

3. 接着经过 Feed Forward 层,Feed Forward 层 是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数

4.最后 经过 Add & Norm 层,作用和2中类似

Decoder模块与 Encoder  有些差别,主要的区别如下:

1. 包含两个 Multi-Head Attention 层

2. 第一个 Multi-Head Attention 层采用了 Masked 操作

3. 第二个 Multi-Head Attention 层 的 K, V矩阵使用 Encoder 的编码信息矩阵C进行计算,而Q使用上一个 Decoder block 的输出计算

4. 最后有一个 Softmax 层计算下一个翻译单词的概率

针对 Encoder  和 Decoder 后续逐一介绍

2.2  Transformer的输入

输入由 word embedding 和 position embedding 相加得到,

word embedding 可以由模型自己学习获取,或者使用 word2vec Glove 等预训练的词向量获取。

位置 embedding ,也就是 position embedding ,主要是用于表示单词在句子中的位置。 Transformer 不采用 RNN 的结构,而是使用的是全局信息,单词的顺序信息体现不了。对于NLP任务来说,序列信息是一个很重要的特征信息,所以 Transformer中使用的是 position Embedding 来表示单词的位置信息。 在Bert中的 position Embedding 是通过向量初始化并进行训练得到的.

下图中的PE 表示 position Embedding :

 pos 表示的是 句子中 token的位置索引 index信息,i表示 embedding 的维度范围(0-511),如“我爱你”,

 

            引用 : 面经:什么是Transformer位置编码? - 知乎

        上面的PE(pos+k,2i)是通过三角函数定理计算获取,最终的结果显示PE(pos+k)和 PE(pos)之间可以通过线性组合进行转换,其中蕴含了相对位置信息

三. Encoder中的模块详细介绍

3.1 Attention模块

        

    1.attention注意力

     接下来,我们看下本文中的重点,也是transformer中的重点,self-attention模块,首先来看下计算公式,后面会详细介绍这个公式:

对于self-attention来说,Q(Query), K(Key), V(Value)三个矩阵均来自同一输入,所以上面公式转变为以下:

(1).首先我们看下 QK^{T}​,矩阵Q和矩阵K 的转置进行点积,由于 Q 和K来至于一个输入。故可以等价于 矩阵 XX^{T}​。那么我们来看下,

XX^{T}​ 最终是怎么计算的????

最终的结果是咋样的?

两个矩阵相乘,大家都是知道的,第一个矩阵的一行 乘以 第二个矩阵的第一列,然后累加和,如下图所示:

 上图显示的是 "科" 分别与 "科大讯飞" 四个字做内积计算,得到一个新的向量,经过softmax 归一化以后得到如下的行向量:

                                     

通过上面归一化以后的得到的行向量,我们得到的信息是:

当我们关注“科”这个字的时候,我们应当分配0.11的注意力给他本身, 分配0.02的注意力给“大”这个字, 分配 0.02的注意力 给"讯"这个字, 分配 0.85的注意力给“飞”这个字 

softmax最终还需要乘以矩阵V ,也就是X 本身,如下图所示:

 在上文新的向量中,每一个维度的数值都是由四个词向量在这一维度的数值加权求和得来的,这个新的行向量就是"科"字词向量经过注意力机制加权求和之后的表示

2. Q K V 矩阵

Q,K,V 矩阵 本质上都是 输入 X矩阵 的线性变换 

为啥要做线性变化?

K和Q的点乘是为了得到一个attention score 矩阵,用来对V进行注意力加权提纯 ,K和Q使用了不同的W_k, W_Q来计算,可以理解为是在不同空间上的投影。(向量的点乘的几何意义,表示一个向量在另一个向量上的投影,以及两个向量之间的夹角

正因为有了这种不同空间的投影,增加了表达能力,这样计算得到的attention score矩阵的泛化能力更高。这里解释下我理解的泛化能力,因为K和Q使用了不同的W_k, W_Q来计算,得到的也是两个完全不同的矩阵,所以表达能力更强

但是如果不用Q,直接拿K和K点乘的话,最终的attention score 矩阵是一个对称矩阵,因为是同样一个矩阵,都投影到了同样一个空间,所以泛化能力很差。这样的矩阵导致对V进行提纯的时候,效果也不会好

3. {\color{Red} }\sqrt{_{_{dk}}}的意义

 

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值