神经网络/深度学习(二)

Seq2Seq 模型
Encoder-Decoder
Attention 机制
Self-Attention 自注意力机制
Transformer

摘文不一定和目录相关,但是取自该链接

1. Seq2Seq 模型详解

https://baijiahao.baidu.com/s?id=1650496167914890612&wfr=spider&for=pc

Seq2Seq 是一种循环神经网络的变种,包括编码器 (Encoder) 和解码器 (Decoder) 两部分。Seq2Seq 是自然语言处理中的一种重要模型,可以用于机器翻译、对话系统、自动文摘。

1.1 RNN 结构及使用

在这里插入图片描述
每个神经元接受的输入包括:前一个神经元的隐藏层状态 h(用于记忆) 和当前的输入 x (当前信息)。神经元得到输入之后,会计算出新的隐藏状态 h 和输出 y,然后再传递到下一个神经元。因为隐藏状态 h 的存在,使得 RNN 具有一定的记忆功能。

针对不同任务,通常要对 RNN 模型结构进行少量的调整,根据输入和输出的数量,分为三种比较常见的结构:N vs N、1 vs N、N vs 1

N vs N

N vs N 模型

上图是RNN 模型的一种 N vs N 结构,包含 N 个输入 x1, x2, …, xN,和 N 个输出 y1, y2, …, yN。N vs N 的结构中,输入和输出序列的长度是相等的,通常适合用于以下任务:
(1)词性标注
(2)训练语言模型,使用之前的词预测下一个词等

1 vs N

在这里插入图片描述在这里插入图片描述

在 1 vs N 结构中,我们只有一个输入 x,和 N 个输出 y1, y2, …, yN。可以有两种方式使用 1 vs N,第一种只将输入 x传入第一个 RNN 神经元,第二种是将输入 x 传入所有的 RNN 神经元。1 vs N 结构适合用于以下任务:
(1)图像生成文字,输入 x 就是一张图片,输出就是一段图片的描述文字。
(2)根据音乐类别,生成对应的音乐。
(3)根据小说类别,生成相应的小说。

N vs 1

在这里插入图片描述

在 N vs 1 结构中,我们有 N 个输入 x1, x2, …, xN,和一个输出 y。N vs 1 结构适合用于以下任务:
(1)序列分类任务,一段语音、一段文字的类别,句子的情感分析。

1.2 Seq2Seq 模型

上面的三种结构对于 RNN 的输入和输出个数都有一定的限制,但实际中很多任务的序列的长度是不固定的,例如机器翻译中,源语言、目标语言的句子长度不一样;对话系统中,问句和答案的句子长度不一样。

Seq2Seq 是一种重要的 RNN 模型,也称为 Encoder-Decoder 模型,可以理解为一种 N×M的模型。模型包含两个部分:Encoder 用于编码序列的信息,将任意长度的序列信息编码到一个向量 c 里。而 Decoder 是解码器,解码器得到上下文信息向量 c 之后可以将信息解码,并输出为序列。Seq2Seq 模型结构有很多种,下面是几种比较常见的:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. Encoder-Decoder

https://blog.csdn.net/qq_47537678/article/details/121921381
浅谈 Attention 机制的理解

Encoder-Decoder 通常称作 编码器-解码器 ,是深度学习中常见的模型框架,很多常见的应用都是利用编码-解码框架设计的。

Encoder 和 Decoder 部分可以是任意文字,语音,图像,视频数据,模型可以是 CNN,RNN,LSTM,GRU,Attention 等等。所以,基于 Encoder-Decoder,我们可以设计出各种各样的模型。

Encoder-Decoder 有一个比较显著的特征就是它是一个 End-to-End 的学习算法,以机器翻译为例,可以将法语翻译成英语。这样的模型也可以叫做 Seq2Seq

编码,就是将输入序列转化转化成一个固定长度向量。解码,就是讲之前生成的固定向量再转化出输出序列。

Encoder 又称作编码器。它的作用就是「将现实问题转化为数学问题」
在这里插入图片描述
Decoder 又称作解码器,他的作用是「求解数学问题,并转化为现实世界的解决方案」

在这里插入图片描述
将两者连接起来:
在这里插入图片描述

Seq2Seq模型

Seq2Seq ( Sequence-to-sequence 的缩写),就如字面意思,输入一个序列,输出另一个序列。这种结构最重要的地方在于输入序列和输出序列的长度是可变的

Seq2Seq 强调目的,不特指具体方法,满足输入序列,输出序列的目的,都可以统称为 Seq2Seq 模型。Seq2Seq 使用的具体方法基本都是属于 Encoder-Decoder 模型的范畴。

Seq2Seq模型是一类端到端(end-to-end)的算法框架,通过编码器-解码器架构来实现。

目标:给定长度为 m 的输入序列
在这里插入图片描述
生成长度为 n 的目标序列
在这里插入图片描述
在机器翻译中,x 和 y 分别代表输入和输出的两个句子。
在这里插入图片描述
上图中:
编码器隐向量(hidden states):
在这里插入图片描述
解码器隐向量:
在这里插入图片描述

编码器实现将输入的任意长度的输入序列映射为固定长度的上下文序列 c,该上下文序列为输入序列的一个中间编码表示,表达为
在这里插入图片描述
解码器用来将上述固定长度的中间序列c映射为变长度的目标序列作为最终输出 y。
在这里插入图片描述

  • 问题一
    当输入序列的长度过长时,上下文序列将无法表示整个输入序列的信息。
    Seq2Seq模型理论上可以接受任意长度的序列作为输入,但是机器翻译的实践表明,输入的序列越长,模型的翻译质量越差。产生这一问题的原因在于无论输入序列的长短,编码器都会将其映射为一个具有固定长度的上下文序列c

  • 问题二
    在生成每一个目标元素 [公式] 时使用的下文序列 [公式] 都是相同的,这就意味着输入序列 x 中的每个元素对输出序列 [公式] 中的每一个元素都具有相同的影响。
    事实上在一个输入序列中,不同元素所携带的信息量是不同的,受到关注的程度也自然存在差异

引入“注意力”机制

在这里插入图片描述

在注意力模型中,每一个上下文序列为编码器所有隐状态向量的加权和
在这里插入图片描述
将输入序列映射为多个下文序列 c1, c2, c3,…, cn,其中 ci 是与输出 yi 对应的上下文信息(其中 i = 1, 2, 3, …, n)。在解码器预测输出 yi 时,其结果依赖与之匹配的上下文序列 ci 以及其之前的隐状态,即
在这里插入图片描述
注意力模块可以视为是一个具有 m 个输入节点和 n 个输出节点的全连接神经网络。

Transformer中的 Encoder-Decoder

Transformer模型采用的也是编码器-解码器架构,但是在该模型中,编码器和解码器不再是 RNN结构,取而代之的是编码器栈(encoder stack)和解码器栈(decoder stack)(注:所谓的“栈”就是将同一结构重复多次,“stack”翻译为“堆叠”更为合适)。编码器栈和解码器栈中分别为连续 N(在 Transformer模型中 N = 6)个具有相同结构的编码器和解码器。
下图为Transformer模型的编码器-解码器架构示意图。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在每个解码器中,除了包含与解码器类似的自注意力模块和全连接前馈网络外,还额外在两个子网络之间添加了另外一个注意力模块(注:该注意力模块称为“编码-解码注意力”模块,同样也是采用多头注意力结构)。与编码器类似,解码器中的三个子网络也均具有残差连接,并且在每个残差合成其后都进行归一化操作。

  • Transformer 中 Encoder 由 6 个相同的层组成,每个层包含 2 个部分:
    Multi-Head Self-Attention
    Position-Wise Feed-Forward Network (全连接层)
  • Decoder 也是由 6 个相同的层组成,每个层包含 3 个部分:
    Multi-Head Self-Attention
    Multi-Head Context-Attention
    Position-Wise Feed-Forward Network

在这里插入图片描述

3. Attention 机制

https://www.cnblogs.com/ydcode/p/11038064.html
Encoder-Decoder 框架下的机器翻译的抽象表示如下图:
在这里插入图片描述

注意力机制模仿了生物观察行为的内部过程,即一种将内部经验和外部感觉对齐从而增加部分区域的观察精细度的机制。例如人的视觉在处理一张图片时,会通过快速扫描全局图像,获得需要重点关注的目标区域,也就是注意力焦点。然后对这一区域投入更多的注意力资源,以获得更多所需要关注的目标的细节信息,并抑制其它无用信息。

Encoder-Decoder 框架虽然应用广泛,但是其存在的局限性也比较大。其最大的局限性就是 Encoder 和 Decoder 之间只通过一个固定长度的语义向量 C 来唯一联系。也就是说,Encoder 必须要将输入的整个序列的信息都压缩进一个固定长度的向量中,存在两个弊端一是语义向量 C 可能无法完全表示整个序列的信息;二是先输入到网络的内容携带的信息会被后输入的信息覆盖掉,输入的序列越长,该现象就越严重。这两个弊端使得 Decoder 在解码时一开始就无法获得输入序列最够多的信息,因此导致解码的精确度不够准确。

在上述的模型中,Encoder-Decoder 框架将输入 X 都编码转化为语义表示 C,这就导致翻译出来的序列的每一个字都是同权地考虑了输入中的所有的词。例如输入的英文句子是:Tom chase Jerry,目标的翻译结果是:汤姆追逐杰瑞。在未考虑注意力机制的模型当中,模型认为 汤姆 这个词的翻译受到 Tom,chase Jerry 这三个词的同权重的影响。但是实际上显然不应该是这样处理的,汤姆 这个词应该受到输入的 Tom 这个词的影响最大,而其它输入的词的影响则应该是非常小的。显然,在未考虑注意力机制的 Encoder-Decoder 模型中,这种不同输入的重要程度并没有体现处理,一般称这样的模型为 分心模型

而带有 Attention 机制的 Encoder-Decoder 模型则是要从序列中学习到每一个元素的重要程度,然后按重要程度将元素合并。因此,注意力机制可以看作是 Encoder 和 Decoder 之间的接口,它向 Decoder 提供来自每个 Encoder 隐藏状态的信息。通过该设置,模型能够选择性地关注输入序列的有用部分,从而学习它们之间的“对齐”。这就表明,在 Encoder 将输入的序列元素进行编码时,得到的不在是一个固定的语义编码 C ,而是存在多个语义编码,且不同的语义编码由不同的序列元素以不同的权重参数组合而成。一个简单地体现 Attention 机制运行的示意图如下:
在这里插入图片描述
x
在这里插入图片描述
在这里插入图片描述
Attention机制跟人类翻译文章时候的思路有些类似,即将注意力关注于我们翻译部分对应的上下文,同样的,Attention模型中,当我们翻译当前词语时,我们会寻找源语句中相对应的几个词语,并结合之前的已经翻译的部分作出相应的翻译,如下图所示,当我们翻译“knowledge”时,只需将注意力放在源句中“知识”的部分,当翻译“power”时,只需将注意力集中在"力量“。这样,当我们decoder预测目标翻译的时候就可以看到encoder的所有信息,而不仅局限于原来模型中定长的隐藏向量,并且不会丧失长程的信息。小视频

https://zhuanlan.zhihu.com/p/47063917

Attention 机制原理

到目前为止,相信各位客官对 Attention 机制的思想和作用都有了一定的了解。接下来,我们将对 Attention 机制的具体实现原理进行剖析。

Attention 机制的一个重点就是获得 attention value,即机器翻译中的语义编码 Ci。在上一节中我们知道该值是通过输入元素按照不同的权重参数组合而成的,所以我们可以将其定义为一个 attention 函数,比较主流的 attention 函数的机制是采用键值对查询的方式,其工作实质如下图所示:
在这里插入图片描述
在自然语言任务中,往往 Key 和 Value 是相同的。需要注意的是,计算出来的 attention value 是一个向量,代表序列元素 xj 的编码向量,包含了元素 xj 的上下文关系,即同时包含全局联系和局部联系。全局联系很好理解,因为在计算时考虑了该元素与其他所有元素的相似度计算;而局部联系则是因为在对元素 xj 进行编码时,重点考虑与其相似度较高的局部元素,尤其是其本身

阅读到一篇有关 动画图解Attention机制 的文章,这里主要是对 Attention 层的实现做下总结,详细内容请查看原文。注意力机制可以看作是神经网络架构中的一层神经网络,注意力层的实现可以分为 6 个步骤。

Step 0:准备隐藏状态

首先准备第一个 Decoder 的隐藏层状态(红色)和所有可用的 Encoder 隐藏层状态(绿色)。在示例中,有 4 个 Encoder 隐藏状态和 1 个 Decoder 隐藏状态。
在这里插入图片描述

Step 1:得到每一个 Encoder 隐藏状态的得分

分值(score)由 score 函数来获得,最简单的方法是直接用 Decoder 隐藏状态和 Encoder 中的每一个隐藏状态进行点积
在这里插入图片描述
假设 Decoder 中的隐藏状态为 [5, 0, 1],分别与 Encoder 中的每个隐藏状态做点积,得到第二个隐藏状态的分值最高,说明下一个要解码的元素将受到当前这种隐藏状态的严重影响。

decoder_hidden = [10, 5, 10]
encoder_hidden score
[0, 1, 1] 15 (= 10×0 + 5×1 + 10×1, the dot product)
[5, 0, 1] 60
[1, 1, 0] 15
[0, 5, 1] 35

Step 2:将所有得分送入 softmax 层

该部分实质上就是对得到的所有分值进行归一化,这样 softmax 之后得到的所有分数相加为 1 。而且能够使得原本分值越高的隐藏状态,其对应的概率也越大,从而抑制那些无效或者噪音信息。
在这里插入图片描述
通过 softmax 层后,可以得到一组新的隐藏层状态分数,其计算方法即为公式(7): a i j = exp ⁡ ( e i j ) ∑ k = 1 T x exp ⁡ ( e i k ) a_{i j}=\frac{\exp \left(e_{i j}\right)}{\sum_{k=1}^{T x} \exp \left(e_{i k}\right)} aij=k=1Txexp(eik)exp(eij)。注意,此处得到的分值应该是浮点数,但是由于无限接近于 0 和 1,所以做了近似。

encoder_hidden score score^
[0, 1, 1] 15 0
[5, 0, 1] 60 1
[1, 1, 0] 15 0
[0, 5, 1] 35 0


Step 3:用每个 Encoder 的隐藏状态乘以 softmax 之后的得分

通过将 每个编码器的隐藏状态与其softmax之后的分数(标量)相乘 ,我们得到 对齐向量 或标注向量。这正是对齐产生的机制
在这里插入图片描述
加权求和之后可以得到新的一组与 Encoder 隐藏层状态对应的新向量,由于之后第二个隐藏状态的分值为 1 ,而其它的为0,所以得到的新向量也只有第二个向量有效。

encoder score score^ alignment
[0, 1, 1] 15 0 [0, 0, 0]
[5, 0, 1] 60 1 [5, 0, 1]
[1, 1, 0] 15 0 [0, 0, 0]
[0, 5, 1] 35 0 [0, 0, 0]

Step 4:将所有对齐的向量进行累加

对对齐向量进行求和,生成 上下文向量 。上下文向量是前一步的对齐向量的聚合信息。
在这里插入图片描述
该步骤其实就对应了公式(6),得到最终的编码后的向量来作为 Decoder 的输入,其编码后的向量为 [5, 0, 1]。

Step 5:把上下文向量送到 Decoder 中

通过将上下文向量和 Decoder 的上一个隐藏状态一起送入当前的隐藏状态,从而得到解码后的输出。
在这里插入图片描述
最终得到完整的注意力层结构如下图所示:
在这里插入图片描述

Attention 机制的优劣

相比于传统的 RNN 和 CNN,attention 机制具有如下优点:

一步到位的全局联系捕捉,且关注了元素的局部联系;attention 函数在计算 attention value 时,是进行序列的每一个元素和其它元素的对比,在这个过程中每一个元素间的距离都是一;而在时间序列 RNNs 中,元素的值是通过一步步递推得到的长期依赖关系获取的,而越长的序列捕捉长期依赖关系的能力就会越弱。

并行计算减少模型训练时间;Attention 机制每一步的计算都不依赖于上一步的计算结果,因此可以并行处理。

模型复杂度小,参数少

但 attention 机制的缺点也比较明显,因为是对序列的所有元素并行处理的,所以无法考虑输入序列的元素顺序(和位置信息),这在自然语言处理任务中比较糟糕。因为在自然语言中,语言的顺序是包含了十分多的信息的,如果缺失了该部分的信息,则得到的结果往往会大大折扣。

简而言之,Attention 机制就是对输入的每个元素考虑不同的权重参数,从而更加关注与输入的元素相似的部分,而抑制其它无用的信息。其最大的优势就是能一步到位的考虑全局联系和局部联系,且能并行化计算,这在大数据的环境下尤为重要。同时,我们需要注意的是 Attention 机制作为一种思想,并不是只能依附在 Encoder-Decoder 框架下的,而是可以根据实际情况和多种模型进行结合。

4. Self-Attention 自注意力机制

https://zhuanlan.zhihu.com/p/374574448
全网最通俗易懂的 Self-Attention自注意力机制 讲解

自注意力机制解决的情况是:神经网络接收的输入是很多大小不一的向量,并且不同向量向量之间有一定的关系,但是实际训练的时候无法充分发挥这些输入之间的关系而导致模型训练结果效果极差。比如机器翻译问题(序列到序列的问题,机器自己决定多少个标签),词性标注问题(一个向量对应一个标签),语义分析问题(多个向量对应一个标签)等文字处理问题。

针对全连接神经网络对于多个相关的输入无法建立起相关性的这个问题,通过自注意力机制来解决,自注意力机制实际上是想让机器注意到整个输入中不同部分之间的相关性

针对全连接神经网络存在的这个问题,通过自注意力机制来解决,自注意力机制实际上是想让机器注意到整个输入中不同部分之间的相关性,它的实现方法如下:

对于每一个输入向量a,在本例中也就是每一个词向量,经过self-attention之后都输出一个向量b,这个向量b是考虑了所有的输入向量才得到的,这里有四个词向量a对应就会输出四个向量b。
在这里插入图片描述
self-attention考虑的可以是输入,也可以是某一个隐含层的输出。
在这里插入图片描述
另外,self-attention 和FC(全连接层)可以重复使用。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

针对没有考虑到向量的位置信息的问题,引入位置编码

自注意力机制虽然考虑了所有的输入向量,但没有考虑到向量的位置信息。在实际的文字处理问题中,可能在不同位置词语具有不同的性质,比如动词往往较低频率出现在句首。 有学者提出可以通过位置编码(Positional Encoding)来解决这个问题:对每一个输入向量加上一个位置向量e,位置向量的生成方式有多种,通过e来表示位置信息,代入self-attention层进行计算。

关于Attention(Q,K,V), softmax(X,XT)X通俗易懂的解释

全网最通俗易懂的 Self-Attention自注意力机制 讲解
在这里插入图片描述

Self-attention 数据示例

https://blog.51cto.com/u_15127533/4550685
在这里插入图片描述

Attention和Self-Attention的区别?

https://blog.csdn.net/doubleguy/article/details/126055046

在我看来,他们都是针对Encoder-Decoder结构的。在经典的seq2seq机器翻译任务中,根据源句子与目标句子是否相同,分成了Attention和Self-Attention。

其中,Attention是应用在源句子与目标句子不同时,是为了解决rnn的一些问题的。使用rnn的缺点在于,通常的rnn结构由于是单向传导,时序性太强,会导致从Encoder出来的信息太过拥挤,全都集中在Encoder最后一个词这里了。而Decoder翻译的时候其实更需要当前 要翻译的这个词的(中英)信息 ,我们实际上不希望从Encoder的最后一个位置拿到信息。并且当要翻译的句子越长,解码的效果越差。

举个例子,中英翻译 “我爱你” -> “I love you”。

我们期望Decoder在翻译“I”的英文的时候,把注意力放在中文的“我”身上,而不希望从“你”身上拿到信息。实际上,这个操作叫作单词对齐。

使用传统rnn不能实现这一点,而用注意力机制就可以很好的实现这一点,因为注意力的计算不依赖于上一个单词。除此之外,Attention的相比rnn还大大增加了计算效率,不同距离的单词也可以很快的完成计算,不管被计算的这两个单词距离多远,计算注意力花的时间是一样的,这样就可以实现并行计算了。

注意力机制发生在Target的元素Query和Source中的所有元素之间。

Self Attention顾名思义,指的不是Target和Source之间的Attention机制,而是Source内部元素之间或者Target内部元素之间发生的Attention机制,也可以理解为Target=Source这种特殊情况下的注意力计算机制。其具体计算过程是一样的,只是计算对象发生了变化而已。

怎么理解自注意力呢?比如这句话“这只蝴蝶真漂亮,停在花朵上,我很喜欢它”,我们怎么知道这个“它”指的是“蝴蝶”还是“花朵”呢?答案是用自注意力机制计算出这个“它”和其他所有输入词的“分数”,这个“分数”一定程度上决定了其他单词与这个联系。可以理解成越相似的,分就越高。通过计算,发现对于“它”这个字,“蝴蝶”比“花朵”打的分高。所以对于“它”来说,“蝴蝶”更重要,我们可以认为这个“它”指的就是蝴蝶。

通过上面的例子,你会发现整个过程没有涉及翻译的过程,也就没有从“源句子”转化成“目标句子”这一个过程,或者说此时“源句子”=“目标句子”。这种情况就是对输入(也就是”源句子“)自身去计算注意力,称为自注意力

5. Transformer

https://blog.csdn.net/benzhujie1245com/article/details/117173090
https://blog.csdn.net/m0_67084346/article/details/128138486 很详细
自然语言处理NLP训练营视频
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值