编码器-解码器(seq2seq)和注意力机制

2018-04-18  本文已影响0人  errorrrr

编码器-解码器(seq2seq)

编码器(encoder)和解码器(decoder)分别对应着输入序列和输出序列的两个循环神经网络(RNN),通常分别在输出序列和输入序列头尾加上<go>,<eos>表示序列的开始和结束。


encoder-decoder.png

假设编码器输入x1,x2,...,xt经过变换后变成隐藏变量h1,h2,...,ht,然后进入c,解码器通过c获取编码器的内容,进行变换后得到y1,y2,yt`。


编码器的作用是把一个不定长的输入序列转换成一个定长的背景向量c,该背景向量包含了输入序列的信息,常用的编码器是循环神经网络。


编码器h的函数.png

在这个seq2seq中,我们的解码器s1,s2,..,st',是通过c背景向量拿到编码器中的信息,然后可能再通过rnn进行传递输出y1,y2,...,yt'。在s1时刻我们需要的是s0,y0,c的信息得到s1,然后s1通过变化再得到y1。那么我们的用之前提到过的<go>便签来初始化y0。s0我们可以直接初始化一个0向量,
但是有的时候我们希望s0是和t=1时刻的输入x1有密切关系的所以我们也可以初始化s0为:


s0初始化函数.png

注意力机制

我们发现输出序列的每一个时刻获得的信息一定只能通过c获得,在解码器中我们每一时刻获得的c都是一样的没有变化的,但是假设我们希望输入序列第一时刻的c只对应输出序列对应的第一时刻和第二时刻,而输入序列的第二时刻只对应输出序列的第三时刻。我们希望输入每一个部分分布的注意力是不一样的,这就是注意力机制。
我们假设ct'是c背景向量的不同时刻不同的c,每一时刻的c对编码器中所对应的每个隐藏层进行一个加权平均,这个加权平均的权重使我们学习的参数,我们分配对应时刻隐藏h的权重的大小就是输入时刻每一时刻的注意力的大小。


g函数变形.png

在Bahanau的论文中我们可以定义g函数为一个GRU算法,GRU算法是一个门控算法,类似LSTM。


GRU.png
参考:[MXNet/Gluon] 动手学深度学习
上一篇下一篇

猜你喜欢

热点阅读