当前位置:   article > 正文

Python深度学习——Transformer_python transformer

python transformer

前言 

Transfomer是一种深度学习模型架构,用于处理序列到序列的任务,如机器翻译、摘要生成和问答系统等。其核心思想是自注意力机制,能够同时处理输入序列中所有位置的信息,而不需要依赖于固定大小的窗口或者固定大小的卷积核。这使得Transformer模型在处理长序列时表现出色,并在各种自然语言处理任务中取得了很好的效果。

Transformer模型由编码器(encoder)和解码器(decoder)组成,其中编码器负责将输入序列编码为一系列隐藏状态,解码器则利用这些隐藏状态生成目标序列。这种架构的灵活性和高效性使得Transformer成为自然语言处理领域的一个重要里程碑,并且在许多实际应用中被广泛应用。

一、Inputs

1、Input Embedding

输入序列中的每个token(文本的最小单元)映射到一个高维向量空间中,这些向量被成为词嵌入(word embeddings),它们捕获了单词的语义信息和上下文相关性,通常是通过一个可训练的embedding矩阵查找得到,这个矩阵的每一行对应一个token的embedding。

2、Positional Encoding

由于transformer没有使用循环或卷积来处理序列,因此需要一种方式来处理序列中token的顺序信息。为此,就引入了位置编码,通过将每个位置编码为一个向量,然后将其与token的embedding相加来表示位置信息。

PE计算公式如下:

pos表示单词在句子中的绝对位置,pos=0,1,2...;dmodel表示词向量的维度(这里为512);2i和2i+1表示奇偶性,i表示第几维。

对于每个token,最终的embedding是将token embedding和对应位置编码相加而得到的。

 

Decoder的输入和Encoder是一样的,不同的是Encoder接受source数据,Decoder接受target数据。比如要完成"I love you."到“我爱你。”的翻译,Encoder接受"I love you.",Decoder接受“我爱你。”,只有在训练时才会接受Output Embedding,做预测的时候时没有的。

二、Encoder

Encoder block是由6个相同的encoder堆叠成的,Nx=6。每个encoder由Multi-Head Attention(多头注意力)和Feed Forward(全连接神经网络)组成。

1、Multi-Head Attention

首先介绍一下self-attention:

       假设输入序列是"Multi-Head Attention",则x1和x2就是"Multi-Head"和"Attention"添加过位置编码后的词向量,然后词向量通过三个权值矩阵WQ,WK,WV,转化成计算Attention值所需的Query,Keys,Values向量。假设词向量是512维,X矩阵的维度是(2,512),WQ,WK,WV均是(512,64)维,得到的Query,Keys,Values均是(2,64)维。

       得到Q,K,V后,就可以计算Attention的值。

  • 计算序列中每个单词之间的相关性得分,Q中每一个向量与K中每一个向量计算点积,score=Q\cdot K^{T},score是一个(2,2)矩阵。
  • 对于相关性得分score进行归一化,为了训练时梯度能够稳定。score=\frac{score}{\sqrt{dk}},dk就是K的维度,以上面假设为例,dk=64.
  • 通过softmax函数,将每个单词之间的得分向量转换成[0,1]之间的概率分布,更凸显单词之间的关系,得到一个值分布在[0,1]之间的(2,2)\alpha概率分布矩阵。
  • 根据每个单词之间的概率分布,乘上对应Values值(点积),Z=softmax(score)\cdot V,V的维度是(2,64),最终得到Z是(2,64)的矩阵。

Multi-Attention就是在self-attention的基础上,对于输入的embedding矩阵使用多组WQ,WK,WV得到多组Query,Keys,Values,然后每组分别计算得到一个Z矩阵,将多个Z矩阵拼接。该模型是用了8组WQ,WK,WV。

2、Add&Norm

Add

在Z的基础上加一个残差块,防止在深度神经网络训练中发生退化问题。

上图为一个残差块的构造,X是输入,F(x)是经过第一层线性变化并激活后的输出。在第二层线性变化后、激活之前,F(x)加入了输入值x,然后再激活输出。

要完成恒等映射,只要使F(x)=0,而一般初始化神经网络参数就是设置[0,1]之间的随机数,经过网络变换,很容易接近于0.

并且relu函数能够将负数激活为0,过滤了负数的线性变化。这样当网络自己决定哪些层是冗余层时,使用resnet很大程度上解决了学习恒等映射的问题,使得有了这些冗余层和没有这些冗余层的网络效果相同,解决网络退化问题。

Normalize

在神经网络训练之前,需要对输入数据进行Normalize归一化,为了加快训练的速度和提高训练的稳定性。这里使用的是Layer Normalization(LN)。

但为什么不使用Batch Normalization(BN)?因为LN是在同一个样本中不同神经元之间进行归一化;BN是在同一个batch中不同样本之间进行归一化,是对于同一维度的。但NLP(自然语言处理)中输入的都是词向量,单独去分析它每一维度是没有意义的,所以不用BN

3、Feed Forward

全连接层公式  FFN(x)=max(0,xW_{1}+b_{1})W_{2}+b_{2}

这里是一个两层的神经网络,先线性变换,再ReLU非线性,再线性变换。x即为Multi-Head Attention输出的Z。

假设Z是(2,64),W1是(64,1024),W2和W1相反是(1024,64),则FFN(Z)=(2,64)x(64,1024)x(1024,64)=(2,64),维度没有变化。所以这两层就是为了将Z映射到更高维的空间中,通过ReLU筛选,再变回原来的维度。

然后再经过Add&Norm,输入下一个encoder,6个都经过后输入到decoder。

三、Decoder

Decoder block也是由6个decoder堆叠。每个decoder由Masked Multi-Head Attention,Multi-Head Attention和全连接神经网络FNN构成。

Decoder的输入,前文提到训练时接受target数据。而预测时的输入,一开始是起始符,然后每次输入是上一刻Transformer的输出。例如,输入“”,输出“我”,输入“我”,输出“我爱”,输入“我爱”,输出“我爱你”,输入“我爱你”,输出“我爱你”结束。

1、Masked Multi-Head Attention

与encoder中Multi-Head Attention计算原理一样,只是多加了一个mask掩码,对某些值进行掩盖,使其在参数更新时不产生效果。

padding mask

每个批次输入序列长度不一样,我们要对输入序列进行对齐。在短序列后面填充0,在长序列截取左边的内容,舍弃多余序列。因为填充的位置是没什么意义的,所以注意力机制不应该把注意力放在这些位置上。

把这些位置加上一个负无穷,经过softmax,概率就会接近0.

Encoder的Multi-Head Attention也需要padding mask。

sequence mask

对于一个序列,在t时刻,decoder应该只能依赖于t时刻之前的输出,不能看见t之后的输出,所以要把t之后的隐藏起来。这只在训练时有效,因为训练时要将target数据输入进decoder,预测就不需要,预测的时候我们也只能得到前一个时刻的输出。

产生一个三角矩阵,上三角的值为0,把这个矩阵作用在序列上。

2、Multi-Head Attention

Encoder的Multi-Head Attention是基于Self-Attention的,Decoder的Multi-Head Attention就只基于Attention,它的输入Query来自Masked Multi-Head Attention的输出,Keys和Values来自于Encoder最后一层输出。

然后就进入全连接神经网络,和Encoder一样,再输出进入下一个decoder,经过6个decoder后到达最后输出层

四、Output

先经过一次线性变换,然后softmax得到输出的概率分布,通过词典,输出概率最大的对应的单词作为预测输出。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/887018
推荐阅读
相关标签
  

闽ICP备14008679号