学习笔记——seq2seq模型介绍

以下内容来源与李宏毅老师的课程。

一、Generation

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

  • RNN每次生成一个字符/单词
    在这里插入图片描述
  • RNN每次生成一个像素
    在这里插入图片描述
    一种高级点产生像素点的例子:
    在这里插入图片描述
    通过这种方式确实是可以正常的生成一个句子,但是这个句子是一个随机的句子。一般情况下,我们都是希望机器能够生成一个能够符合某种语义环境的句子。也就是要根据条件产生,而不是随机的产生。
    在这里插入图片描述
    方法一:
    将image通过一个编码器,将image变成一个code。然后将这个code对于所有的时间点都到rnn的每一个单元中,同时还将输出结果丢进去。这样rnn就会反复的复习。
    在这里插入图片描述
    方法二:
    先分别将序列信息通过各自的rnn单元产生一个输出,而这个输出相当于一个code,同样的,分别将这个code再丢给另外的一组rnn得到输出,类似于编码器与解码器的结构。将前面的将input变成一个vector的部分称之为Encoder,而后部分根据这个code产生句子称为Decoder。其中这两个部分是可以一起联合训练的。
    在这里插入图片描述
    但是,这样显得会有点冗杂,一般来说,处理一个句子可能需要两层甚至多层的RNN结构,来将信息编码成一个全局的code,然后decoder再根据这个全局的code来输出内容。而一个想法是可以将其变得不这么冗杂,也就是不需要给每个输入相同的code,而是不同的输入给一个不同的code。这个称为Attention Model

二、Attention

1.Dynamic Conditional Generation

Dynamic Conditional Generation 动态条件生成

思想是:不需要给每个输入相同的code,而是不同的输入给一个不太的code
在这里插入图片描述
首先,现在有一个初始条件z0,然后分别将通过RNN单元结构的输出h1,h2,h3,h4分别与z0计算他们之间的匹配程度,这其中可以有许多中方法设计,match可以是一个神经网络也可以是一个矩阵参数。

1)对于机器翻译的例子

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

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

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

2)对于语音识别的例子

(同时这是Cross Attention的例子)
在这里插入图片描述
可以看见,对于t0这个时间点,有两个区域的匹配程度比较高,所以这一轮focus就在这两块上,得出的结构是一个字符‘h’。而对于t1这个时间点,有三个区域的匹配程度比较高,所以在这一轮就focus就在这三块上,得出的结果是一个字符‘o’,就这么一直训练。

3)对于图像操作的例子

加入是按一张图像来操作,那是没有办法应用这个方法的,所以对于单个图像想要应用RNN,需要将其分割成几个区域,然后同样的根据条件计算匹配程度。然后输出单词或者句子。
在这里插入图片描述
可以看见一些比较好的实验结果:
在这里插入图片描述
根据机器注意的地方增白,可以看见这个结果中机器大部分的注意还是正确的。

2.Memory Network

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

1)结构一

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

2)结构二

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

整体的结构:
在这里插入图片描述
其中,这四组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。
在这里插入图片描述
e1的作用是把原来的memory值清空,而a1的作用是将新的值写到memory里面去,然后就可以得到新的一组memory。
在这里插入图片描述
而现在由k控制生成的weight,还有更新的memory值,再次做一个weight sum就可以得到一个新的infomation,称为r1.然后再丢到另外的一个神经网络中,再输入新的输入x2,就会得到一个新结果。其中,如果f是RNN,其不仅会输出那些control memory的那些vector,还会输出另外的一组vector h1,来代表这个控制器自己的记忆。同样的,这个h1也会丢给下一个网络。如图所示:
在这里插入图片描述

三、Tips for Generation

1. Regularization term

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

2. Mismatch between Train and Test

当我们训练RNN的时候,后一个component的输入是前一个component的reference
在这里插入图片描述
而当我们测试RNN的时候,这时候由于已经没有了reference,所以后一个后一个component的输入是前一个component的输出
在这里插入图片描述
由上可知,由于训练过程与测试过程的输入点不一样,这样就会导致了不相匹配。有可能会出现一步错,步步错的情况。

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

解决方法1:Schedualed Sampling

随机挑选model的output中或者reference这两者之一。也就是随机的选择from model或者是from reference
在这里插入图片描述
而结果显示,这种随机的选择去train,比任意挑选其中的一种去train确实要好。

解决方法2:Beam Search

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

3. Object level or Component level

一般来说,在考量generate结果的时候,好不好应该看一整个句子也就是Object level,而不是看单一的一个词汇。
在这里插入图片描述
所以,对于第二个结果,句子只有一个单词的错误,但是整个句子的语法是完全有问题的,整体的效果其实不算太好,但是他的一个损失值已经比较小了。

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

四、Pointer Network

Pointer Network一开始提出是为了解决某一个演算法问题。这个问题是,给你一堆的数据点,需要找到一些可以将全部点包围起来的外围数据点,这就是这个演算法问题。
在这里插入图片描述
用深度学习的方法就是,希望输入是一个坐标矩阵,然后输出是一个向量,这个向量的点可以包围全部的数据点。不过这个训练需要大量的数据

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

处理流程:

首先与之前提到的基于注意力模型的结果类似,将每个坐标点输入到component中,然后与一个初始条件z0分别结算attention weight,不过这次不是提取一个累加信息,而是取softmax之后数值最大的一个索引,其所对应的值作为下一个时间节点的输入。
在这里插入图片描述
同样的,基于这个输入与下一个时间点的条件z1再重新计算下一个节点的weight分布,直到最大的attention weight是END(也就是h0)才结束。
在这里插入图片描述
用这个方法训练的序列长度与测试的序列长度可以是不一致的。

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

在这里插入图片描述
所以,最早从输入复制东西能力的模型就是Pointer Network

五、Recursive Structure

Recursive Structure称为递归结构,提出的时候是为了解决语义分析。Recursive Structure是Recurrent network的一种更一般的形式。两者之间的对比如下,可以看见,循环神经网络的结构稍微改变一下是可以变成递归网络结构的。
在这里插入图片描述
一般来说,判断语义情感有五个等级,而在Recursive Structure结构中,f的两个输入与输出的shape必须是完全一样的。这样才可以不断的叠加,以一个例子‘not very good’为例:处理流程如下所示,最后的ref根据网络输出的结果做一个损失判断然后反向传播回去训练更新参数。
在这里插入图片描述
其中f的处理过程可以是很复杂的,其可以是一个神经网络的形式处理,也可以是矩阵参数的形式处理:
在这里插入图片描述

后话:

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clichong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值