学习笔记——seq2seq模型介绍

简介: 学习笔记——seq2seq模型介绍

一、Generation


RNN网络处理序列信息的过程,就是将内容输入RNN根据初始情况生成一个结果,然后将这个结果继续feed给下一个单元,再生成一个结果,如此反复生成数据。


  • RNN每次生成一个字符/单词

image.png

  • RNN每次生成一个像素

image.png

一种高级点产生像素点的例子:

image.png

通过这种方式确实是可以正常的生成一个句子,但是这个句子是一个随机的句子。一般情况下,我们都是希望机器能够生成一个能够符合某种语义环境的句子。也就是要根据条件产生,而不是随机的产生。

image.png

方法一:

将image通过一个编码器,将image变成一个code。然后将这个code对于所有的时间点都到rnn的每一个单元中,同时还将输出结果丢进去。这样rnn就会反复的复习。

image.png

方法二:

先分别将序列信息通过各自的rnn单元产生一个输出,而这个输出相当于一个code,同样的,分别将这个code再丢给另外的一组rnn得到输出,类似于编码器与解码器的结构。将前面的将input变成一个vector的部分称之为Encoder,而后部分根据这个code产生句子称为Decoder。其中这两个部分是可以一起联合训练的。

image.png

但是,这样显得会有点冗杂,一般来说,处理一个句子可能需要两层甚至多层的RNN结构,来将信息编码成一个全局的code,然后decoder再根据这个全局的code来输出内容。而一个想法是可以将其变得不这么冗杂,也就是不需要给每个输入相同的code,而是不同的输入给一个不同的code。这个称为Attention Model


二、Attention


1.Dynamic Conditional Generation

Dynamic Conditional Generation 动态条件生成


思想是:不需要给每个输入相同的code,而是不同的输入给一个不太的code

image.png

首先,现在有一个初始条件z0,然后分别将通过RNN单元结构的输出h1,h2,h3,h4分别与z0计算他们之间的匹配程度,这其中可以有许多中方法设计,match可以是一个神经网络也可以是一个矩阵参数。


1)对于机器翻译的例子

image.png

然后分别得到了在t0时间的对应输入的输出。将输出通过softmax之后,再分别与各自的hi相乘再进行累加,如图所示,所得到的输出便是Decoder的第一个输入。

image.png


根据匹配结果可以看出,初始条件下可能与机器这两个字符相关,所以会输出machine这一个结果,同样的,得到了z1的参数后,再进行下一个结果的判断。

image.png


根据匹配结果可以看出,z1条件下可能与学习这两个字符相关,因为匹配的结果最高。所以会输出learning这一个结果。


2)对于语音识别的例子

(同时这是Cross Attention的例子)

image.png

可以看见,对于t0这个时间点,有两个区域的匹配程度比较高,所以这一轮focus就在这两块上,得出的结构是一个字符‘h’。而对于t1这个时间点,有三个区域的匹配程度比较高,所以在这一轮就focus就在这三块上,得出的结果是一个字符‘o’,就这么一直训练。


3)对于图像操作的例子

加入是按一张图像来操作,那是没有办法应用这个方法的,所以对于单个图像想要应用RNN,需要将其分割成几个区域,然后同样的根据条件计算匹配程度。然后输出单词或者句子。

image.png

可以看见一些比较好的实验结果:

image.png

根据机器注意的地方增白,可以看见这个结果中机器大部分的注意还是正确的。


2.Memory Network

所谓的Memory Network就是在Memory上面做一个attention,一开始的作用是给mechine看一个文档,然后对machine问一个问题,然后machine根据刚刚所看的文档,对这个问题来做出回答。


1)结构一

将问题变成一个code,然后将文档变成N个vector,然后与上述的类容相识,分别计算文档中的每一个xi与问题的匹配程度,得到ai,然后作一个权重相加。最后将这个权重相加后的结果与初始的问题丢到DNN里面,最后便输出答案。ps:这一个整个流程是可以联合训练的。

image.png


2)结构二

将文档中同一个句子变成两组不同的vector,也就是通过两组不同的参数将同一个句子变成两个不同的vector。而这两个不同的matrix都是可以自动的学出来的。对x这组参数进行attention操作,然后对h这组参数来表示每一个句子的information。就是把这些attention乘上这些h得到extract出来的information。得到的最后的这个结构可以对给DNN计算出最后结果,同时还可以更新q值重新去match。

image.png


整体的结构:

image.png

其中,这四组Embedding可以是各不相同的,也可以两两相同。而这个网络结构就可以看成是两层layer的结构。


3. Neural Turing Machine

不仅可以读memory里面的内容,还可以更通过注意力来修改memory


其结构流程如下:


首先,根据一组初始的memory,mo,同时还有对应的初始的attention的weight,α0.根据这memory与初始的weight可以做一个weight sum,train出一个information。这个得到的infomation就是r0,而将这个r0输入到一个神经网络。这个f可以是任何设计函数,可以是神经网络或其他。其是生成几个参数k,e,a。其中k的作用是产生attention的,可以理解为计算与m0的余弦相似度。再做softmax就会得到一组新的attention的distribution。

image.png

e1的作用是把原来的memory值清空,而a1的作用是将新的值写到memory里面去,然后就可以得到新的一组memory。

image.png

而现在由k控制生成的weight,还有更新的memory值,再次做一个weight sum就可以得到一个新的infomation,称为r1.然后再丢到另外的一个神经网络中,再输入新的输入x2,就会得到一个新结果。其中,如果f是RNN,其不仅会输出那些control memory的那些vector,还会输出另外的一组vector h1,来代表这个控制器自己的记忆。同样的,这个h1也会丢给下一个网络。如图所示:

image.png


三、Tips for Generation


1. Regularization term

在训练的过程中,machine的注意力往往会有点问题,比如过度的集中与某一个地方,这样根据视频来得到一句话的时候就会出现错误。而解决这个问题的一个方法就是正则化项,思想是让machine的attention均匀的分布的在视频的每一帧上,这样才能得到一个比较好的结果。也就是说,每一个输入的component具有大致相同的注意力权重的时候,这才是一个好的attention分布。

image.png


2. Mismatch between Train and Test

当我们训练RNN的时候,后一个component的输入是前一个component的reference

image.png

而当我们测试RNN的时候,这时候由于已经没有了reference,所以后一个后一个component的输入是前一个component的输出

image.png

由上可知,由于训练过程与测试过程的输入点不一样,这样就会导致了不相匹配。有可能会出现一步错,步步错的情况。


所以,现在纠结的问题就是下一个时间点的input应该是从model的output中来还是从reference中来


解决方法1:Schedualed Sampling

随机挑选model的output中或者reference这两者之一。也就是随机的选择from model或者是from reference

image.png

而结果显示,这种随机的选择去train,比任意挑选其中的一种去train确实要好。


解决方法2:Beam Search

思想就是想要找到一组置信度最高得分的一组output来当作输入,如何去寻找这一组output就是Beam Search,其会keep分数最高的某几条path,保存这个分数最高的数量就是Beam Size。

image.png


3. Object level or Component level

一般来说,在考量generate结果的时候,好不好应该看一整个句子也就是Object level,而不是看单一的一个词汇。

image.png

所以,对于第二个结果,句子只有一个单词的错误,但是整个句子的语法是完全有问题的,整体的效果其实不算太好,但是他的一个损失值已经比较小了。


对于这个问题,Facebook提出一个解决方法,大概的内容就是用强化学习,基于reward的去训练。将RNN当作一个策略训练,每一个component的输出当作是一个action,假如有一万个word,那么就是有一万个action。而这个action就会改变当前的一个环境,也就是输出其中的一个sample。直到生成了整个句子,将最后的generation的句子与reference作对比,就是一个reward。也就是只有最后生成句子时,才有reward。

image.png


四、Pointer Network


Pointer Network一开始提出是为了解决某一个演算法问题。这个问题是,给你一堆的数据点,需要找到一些可以将全部点包围起来的外围数据点,这就是这个演算法问题。

image.png

用深度学习的方法就是,希望输入是一个坐标矩阵,然后输出是一个向量,这个向量的点可以包围全部的数据点。不过这个训练需要大量的数据


而这个问题,如果使用RNN的算法来实现,就将其称为Pointer Network。将演算法问题可以转变为序列问题,但是需要主要,如果是一般的RNN,Encoder与Decoder的标定数量需要一直,否则Decoder不能输出超过给定数额的结果。


处理流程:


首先与之前提到的基于注意力模型的结果类似,将每个坐标点输入到component中,然后与一个初始条件z0分别结算attention weight,不过这次不是提取一个累加信息,而是取softmax之后数值最大的一个索引,其所对应的值作为下一个时间节点的输入。

image.png

同样的,基于这个输入与下一个时间点的条件z1再重新计算下一个节点的weight分布,直到最大的attention weight是END(也就是h0)才结束。

image.png

用这个方法训练的序列长度与测试的序列长度可以是不一致的。


Pointer Network的其中一个作用是用在机器翻译上,就是希望他对一些关键词可以直接复制下来使用,因为有些词在训练过程是可能是完全不可能是出现的。所以也不可能知道怎么翻译,所以直接贴上去就可以了。这个技术称为Copy Mechanism。

image.png


所以,最早从输入复制东西能力的模型就是Pointer Network


五、Recursive Structure


Recursive Structure称为递归结构,提出的时候是为了解决语义分析。Recursive Structure是Recurrent network的一种更一般的形式。两者之间的对比如下,可以看见,循环神经网络的结构稍微改变一下是可以变成递归网络结构的。

image.png

一般来说,判断语义情感有五个等级,而在Recursive Structure结构中,f的两个输入与输出的shape必须是完全一样的。这样才可以不断的叠加,以一个例子‘not very good’为例:处理流程如下所示,最后的ref根据网络输出的结果做一个损失判断然后反向传播回去训练更新参数。

image.png

其中f的处理过程可以是很复杂的,其可以是一个神经网络的形式处理,也可以是矩阵参数的形式处理:

image.png


后话:


在初期阶段,一般seq2seq模型一般还是用RNN或者是LSTM来解决问题,而后来,transformer出现之后,提出了一个特别的layer,也就是self-attention之后,曾经RNN能解决的问题,self-attention都能解决,所以个人觉得对于RNN只需要了解即可。还是要与时俱进的嘛。


目录
相关文章
|
11月前
|
机器学习/深度学习 数据采集 自然语言处理
【文本摘要(2)】pytorch之Seq2Seq(下)
【文本摘要(2)】pytorch之Seq2Seq(上)
92 0
|
2月前
|
机器学习/深度学习 自然语言处理
seq2seq的机制原理
【8月更文挑战第1天】seq2seq的机制原理。
24 1
|
4月前
|
机器学习/深度学习 自然语言处理
使用seq2seq架构实现英译法(二)
**Seq2Seq模型简介** Seq2Seq(Sequence-to-Sequence)模型是自然语言处理中的关键架构,尤其适用于机器翻译、聊天机器人和自动文摘等任务。它由编码器和解码器组成,其中编码器将输入序列转换为固定长度的上下文向量,而解码器则依据该向量生成输出序列。模型能够处理不同长度的输入和输出序列,适应性强。
|
4月前
|
数据采集 自然语言处理 机器人
使用seq2seq架构实现英译法(一)
**Seq2Seq模型简介** Seq2Seq(Sequence-to-Sequence)模型是自然语言处理中的关键架构,尤其适用于机器翻译、聊天机器人和自动文摘等任务。它由编码器和解码器组成,其中编码器将输入序列转换为固定长度的上下文向量,而解码器则依据该向量生成输出序列。模型能够处理不同长度的输入和输出序列,适应性强。
|
5月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
seq2seq:中英文翻译
seq2seq:中英文翻译
43 1
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
详细介绍Seq2Seq、Attention、Transformer !!
详细介绍Seq2Seq、Attention、Transformer !!
129 0
|
11月前
|
机器学习/深度学习 自然语言处理 PyTorch
【文本摘要(2)】pytorch之Seq2Seq(上)
【文本摘要(2)】pytorch之Seq2Seq
157 0
|
机器学习/深度学习 自然语言处理
Seq2seq
机器学习中的 Seq2seq 模型是一种将一个序列映射为另一个序列的模型,其主要应用场景是自然语言处理、机器翻译等领域。Seq2seq 模型通过编码器(encoder)将输入序列(如源语言句子)编码为一个连续的向量,然后通过解码器(decoder)将该向量解码为输出序列(如目标语言句子)。在训练过程中,模型会尽可能地使输出序列与真实目标序列接近,以达到最好的映射效果。
46 5
|
机器学习/深度学习 自然语言处理 PyTorch
【多标签文本分类】代码详解Seq2Seq模型
【多标签文本分类】代码详解Seq2Seq模型
266 0
【多标签文本分类】代码详解Seq2Seq模型
|
机器学习/深度学习 自然语言处理
NLP学习笔记(四) Seq2Seq基本介绍
NLP学习笔记(四) Seq2Seq基本介绍
149 0