编码器-解码器(seq2seq)
编码器(encoder)和解码器(decoder)分别对应着输入序列和输出序列的两个循环神经网络(RNN),通常分别在输出序列和输入序列头尾加上<go>,<eos>表示序列的开始和结束。
encoder-decoder.png
假设编码器输入x1,x2,...,xt经过变换后变成隐藏变量h1,h2,...,ht,然后进入c,解码器通过c获取编码器的内容,进行变换后得到y1,y2,yt`。
编码器的作用是把一个不定长的输入序列转换成一个定长的背景向量c,该背景向量包含了输入序列的信息,常用的编码器是循环神经网络。
编码器h的函数.png
-
公式表示在t时刻的隐藏变量来源t时刻的输入和上一时刻的隐藏变量。
c函数.png -
c背景向量就是总结输入序列所对应的各个隐藏层变量。比如c可以是直接拿最后一刻输入序列对应的隐藏变量hT。
encoder最大似然函数.png -
这个公式是指一个描述输出序列的概率函数。我们希望最大似然函数。
encoder最大似然函数损失函数.png -
根据上面的最大似然函数我们可以得到这个损失函数。这里就是最小化损失函数。
编码器p函数.png
编码器g函数.png -
该公式是yt'的概率函数。这个g函数的设计可以因情况变化。
在这个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
-
我们就可以根据注意力机制来设计这个g函数。
ct'表达式.png -
这个公式就是一个加权平均得到一个c。
图片1.png -
这个公式值我们有一个阿尔法表达式用一个softmax进行概率分布。而下面的a的设计也可以依据实际情况变换,例如:
图片2.png
在Bahanau的论文中我们可以定义g函数为一个GRU算法,GRU算法是一个门控算法,类似LSTM。
GRU.png
参考:[MXNet/Gluon] 动手学深度学习
网友评论