Seq2Seq学习
·
什么是Seq2Seq
- Seq2Seq是一种能够根据给定的序列,生成另一个序列的一种方法。
- Seq2Seq主要基于RNN结构,有编码器和解码器两部分。

- 主要应用场景:机器翻译、对话系统、图片描述等。
Seq2Seq原理

- 编码部分(Encoder)
- 对输入的词/其他X1,X2,X3...,XTX_1,X_2,X_3...,X_TX1,X2,X3...,XT
首先对他们进行embedding,得到对应的词向量 - 将这些词向量输入到Cell中,其中一种Cell为GRUcell(LSTMCell 的一个变种),如下图:

- 故第二个GRUcell的输入为第一个GRUcell输出的隐层向量和第二个词的词向量,同理,最后一个cell的输入为倒数第二个cell的隐层输出和最后一个词的词向量,而每一个cell的输出的隐层向量都有之前一个cell有关,所以最后一个cell输出的结果,也就是编码(encoding)后的向量C,包含了前面所有输入词的信息。
- 对输入的词/其他X1,X2,X3...,XTX_1,X_2,X_3...,X_TX1,X2,X3...,XT
- 解码部分(Decoder)
- 对于一个模型的训练来说,必不可少的两个条件是训练样本和目标函数,其中训练样本就是seq_X to seq_Y,而目标函数应该为在输入已知的情况下,输出为正确的概率。训练的目的就是通过改变模型参数使这个概率越来越大。即:argmaxθP(Y∣X)\mathop{\arg\max}_{\theta} P(Y|X)argmaxθP(Y∣X)
- 如图所示,在解码部分,除第一个cell以外,每一个cell的输入都有三部分:上一个cell输出的隐层,上一个cell的输出,以及编码最终的输出向量C。即:ht=f(ht−1,yt−1,c)h_t = f(h_{t-1},y_{t-1},c)ht=f(ht−1,yt−1,c)
- 每次输出的词的概率:P(yt∣yt−1,yt−2,...,y1,c)=g(ht,yt−1,c)P(y_t|y_{t-1},y_{t-2},...,y_1,c)=g(h_t,y_{t-1},c)P(yt∣yt−1,yt−2,...,y1,c)=g(ht,yt−1,c)
- 故对一个样本(seq_xi和seq_yi)来说,输出正确的概率是:P(Yi∣Xi)=∏t=1nP(yt∣yt−1,yt−2,...,y1,c)=∏t=1ng(ht,yt−1,c)P(Y_i|X_i)=\prod_{t=1}^nP(y_t|y_{t-1},y_{t-2},...,y_1,c)=\prod_{t=1}^ng(h_t,y_{t-1},c)P(Yi∣Xi)=t=1∏nP(yt∣yt−1,yt−2,...,y1,c)=t=1∏ng(ht,yt−1,c)这里n指输出字的个数
- 那么对整个训练集来说,目标函数变为:P(Y∣X)=∏i=1NP(Yi∣Xi)P(Y|X)=\prod_{i=1}^NP(Y_i|X_i)P(Y∣X)=i=1∏NP(Yi∣Xi)为防止个别概率较小,加入logP(Y∣X)=log∏i=1NP(Yi∣Xi)P(Y|X)=log\prod_{i=1}^NP(Y_i|X_i)P(Y∣X)=logi=1∏NP(Yi∣Xi)也就是P(Y∣X)=∑i=1Nlog(P(Yi∣Xi))P(Y|X)=\sum_{i=1}^{N}log(P(Y_i|X_i))P(Y∣X)=i=1∑Nlog(P(Yi∣Xi))
- 那么求解问题就变为:maxθ1NP(Y∣X)=maxθ1N∑i=1Nlog(P(Yi∣Xi))\mathop{max}_{\theta} \frac{1}{N}P(Y|X)=\mathop{max}_{\theta} \frac{1}{N}\sum_{i=1}^{N}log(P(Y_i|X_i))maxθN1P(Y∣X)=maxθN1i=1∑Nlog(P(Yi∣Xi))
- 习惯目标函数为求最小值,故:minθ−1N∑i=1Nlog(P(Yi∣Xi))\mathop{min}_{\theta}- \frac{1}{N}\sum_{i=1}^{N}log(P(Y_i|X_i))minθ−N1i=1∑Nlog(P(Yi∣Xi))
更多推荐
所有评论(0)