Transformer学习总结

一、背景

论文:https://arxiv.org/pdf/1706.03762

代码:https://github.com/huggingface/transformers

参考博客:https://blog.csdn.net/weixin_42475060/article/details/121101749

二、个人解读

1、Transformer是什么?

        Transformer是一种用于自然语言处理(NLP)和其他序列到序列(sequence-to-sequence)任务的深度学习模型架构,它在2017年由Vaswani等人首次提出。Transformer架构引入了自注意力机制(self-attention mechanism),这是一个关键的创新,使其在处理序列数据时表现出色。
        以下是Transformer的一些重要组成部分和特点:

(1)自注意力机制(Self-Attention):这是Transformer的核心概念之一,它使模型能够同时考虑输入序列中的所有位置,而不是像循环神经网络(RNN)或卷积神经网络(CNN)一样逐步处理。自注意力机制允许模型根据输入序列中的不同部分来赋予不同的注意权重,从而更好地捕捉语义关系。
(2)多头注意力(Multi-Head Attention):Transformer中的自注意力机制被扩展为多个注意力头,每个头可以学习不同的注意权重,以更好地捕捉不同类型的关系。多头注意力允许模型并行处理不同的信息子空间。
(3)堆叠层(Stacked Layers):Transformer通常由多个相同的编码器和解码器层堆叠而成。这些堆叠的层有助于模型学习复杂的特征表示和语义。
(4)位置编码(Positional Encoding):由于Transformer没有内置的序列位置信息,它需要额外的位置编码来表达输入序列中单词的位置顺序。
(5)残差连接和层归一化(Residual Connections and Layer Normalization):这些技术有助于减轻训练过程中的梯度消失和爆炸问题,使模型更容易训练。
(6)编码器和解码器:Transformer通常包括一个编码器用于处理输入序列和一个解码器用于生成输出序列,这使其适用于序列到序列的任务,如机器翻译。

2、基本结构

        Transformer的基本结构如图1所示,包括输入编码器解码器输出部分组成。

图1 Transformer的模型结构

2.1 输入(Input)

        在输入部分包括了两部分的内容,分别是词嵌入(embeddings)和位置编码(Positional Encoding)。

        与别的序列转换模型(sequeue transduction models)类似,在Transformer中同样使用了学习的嵌入(learned embeddings)来将输入词元(input tokens)和输出词元(output tokens)转换成d_{model}维的向量作为词嵌入。其中的用于嵌入编码的权重矩阵是用的同一套,确保了编码的一致性。

        在位置编码部分,因为Transformer模型没有循环或者卷积的部分,为了能够有效利用输入句子中的词序关系,需要对每一个词嵌入的位置进行编码,以标记它们之间的词序关系(若没有位置编码,则可能会导致学习歧义,比如某句子中包含“I”、“Love”、“You”三个词,该句子可能是“I Love You”或者是“You Love I”等,在自注意力计算的时候可能会出现歧义)。位置编码的方式有很多种,关键是能够有效地区分d_{model}维的输入的位置信息,在Transformer中采用的三角函数对位置编码如下图所示:

对于偶数维位置编码使用sin函数,对于奇数维位置编码使用的是cos函数,这样处理之后,能够有效地对每一个位置进行编码。之所以选择正弦版本,因为它可能允许模型外推到比训练期间遇到的序列长度更长的序列长度(We chose the sinusoidal version because it may allow the model to extrapolate to sequence lengths longer than the ones encountered during training)。

        进行完词嵌入和位置编码处理之后,将其结果相加作为encoder和decoder的输入(之所以采用相加的方式是因为相加和拼接的方式起到的效果差不多,而相加能够有效减少输入的维度)。

2.2 编码器(Encoder)

        在编码器部分采用了自注意力机制、多头注意力机制、前馈神经网络、残差连接。编码器的结构如下图所示:

其中,编码器部分由N个编码器串联堆叠而成,第一个编码器接受词嵌入和位置编码相加的结果,其它编码器的输入来自于前一个编码器的输出。通过多个编码器的串联堆叠能够提取不同层级的特征。

2.2.1 Scaled Dot-Product Attention

        编码器首先是一个多头注意力机制(Multi-Head Attention),使用多头注意力的目的是为了将输入映射到不同的子空间中,提取不同子空间中的特征,使网络模型能够有更好的分辨能力。其中,每一个多头注意力机制包含有h个Scaled Dot-Product Attention(个人理解,论文中的自注意力机制其实指的是多头注意力,当然h可以取1,这就只有一个Scaled Dot-Product Attention了),如下图所示:

        其中的Scaled Dot-Product Attention的数学表达式如下:

其中Q、K、V分别由以下公式生成:

Q=X\cdot W_{q}

K=X\cdot W_{k}

V=X\cdot W_{v}

d_{k}为Q和K的维度。除以\sqrt{d_{k}}是进行了Scaled的操作,模型希望在不同维度的输入下能够将数值控制在一定的范围内进行计算,以更好地适应不同维度输入数据的学习。通过计算QK^{T}能够获得句子中所有词对当前值的一个注意力。通过softmax计算之后,将注意力的大小以一个概率大小进行表示(这里的作用是强化相关词的注意力,弱化不相关词的注意力,如“I have a dog, it is lovely!”,这句话中的“it”指向的是“dog”而不是“I”,所以我们希望学习到与之强相关的是“dog”,与之弱相关的是“I”等)。

        然后,将结果点乘V得到注意力的输出,在这里其实类似于一个加权求和的操作。在论文中,作者希望将输入表示(词嵌入和位置编码)通过Scaled Dot-Product Attention转化成中间输出表示(Most competitive neural sequence transduction models have an encoder-decoder structure. Here, the encoder maps an input sequence of symbol representations (x_{1}, ..., x_{n}) to a sequence of continuous representations z = (z_{1}, ..., z_{n}))。

        在整个过程中,Q、K、V都是分别由输入X点乘一个可学习权重( W_{q}W_{k}W_{v})得到的,这也可以理解自注意力中的“自”的意思了。
2.2.2 Multi-Head Attention
        多头注意力就是将h个不同的Scaled Dot-Product Attention头输出进行特征拼接,然后通过一个线性层对拼接特征进行维度缩放处理,生成一个与输入维度相同的输出,如下图所示。

        多头注意力机制实际就是将不同子空间中提取到的特征进行融合学习处理。多头注意力的实现公式如下图所示。

其中W^{Q}_{i}\in \mathbb{R}^{d_{model}\times d_{k}}W^{K}_{i}\in \mathbb{R}^{d_{model}\times d_{k}}W^{V}_{i}\in \mathbb{R}^{d_{model}\times d_{v}}W^{O}\in \mathbb{R}^{hd_{v}\times d_{model}}

        再将多头注意力的输出与输入进行残差连接(经过线性层Linear之后,输出的维度与输入的维度相同,因此可以可以进行concat、add等操作,在论文中作者采用的是add操作)。然后再经过层归一化(Layer Normalization)操作,生成自注意力层的输出(前馈层的输入)。如下图所示。

        在论文中,作者通过三种不同的方式使用了多头注意力机制:

        (1)在“编码-解码注意力层”(encoder-decoder attention layers),编码器的K、Q、V来自于上一个解码器的输出,编码器的K、V来自于同级编码器的输出、Q来自上一级解码器的输出。这允许解码器中的每一个位置都能够关注输入序列的所有位置。如下图所示。

        (2)在编码器里,自注意力层的K、Q、V都来自于前一层编码器的输出,编码器的每一个位置都能够关注上一层编码器的所有位置。

        (3)解码器的自注意力层允许解码器的每一个位置关注包括自身在内的编码器中的所有位置。为了防止解码器中的左向信息流的影响并能保持回归的特性(即学习获得通过前文推断后文的能力),作者采用了将右侧信息masked的做法,将右侧信息(非法链接)设为-\infty,这样在进行softmax的时候会获得一个很小的值(可以忽略不计)。如下图所示。

2.2.3 Feed Forward
        在前馈层(Feed Forward)采用了全连接层来进行层关注。前馈层包括两个线性转换,并且使用ReLU函数作为激活函数,其数学表达式如下所示。

在论文的前馈层设置中,输入和输出都是512维,中间层是2048维。然后将输出和输入进行残差连接。如下图所示。

2.3 解码器(Decoder)

        Transformer的每个解码器包括初级解码器和次级解码器。初级解码器的输入为来自右移输出(Output shifted right)和位置编码相加的结果,次级解码器的K、V来自于同级编码器、Q来自于上级解码器。如下图所示。

        解码器里面同样使用了自注意力层和前馈层,与编码器不同的地方主要是区块的输入和在初级解码器中增加了Masked操作。这在第2.2.2节已经进行了介绍。

2.4 输出(Output)

        输出层的输入来自最后一级解码器的输出,然后经过线性层和softmax层输出最后的可能结果(Output Probabilities)。在论文中作者使用学习的嵌入(learned embeddings)将输入词元和输出词元转换成一个d_{demol}维的向量,并且使用线性层和softmax层来将解码器的输出转换成下一个词的可能性输出,该可能性输出还需要通过学习嵌入转换成对应的词元(在学习嵌入的时候还会除以\sqrt{d_{model}}来执行scaled的操作)。如下图所示。

三、实验结果

        (请翻阅原论文,总之对比以前的方法有一个很不错的提升!)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值