原文链接: link.
把Seq2Seq模型打包的库。安装:
sudo pip install git+https://github.com/farizrahman4u/seq2seq.git
Requirements:
- Keras
- Recurrent Shop
主要包括的模型:
1. A simple Seq2Seq model:
import seq2seq
from seq2seq.models import SimpleSeq2Seq
model = SimpleSeq2Seq(input_dim=5, hidden_dim=10, output_length=8, output_dim=8)
model.compile(loss='mse', optimizer='rmsprop')
这是最简单的seq2seq,如果要建立更加深层的seq2seq,可以使用如下代码:
import seq2seq
from seq2seq.models import SimpleSeq2Seq
model = SimpleSeq2Seq(input_dim=5, hidden_dim=10, output_length=8, output_dim=20, depth=(4, 5))
model.compile(loss='mse', optimizer='rmsprop')
这意味着创建了4层的encoder 和 5 层的decoder。
若 depth = 3, 则创建3层encoder 和3层decoder
2. Advanced Seq2Seq models:
[1] Sequence to Sequence Learning with Neural Networks
实际应用中的seq2seq模型中,encoder的 hidden state 会作为context传到decoder,而且decoder 上一步的输出也会作为当前步的输入。这让seq2seq模型更加复杂。这个包里已经包含了这部分的内置模型:
import seq2seq
from seq2seq.models import Seq2Seq
model = Seq2Seq(batch_input_shape=(16, 7, 5), hidden_dim=10, output_length=8, output_dim=20, depth=4)
model.compile(loss='mse', optimizer='rmsprop')
注意在使用的时候需要具体化输入的shape,包括样本的维度。这主要是因为需要有一个静态的hidden state 以实现跨层转移(类似stateful RNN)。
(注:这部分在最新的版本里已经不需要了,因为使用了 Recurrent Shop backend: link)
如果不想要传递 hidden state, 可以设置 broadcast_state 和 inner_broadcast_state 为 False.
3. Peeky Seq2seq model:
[2] Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation
如果想要实现参考文献[2]中的seq2seq,可以设置 peek=True
import seq2seq
from seq2seq.models import Seq2Seq
model = Seq2Seq(batch_input_shape=(16, 7, 5), hidden_dim=10, output_length=8, output_dim=20, depth=4, peek=True)
model.compile(loss='mse', optimizer='rmsprop')
4. Seq2seq model with attention:
[3] Neural Machine Translation by Jointly Learning to Align and Translate
在机器翻译中,实现输入序列与输出序列中的对齐有助于提高模型性能。
这部分通过注意力机制实现。注意,在注意力模型中,没有隐藏状态的传播,使用的是默认的双向 LSTM encoder:
import seq2seq
from seq2seq.models import AttentionSeq2Seq
model = AttentionSeq2Seq(input_dim=5, input_length=7, hidden_dim=10, output_length=8, output_dim=20, depth=4)
model.compile(loss='mse', optimizer='rmsprop')
模型中并步需要具体化输入的维度,因为并不会涉及到 static hidden states (但如果想要创建stateful Seq2seq model,则需要设置).
如果不想用双向encoder,可以设置 bidirectional=False
Reference:
[1] Sequence to Sequence Learning with Neural Networks
[2] Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation
[3] Neural Machine Translation by Jointly Learning to Align and Translate
[4] A Neural Conversational Model