RNN、LSTM、Seq2Seq

1. RNN

ht-1与xt的结合具体是通过tanh函数,如下:

特性是输出与输入长度相同,权值共享,只有一组A的参数,每一时刻的隐藏状态的输出ht=tanh(w1*xt+w2*ht-1+b1),实际上每个时刻的输出是:yt=softmax(w3*ht + b2)

RNN的缺点:存在着梯度消失/爆炸以及对长信息不敏感的问题,随着间隔变大,前面的信息会被冲淡,后面的预测无法连接到太前的信息,所以LSTM就被提出来了。

2. LSTM

LSTM是一种特殊结构的RNN,它能够学习长期依赖。相比于普通的RNN只通过tanh进行结合,LSTM通过四个网络层进行结合。

如图所示,LSTM最关键的是神经元状态cell state,它贯穿整个流程,相当于长期记忆,而下面的ℎt则代表短期记忆。LSTM中cell state的信息可以被增加或者删除,这是通过门限来实现的。门限是一种让信息选择性通过的方式,它们是由sigmoid神经网络层和逐点相乘器做成的。

sigmoid层输出0和1之间的数字来描述一个神经元有多少信息应该被通过。输出0表示这些信息全部不能通过,而输出1则表示让所有信息都通过。一个LSTM有三个这样的门限,去保护和控制神经元的状态。

LSTM的第一步就是决定前面的所有信息Ct-1哪些应该被神经元遗忘。这是一个被称为“遗忘门层”的sigmod层组成。他输入ℎ−1和xt(上一次的输出以及这轮的输入),然后在Ct-1的每个神经元状态输出0和1之间的数字。

其中[ht-, xt]表示concat操作。

第二步就是决定我们要在cell state中保留什么信息。这包括两个部分。首先,一个被称为“输入门层”的sigmoid层会决定我们要更新的数值。然后通过与tanh层处理后的信息进行点级相乘,从而筛选出当前步应该加入到神经元cell state状态的信息。在下一步中,我们将会组合这两步去生成一个新的更新状态值。

第三步我们需要通过输出门决定当前状态ht要输出什么。首先,使用sigmoid层决定哪一部分的神经元状态cell state Ct需要被输出;然后我们让cell state Ct经过tanh(让输出值变成-1到1之间)层并且乘上sigmod门限的输出,这样我们就只输出我们想要输出的。即ht=ot*tanh(Ct)

整体流程就是:

给旧的状态乘一个遗忘系数ft,来遗忘掉Ct-1中要遗忘的信息,然后我们增加it* 到神经元状态,即Ct= ft*Ct-1 + it*, ht=ot*tanh(Ct)。

Seq2Seq

做文本需要把句子进行tokenization,即把一句话分成很多个单词或者字符,tokenization可以是char-level,也可以是word-level,顾名思义前者就是会把一句话分为一个个字符,而后者则会把一句话分成一个个单词,视情况而定。

Seq2Seq有一个编码器和一个解码器,编码器一般是LSTM或者其他模型用于提取特征,它的最后的输出就是(从这句话)提取的最后的特征,而其他的隐层输出都被丢弃。

编码器提取特征之后就到了解码器,解码器靠编码器最后输出的特征也就是(ℎ,C)来知道这句话是"go away",这里要强调一下Decoder的初始状态就是Encoder的最后一个状态h,现在Decoder开始输出德语字母,Decoder可以是LSTM模型,他每次接受一个输入然后输出下一个字母的概率,第一个输入必须是起始符,这就是我们为什么要在德语字典中要加入起始符的原因。Decoder会输出一个概率分布p向量,起始符后面的第一个字母是m,我们将m做一个one-hot编码作为y标签,用标签y和预测p做一个CrossEntropy来作为我们的损失函数优化,梯度从Decoder传回Encoder。

Seq2Seq 是一种重要的 RNN 模型,也称为 Encoder-Decoder 模型,可以理解为一种 N×M的模型。模型包含两个部分:Encoder 用于编码序列的信息,将任意长度的序列信息编码到一个向量 c 里。而 Decoder 是解码器,解码器得到上下文信息向量 c 之后可以将信息解码,并输出为序列。

seq2seq主要又如下三种:

从上式可以看到,c可以直接使用最后一个神经元的隐藏状态 hN 表示;也可以在最后一个神经元的隐藏状态上进行某种变换得到;也可以使用所有神经元的隐藏状态 h1, h2, ..., hN 计算得到。得到上下文向量 c 之后,需要传递到 Decoder。

Attention

Seq2Seq模型有一个缺点就是句子太长的话encoder会遗忘,那么decoder接受到的句子特征也就不完全。

在 Seq2Seq 模型,Encoder 总是将源句子的所有信息编码到一个固定长度的上下文向量 c中,然后在 Decoder 解码的过程中向量 c 都是不变的。这存在着不少缺陷:

1. 对于比较长的句子,很难用一个定长的向量 c 完全表示其意义。

2. 与人类的注意力方式不同,即人类在阅读文章的时候,会把注意力放在当前的句子上。

用了注意力机制,Decoder每次更新状态的时候都会再看一遍encoder所有状态,还会告诉decoder要更关注哪部分,这也是attention名字的由来。但是缺点就是计算量很大。

Attention:

解码的每个step用decoder的隐藏状态和Encoder的每个隐藏状态计算相似度,然后将相似度和对应的隐藏状态进行加权得到带有attention的上下文,而不是seq2seq中每一步解码的上下文都一样。

Transformer:

Query矩阵(Q):表示当前的关注点或信息需求,用于与Key矩阵进行匹配。

Key矩阵(K):包含输入序列中各个位置的标识信息,用于被Query矩阵查询匹配。

Value矩阵(V):存储了与Key矩阵相对应的实际值或信息内容,当Query与某个Key匹配时,相应的Value将被用来计算输出。

单头Attention通过计算每个token的查询向量与所有token的键向量的点积,并经过softmax归一化得到注意力权重,再将这些权重应用于值向量进行加权求和,从而生成每个token的自注意力输出表示。

  • 每个token对应的value向量乘以Attention权重,并相加,得到当前token的Self-Attention value向量

多头Attention(Multi-Head Attention):通过并行运行多个Self-Attention层并综合其结果,能够同时捕捉输入序列在不同子空间中的信息,从而增强模型的表达能力,每个“头”都独立地学习不同的注意力权重。这些“头”的输出随后被合并(通常是拼接后再通过一个线性层(乘一个线性矩阵)),以产生最终的输出表示。

 

multi-head attention的流程可以总结如下

1. 输入线性变换:对于输入的Query(查询)、Key(键)和Value(值)向量,首先通过线性变换将它们映射到不同的子空间。这些线性变换的参数是模型需要学习的。
2. 分割多头:经过线性变换后,Query、Key和Value向量被分割成多个头。每个头都会独立地进行注意力计算。
3. 缩放点积注意力:在每个头内部,使用缩放点积注意力来计算Query和Key之间的注意力分数。这个分数决定了在生成输出时,模型应该关注Value向量的部分。
4. 注意力权重应用:将计算出的注意力权重应用于Value向量,得到加权的中间输出。这个过程可以理解为根据注意力权重对输入信息进行筛选和聚焦。
5. 拼接和线性变换:将所有头的加权输出拼接在一起,然后通过一个线性变换得到最终的Multi-Head Attention输出。

Transformer中的编码器部分一共由N个相同的编码器层组成。每个编码器层都有两个子层,即多头注意力层(Multi-Head Attention)层和前馈神经网络(Feed-Forward Network)。在每个子层后面都有残差连接(图中的虚线)和层归一化(LayerNorm)操作,二者合起来称为Add&Norm操作。

transformer的解码器

Transformer中的解码器部分同样一共N个相同的解码器层组成。每个解码器层都有三个子层,掩蔽自注意力层(Masked Self-Attention)、Encoder-Decoder注意力层、前馈神经网络(Feed-Forward Network)。在每个子层后面同样有残差连接(图中的虚线)和层归一化(LayerNorm)操作。

Transformer的一些重要组成部分和特点:

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

Transformer的结构:

Encoder block由6个相同的encoder堆叠而成,每个Encoder是由一个Multi-Head Attention和由全连接神经网络组成的Feed Forward Network构成。

整体结构如下:

简略图如下

Transformer的编码组件是由6个编码器叠加在一起组成的,解码器同样是6个decoder组成。所有的编码器在结构上是相同的,但是不共享参数。编码器的简略结构如下:

自注意力的作用:随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。它的作用包括:

1. 序列建模:捕捉序列中不同位置的依赖关系,从而更好地理解上下文。

2. 并行计算:自注意力可以并行计算,相比于RNN和CNN等序列模型,它更容易在GPU和TPU等硬件上进行高效的训练和推理

3. 长距离依赖捕捉:传统的循环神经网络(RNN)在处理长序列时可能面临梯度消失或梯度爆炸的问题。自注意力可以更好地处理长距离依赖关系,因为它不需要按顺序处理输入序列。

自注意力的结构如下:

自注意力的计算流程如下:

1. 从每个编码器的输入向量embedding X_{i}(每个单词的词向量,即Embedding,可以通过word2vec,GloVe,one-hot编码等生成)与三个权重矩阵W^{Q}W^{K}W^{V}生成Q_{i}K_{i}V_{i}三个向量,Q_{i}K_{i}V_{i}的维度通常会比 X_{i}低很多。

生成Q、K、V更具体的流程如下:

计算得分的过程是使用所有单词的key对当前单词的通过计算点积来打分,假设我们在为这个例子中的第一个词“Thinking”计算自注意力向量,我们需要拿输入句子中的每个单词对“Thinking”打分。这些分数是通过输入句子的所有单词的键向量与“Thinking”的查询向量相点积来计算的。

然后将分数除以点积的平方根(也可以是其他值)防止点积过大,这样能使得梯度更稳定。然后通过softmax使所有单词的分数归一化,得到的分数都是正值且和为1。随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。

这个softmax分数决定了每个单词对编码当下单词(“Thinking”)的贡献。显然,单词本身对自己将获得最高的softmax分数

然后将每个值向量V乘以softmax分数,让模型关注语义上相关的单词,并弱化不相关的单词(例如,让它们乘以0.001这样的小数)。

整体流程简化如下:

然后将得到的向量z传递给前馈神经网络。

“多头”注意力机制是对注意力的增强

作用是扩展了模型关注不同位置的能力,有多组WQ,WK,WV得到多组查询、键、值矩阵,并且每一个都是随机初始化的,然后每组分别计算得到一个Z矩阵。

分别计算8个Z矩阵之后,将它们cat拼接起来,然后将它与权重矩阵WO相乘,得到ZO作为输出,融合了多头注意力的信息,再输入到前馈神经网络。

整体流程如下:

使用位置编码表示序列的顺序

为什么要用位置编码?

如果不添加位置编码,那么无论单词在什么位置,它的注意力分数都是确定的,因为单词的embedding是不变的。这不是我们想要的。
为了理解单词顺序,Transformer为每个输入的词嵌入添加了一个向量,这样能够更好的表达词与词之间的位置关系。词嵌入与位置编码相加,而不是拼接,他们的效率差不多,但是拼接的话维度会变大,所以不考虑。

为了让模型理解单词的顺序,我们添加了位置编码向量,这些向量的值遵循特定的模式,如sine、cosine函数。

在经过多头注意力机制得到矩阵Z之后,并没有直接传入全连接神经网络,而是经过了一步Add&Normalize。

加入add层的作用是防止随着网络层数的增加发生信息退化的现象。

全连接层:

全连接层是一个两层的神经网络,先线性变换,然后ReLU非线性,再线性变换。
这两层网络就是为了将输入的Z映射到更加高维的空间中然后通过非线性函数ReLU进行筛选,筛选完后再变回原来的维度。
经过6个encoder后输入到decoder中。

decoder:

和Encoder Block一样,Decoder也是由6个decoder堆叠而成的,Nx=6。包含两个 Multi-Head Attention 层。第一个 Multi-Head Attention 层是self-attention层,采用了 Masked 操作。第二个 Multi-Head Attention 层是cross-attention层,K, V矩阵使用 Encoder 的编码信息矩阵C进行计算,而Q使用上一个 Decoder block 的输出计算。

Masked Multi-Head Attention
与Encoder的Multi-Head Attention计算原理一样,只是多加了一个mask码。mask 表示掩码,它对某些值进行掩盖,使其在参数更新时不产生效果。Transformer 模型里面涉及两种 mask,分别是 padding mask 和 sequence mask。为什么需要添加这两种mask码呢?

padding mask
由于每个批次输入序列长度是不一样的,也就是说,我们要对输入序列进行对齐。具体来说,就是给在较短的序列后面填充 0。但是如果输入的序列太长,则是截取左边的内容,把多余的直接舍弃。因为这些填充0的位置,其实是没什么意义的,所以我们的attention机制不应该把注意力放在这些位置上,所以我们需要进行一些处理。
具体的做法是,把这些位置的值加上一个非常大的负数(负无穷),这样的话,经过 softmax,这些位置的概率就会接近0!

sequence mask
sequence mask 是为了使得 decoder 不能看见未来的信息。对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此我们需要想一个办法,把 t 之后的信息给隐藏起来。这在训练的时候有效,因为训练的时候每次我们是将target数据完整输入进decoder中的,预测时不需要,预测的时候我们只能得到前一时刻预测出的输出。
具体做法是:产生一个上三角矩阵,上三角的值全为0。把这个矩阵作用在每一个序列上,就可以达到我们的目的。

注意:
1、在Encoder中的Multi-Head Attention也是需要进行mask的,只不过Encoder中只需要padding mask即可,而Decoder中需要padding mask和sequence mask。
2、Encoder中的Multi-Head Attention是基于Self-Attention的,Decoder中的第二个Multi-Head Attention则是基于cross-Attention,它的输入Quer来自于Masked Multi-Head Attention的输出,Keys和Values来自于Encoder中最后一层的输出。

Decoder的输出:
Output如图中所示,首先经过一次线性变换(线性变换层是一个简单的全连接神经网络,它可以把解码组件产生的向量投射到一个比它大得多的,被称为对数几率的向量里),然后Softmax得到输出的概率分布(softmax层会把向量变成概率),然后通过词典,输出概率最大的对应的单词作为我们的预测输出。

transformer的优缺点:
优点:
1、效果好
2、可以并行训练,速度快
3、很好的解决了长距离依赖的问题
缺点:
完全基于self-attention,对于词语位置之间的信息有一定的丢失,虽然加入了positional encoding来解决这个问题,但也还存在着可以优化的地方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值