サンプルがないのでちょっとわかりにくいかと思いますが、簡単に説明します(今、不具合で最新のドキュメントが公開されていないことに気づきました)。
今までLSTMは同じバッチサイズの入力ベクトル(xとします)を入れていましたが、可変長の入力を扱うときは単調減少する入力を扱えます。
短いバッチサイズの入力があった場合、LSTMの内部状態のhやcは、その分だけ更新されます。
例えばlen(x1) = 3, len(x2) = 2のとき、lstm(x1)でミニバッチ数3の内部状態ができ、そのあとlstm(x2)を呼ぶとh[0:2]とc[0:2]の領域だけ更新されます。
以下のissueを参考にしてください。
これを利用するには、まず入力シーケンスを長さの長い順に並べ替えてください。
そのあと転置をとって、ミニバッチの単語シーケンスにしてください。
転置のための関数として、functions.transpose_sequenceを利用してください。
hやcの次元の順番を変えるために、functions.permutate関数を利用してください。
ちゃんと動作確認をとってませんが、以下の様な感じで使えます。
sequences = [
[w1, w2, w3, w4], # "w1w2w3w4" という系列、以下同じ
[w5, w6, w7],
[w8, w9]
]
words = transpose_sequnce(sequences) # wordsは[[w1, w5, w8], [w2, w6, w9], [w3, w7], [w4]]になる
for w in words:
lstm(w)
h = lstm.h # h.data.shape == (3,)
> 出力系列も一つのVariableにまとめられた形になる、という風になったのでしょうか。
こちらは別PRで進行中で、近々マージされると思います。
特にcuDNNのRNNを利用するので、速度が今までのChainerの数倍になると思います。