Datawhale八月学习-NLP专题-注意力机制与transformer

1.数据转换(将单词转换为向量)

1.1 One hot编码

本质是创建一个足够长的数组使其包含所有单词,且每一个单词都有他自己的位置,当出现这个单词时将这个单词置1,其余置0。
问题: 每个单词之间彼此信息无关,且训练时需要每个都照顾到。

1.2 word embedding

通过判断向量之间的相似度来度量词之间的语意相关性。其基于的分布式假设是出现在上下文下的词意思应该相近。
在这里插入图片描述

2.Seq2Seq结构模型(序列到序列模型)

Seq2Seq模型:
输入:一个序列(单词,字母,图片特征)。
模型:	1.Ecoder编码器:处理输入序列中的元素将其转化为一个向量(Context)。
		2.Context上下文:一个向量或数组,编码矢量是从模型的编码部分产生的最终隐藏状态。
						该向量旨在封装所有输入元素的信息,以帮助解码器进行准确的预测。
		3.Decoder解码器:生成输出序列中的元素。
输出:一个序列(要求的序列)。

图示
在编码器与解码器中也是通过一个个类似上下文式的结构进行数据传递的,这使得输入是根据前一步的数据传递和当前的数据输入来生成新的数据传递数据。而到最后时最后生成的数据传递的数据将作为编码器和解码器之间的上下文数据进行传递。

在这里插入图片描述

3.Attention模型架构

提出原因: Seq2Seq需要将源序列的全部内容压缩为固定大小的矢量。如果文本稍长,则很容易丢失文本的某些信息。

3.1 Attention与Seq2Seq的区别:

        {\ \ \ \ \ \ \ }        第一,编码器向解码器提供更多数据,并且编码器会向解码器提供所有节点的隐藏状态,而不仅仅是编码器的最后节点的隐藏状态。
        {\ \ \ \ \ \ \ }        第二,解码器不直接将所有编码器提供的隐藏状态作为输入,而是采用选择机制来选择与当前位置最匹配的隐藏状态。为此,它尝试通过计算每个隐藏状态的得分值并对得分进行softmax计算来确定哪个隐藏状态与当前节点相关性最高,这使得隐藏状态的更高相关性具有更大的分数值,不太相关的隐藏状态具有较小的分数值。然后它将每个隐藏状态与其softmax得分相乘,从而放大分数高的隐藏状态,淹没分数低的隐藏状态。该评分练习在解码器侧的每个迭代时间完成。

3.2 解码器处理方式

  1. 查看所有接收到的编码器的 hidden state(隐藏层状态)。其中,编码器中每个 hidden state(隐藏层状态)都对应到输入句子中一个单词。
  2. 给每个 hidden state(隐藏层状态)一个分数(我们先忽略这个分数的计算过程)。
  3. 将每个 hidden state(隐藏层状态)乘以经过 softmax 的对应的分数,从而,高分对应的 hidden state(隐藏层状态)会被放大,而低分对应的 hidden state(隐藏层状态)会被缩小。

3.3 注意力机制的过程

  1. 注意力模型的解码器 RNN 的输入包括:一个embedding 向量,和一个初始化好的解码器 hidden state(隐藏层状态)。
  2. RNN 处理上述的 2 个输入,产生一个输出和一个新的 hidden state(隐藏层状态 h4 向量),其中输出会被忽略。
  3. 注意力的步骤:我们使用编码器的 hidden state(隐藏层状态)和 h4 向量来计算这个时间步的上下文向量(C4)。
  4. 我们把 h4 和 C4 拼接起来,得到一个向量。
  5. 我们把这个向量输入一个前馈神经网络(这个网络是和整个模型一起训练的)。
  6. 前馈神经网络的输出的输出表示这个时间步输出的单词。
  7. 在下一个时间步重复这个步骤。

4. transformer的编码器部分

4.1 输入

X e m b e d d i n g [ b a t c h s i z e , s e q u e n c e l e n g t h , e m b e d d i n g d i m e n s i o n ] {X_embedding[batch size,sequence length,embedding dimension]} Xembedding[batchsizesequencelengthembeddingdimension],其中 b a t c h s i z e {batch size} batchsize为句子的个数, s e q u e n c e l e n g t h {sequence length} sequencelength为句子的长度, e m b e d d i n g d i m e n s i o n {embedding dimension} embeddingdimension为word embedding转换后每个单词对应向量的长度。

4.2 位置嵌入(位置编码)[1]

为了更好的发挥并行输入的特点,需要让输入的内容具有一定的位置信息,而 t r a n s f o r m e r transformer transformer模型没有循环神经网络的迭代操作,所以必须提供每个字的位置信息给 t r a n s f r o m e r transfromer transfromer,才能识别出语言中的顺序关系。
引入位置信息的方式:

类型内容
函数型通过输入 t o k e n token token位置信息,得到相应的位置编码
表格型建立一个长度为 L L L的词表,按词表的长度来分配位置 i d id id

4.2.1 以前的方法——表格型

方法一:使用 [ 0 , 1 ] [0,1] [0,1]范围分配。
将0-1这个范围的,将第一个 t o k e n token token分配0,最后一个 t o k e n token token分配去1,其余的 t o k e n token token按照文章的长度平均分配。具体形式如下:

我喜欢吃洋葱 [0 0.16 0.32.....1]
我真的不喜欢吃洋葱[0 0.125 0.25.....1]

问题:我们可以看到,如果句子长度不同,那么位置编码是不一样,所以无法表示句子之间有什么相似性。

方法二: 1 − N 1-N 1N正整数分配。
这个方法比较直观,就是按照输入的顺序,一次分配给token所在的索引位置。具体形式如下:

我喜欢吃洋葱 [1,2,3,4,5,6]
我真的不喜欢吃洋葱 [1,2,3,4,5,6,7]

问题:往往句子越长,后面的值越大,数字越大说明这个位置占的权重也越大,这样的方式无法凸显每个位置的真实的权重。

4.2.2 改良后的方法——函数型

关注一个 t o k e n token token和另一个 t o k e n token token距离之间的相对位置(距离差为几个 t o k e n token token)位置1和位置2的距离比位置3和位置10的距离更近,位置1和位置2与位置3和位置4都只相差1。

4.2.3 t r a n s f r o m e r transfromer transfromer p o s i t i o n position position(函数型)

1.公式
在这里插入图片描述
2.符号说明
① 关于 ω i {\omega_i} ωi :

图片
d m o d e l {d_model} dmodel是总共字向量的维度。
i {i} i是其中一个字的维度。

ω i {\omega_i} ωi是频率

② 关于 t t t

这里的 t t t 就是每个 t o k e n token token的位置,比如说是位置1,位置2,以及位置n

3.数学证明:
为什么位置之间距离为定值:
面经:什么是 T r a n s f o r m e r Transformer Transformer位置编码?https://mp.weixin.qq.com/s/mZBHjuHJG9Ffd0nSoJ2ISQ

4.2.4 代码

import numpy as np


def get_positional_encoding(max_seq_len, embed_dim):
    # 初始化一个positional encoding
    # embed_dim: 字嵌入的维度,或者说是word embedding转换后每个单词对应向量的长度。
    # max_seq_len: 最大的序列长度,或者说是限定的最大单个句子长度。
    positional_encoding = np.array([
        [np.sin(pos / np.power(10000, 2 * i / embed_dim)) if i%2==0 else 
         np.cos(pos / np.power(10000, 2*i/embed_dim))
         for i in range(embed_dim) ]
         for pos in range(max_seq_len)])
   
    return positional_encoding

4.3 transfromer中的多头注意力机制

在这里插入图片描述

4.3.1 过程

X e m B e d d i n g _ p o s XemBedding\_pos XemBedding_pos会做三次线性变化得到 Q Q Q, K K K, V V V,三个矩阵,然后里面 A t t e n t i o n Attention Attention机制,把 Q Q Q, K K K, V V V三个矩阵进行运算,最后把 A t t e n t i o n Attention Attention矩阵和 X e m b e d d i n g _ p o s Xembedding\_pos Xembedding_pos加起来就是最后的 Z Z Z

4.3.2 解释

Q Q Q:自己用的,用 Q Q Q去和别的找关系,由系数矩阵对输入的 X e m B e d d i n g _ p o s XemBedding\_pos XemBedding_pos做乘法得到的
K K K:给别人用的,专门对付跟你找关系的输入(也可能对付的是自己),由系数矩阵对输入的 X e m B e d d i n g _ p o s XemBedding\_pos XemBedding_pos做乘法得到的
α {\alpha} α:权重,值为 Q Q Q K K K的乘法
V V V:找到关系的值,由系数矩阵对输入的 X e m B e d d i n g _ p o s XemBedding\_pos XemBedding_pos做乘法得到的
Z Z Z:最后的输出,为
在这里插入图片描述

更好理解一点的解释:(引用自参考文献[2]的一条评论)
假如一个男生B,面对许多个潜在交往对象B1,B2,B3…,他想知道自己谁跟自己最匹配,应该把最多的注意力放在哪一个上。那么他需要这么做:
1、他要把自己的实际条件用某种方法表示出来,这就是Value;
2、他要定一个自己期望对象的标准,就是Query;
3、别人也有期望对象标准的,他要给出一个供别人参考的数据,当然不能直接用自己真实的条件,总要包装一下,这就是Key;
4、他用自己的标准去跟每一个人的Key比对一下(Q*K),当然也可以跟自己比对,然后用softmax求出权重,就知道自己的注意力应该放在谁身上了,有可能是自己哦。

4.3.3 多头注意力机制总结[3]

在这里插入图片描述

5. 前馈神经网络(FeedForward)

我们上面通过多头注意力机制得到了Z,下面就是把Z再做两层线性变换,然后relu激活就得到最后的R矩阵了。(相当于一个两层的神经网络)
F F N ( x ) = max ⁡ ( 0 , x W 1 + b 1 ) W 2 + b 2 ​ {FFN(x)=\max (0,xW_1+b_1)W_2+b_2 ​} FFN(x)=max(0,xW1+b1)W2+b2
在这里插入图片描述

5. transformer的解码器部分[4]

在这里插入图片描述
解码器的block由masked multi-head attention和一个encoder-decoder的attention组成。
其中masked multi-head attention部分用于将未来的信息mask掉,因为在生成的时候是无法知道未来的信息的。下图就是一个mask的例子(实际使用的时候还会有,符号)。至于attention的计算,还是和之前的方式一致。这一部分可以看成模型在考虑之前的输出信息来计算当前应该输出什么。

Decoder的第二个部分是一个encoder和decoder的attention,这一部分可以看成解码器在用编码器的输出信息来计算当前解码应该输出什么。这一部分的区别在于Q,K,V的三个向量中。Q是解码器的属性,而K, V是encoder端最后输出的K和V。attention的计算方式和之前的计算方式都是一样的。通过这个方法编码器可以捕捉编码器的输出信息。这一部分fairseq中使用了static k,q,v来表示(fairseq的这两块代码是分开的),因为编码器输出后,在解码过程中,这些k, v是不会变的。

参考文献

[1] . 面经:什么是Transformer位置编码?https://mp.weixin.qq.com/s/mZBHjuHJG9Ffd0nSoJ2ISQ
[2] . 深度学习attention机制中的Q,K,V分别是从哪来的?https://www.zhihu.com/question/325839123/answer/1903376265
[3] transformer中的多头注意力机制https://blog.csdn.net/qq_41485273/article/details/115695809
[4] Transformer解码器详解https://zhuanlan.zhihu.com/p/121662739

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值