赞
踩
Seq2Seq是一个Encoder-Decoder结构,其中Encoder为一个RNN结构,Decoder也为一个RNN结构,当然这里的RNN结构可以替换成为LSTM或者GRU等。我们以机器翻译的例子进行讲解,如下图,我们希望将汉语小明吃苹果翻译成为英文。首先是对汉语进行分词处理得到小明,吃,苹果三个词语,而我们希望输出的是xiao ming eats apples.具体的流程见下图:
这里的词汇表为10000,我们将每个汉语词语映射到128维度的向量空间中,也就是说每个词语可以使用一个128维度的向量表示,即input_dim = 128。用矩阵来表示这个向量,那么这个矩阵的形状就是[1,128].然后我们说过Encoder是一个RNN网络,这里我们把RNN中的神经元设置成64,即num_units = 64。也就是说,一个词向量经过Encoder网络后变成了64维的矩阵
,即形状为[1,64]。这个64维的向量进入Decoder网络进行解码以生成相应的英文。
具体的,我们来看看Encoder的内部结构,看看它到底是怎么运作的:
由于计算机无法直接处理语言,所以我们首先得将词语通过word2vec等方式生成词向量x,也就是把人类语言生成计算机可以理解的数学语言。生成的词向量x便可以进入Encoder的RNN网络进行运算了。具体的如上图所示,h0为初始化的隐状态,可以取一个64维全为1的向量。x1和h0生成状态h1,然后x2再和h1生成h2,以此类推,直到序列最后一个时刻的状态h3生成。而h3也成为了Encoder-Decoder的中间向量c。至于这些矩阵维度的转换信息,你可以看我的另一篇博客就会完全明白。
而进入到Decoder中,具体的内部结构如下:
如上图所示,目标单词(Target word)也会生成词向量,至于词向量的维度,可以和x的相同也可以不同,是解码器第一个时间步骤的输入,以使解码器知道何时开始产生输出,也就是告诉Decoder开始进行解码操作了,当然这个也必须生成词向量才能进入Decoder进行运算。然后由这个生成的词向量y1和中间向量c结合生成Decoder的第一个时刻的隐状态h1,以此类推生成所有的隐状态。值得注意的是,Decoder中的系数举矩阵W2和Encoder中的W1一般是不同的,但是在彼此内部却是参数共享的。Decoder中的h和Encoder中的h也是不同的。你可以认为是两套参数不同的RNN结构就可以了。但由于Decoder的h1(第一个时刻的隐状态)是由Encoder中最后一个时刻的隐状态(h3)和联合得到的,所以Encoder和Decoder中的隐状态的维度一般是一样的,在本文中均是64维。
Decoder网络隐状态生成以后呢?接着看下图:
由上图可知,,隐状态乘以一个系数然后经过一个softmax函数,变成该时刻的输出值(也即得到了该时刻隐状态在64维度上的概率分布)。由于这里系数矩阵U也是共享的,所以这里整体上可以认为是一个全连接FC。
由上图可知通过argmax函数得到的Yi,即为i时刻隐状态hi对应的概率最大值对应的索引。注意,这里的Y和第三张图的y是不同的。由上图可知,得到索引后,通过词典中索引到单词的映射id2word获得对应的单词w。进一步的,在将i时刻得到的单词转换为词向量以作为下一个时刻(i+1)的输入。另外上图中的可以告诉解码器句子在哪里结束,并且它允许解码器在其输出中表明句子结束的位置见下图:
这里的ki其实就是yi,pi就是Oi,输出对应每个维度的概率。那么loss函数就如图所示的E。
再放一张完整的图:
通过以上的训练过程,我们需要的参数W1,W2,U就初步得到了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。