翻译:https://jalammar.github.io/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention/
seq2seq模型在机器翻译、文本摘要、图像描述等任务中取得了成功,谷歌翻译在2016年开始使用这个模型。
但是,我发现,需要一系列相互叠加的概念才能充分理解模型以实现模型。 我认为,如果以视觉方式表达这些想法会更容易理解。 这就是我在这篇文章中要做的。
seq2seq模型以序列(文字、图片)为输入,以另外的序列为输出:
seq2seq_1
在翻译中,输入是一系列的文字,输出另外一种文字
seq2seq_2
looking under the hood
模型内部是一个encoder和一个decoder
encoder单个处理输入句子的词,将获得的信息加工成一个向量(context),在处理完整个输入后,encoder输出context到decoder,一个一个的输出result。
seq2seq_3
机器翻译中流程是一样的
seq2seq_4
在机器翻译中,context是一个向量,encoder和decoder都是RNN网络
可以设定context向量的维度,一般情况下就是encoder中RNN的隐藏层维度。我们展示的维度是4,但是在实际应用中,context的维度更可能是256、512、1024等。
RNN每个步骤有两个输入:输入句子的词向量和隐藏层。词向量可以使用word embedding的模型(word2vec、glove等)
下面介绍一下RNN
RNN_1
下一步RNN会以第二个输入的词向量和第一个的隐藏层为输入,产生这一步的输出。
下面的动图中,encoder或decoder的每一次停顿是RNN在当前阶段处理它的输入,产生输出。基于encoder和decoder都是RNN模型,每一步基于输入和上一步的输出进行更新。
seq2seq_5
decoder层也有一个hidden state从这步传递到下一步,我们没有可视化它
下面以另外一种方式可视化seq2seq模型。
seq2seq_6
attention
文本向量是这些模型的瓶颈,处理长文本是对模型的一种挑战。有一种解决方法是attention,很大的提升了机器翻译系统的质量,attention允许模型注意输入的重要部分。
seq2seq_7
attention模型与经典的seq2seq模型有以下两点不同:
- encoder层传递了更多的信息到decoder层,与只传递最后一个隐藏层不同,传递了所有的隐藏层到decoder中
seq2seq_8
2. attention的decoder在产生输出前会多一个额外的步骤。为了注意输入与当前步骤相关的部分,decoder会做下面的操作
2.1 会查看接收到的encoder hidden states(每一个encoder hidden states都对应输入部分的一个词)
2.2 给每一个hidden state一个score(暂时忽略分数的计算方法)
2.3 softmax score后与hidden state相乘,后相加。这样可以放大有高得分的hidden state,减小低得分的hidden state
seq2seq_9
上述的score会在decoder的每一步都出现,下面整理一下attention的整个操作步骤
- attention decoder部分以encoder的《end》的embedding为输入,并初始化decoder的hidden state
- rnn处理它的输入,产生输出(被丢弃)和新的hidden state(h4)
- attention步骤:使用encoder hidden state和h4计算产生文本向量(C4)
- 合并h4和C4
- 传递这个向量到前向神经网络
- 前向神经网络的输出产生当前步骤的输出词
- 重复上述步骤
attention_process