seq2seq: 系列変換モデル
- RNNでは入力と出力の系列長や順序は一致しなくてはならない
- seq2seqは入力系列を別の系列に変換するモデル(翻訳など)
- 入力と出力の系列長が異なっていても良い
- 入力にBOSやEOSを含めることが多い?
- 入力と出力の語彙が異なっていてもよい(がNMTではマージして1つの共用語彙にすることが多い?)
- RNNLMの一種の拡張
- 2つのRNNLMをつなぎ,出力側のRNNLMの初期値を変えただけ
- 処理
- 入力系列$\bold{X}$から固定長の符号ベクトル$\bold{z}$を生成する
- $\bold{z}$から出力系列$\bold{Y}$を生成する
- 入力を$\bold{z}$だけに押し込んでいるので,長い入力だと出力の性能が悪化する
構造
- encoder embedding layer
- 入力: one-hotベクトル $\bold{x}_i$
- 出力: embedding $\bar{\bold{x}}_i = \bold{E}^{(s)} \bold{x}_i$
- embedding間に依存関係は無いので並列処理可能
- encoder recurrent layer
- 入力: $i$番目の単語に相当するembedding $\bar{\bold{x}}_i$
- 出力: 隠れ状態ベクトル$\bold{h}_i^{(s)}$
- 多様な設計がありうる
- RNNの種類(最近ではGRUやLSTMが多い)
- 単方向or双方向,何層か
- decoder recurrent layerと同じモデルでも良いが,より複雑なモデルを使うことが多い
- decoder embedding layer
- 入力: decoder recurrent layerで選択された出力$\bold{y}_{j-1}$
- 出力: embedding $\bar{\bold{y}}_j = \bold{E}^{(t)} \bold{y}_{j-1}$.
- decoder recurrent layer
- 入力: decoder embedding layerの出力に対応する $\bold{y}_j$
- 出力: 隠れ状態ベクトル $\bold{h}_j^{(t)}$
- decoder output layer
- 入力: 隠れ状態ベクトル $\bold{h}_j^{(t)}$
- 出力: $\bold{y}_j$が生成される確率$p_j$
系列生成方法