konchangakita

KPSを一番楽しんでいたブログ 会社の看板を背負いません 転載はご自由にどうぞ

【DeepLearning特訓】RNN応用 seq2seq編

E資格向けの自習アウトプット
自分用メモ

seq2seq は Encoder-Decoderモデルとも呼ばれている
RNNを使って、系列データを固定次元ベクトルへ変換(エンコード)、逆に固定次元ベクトルから系列を生成できる(デコード)

エンコーダ:系列データをある規則に基づいて変換する(固定長ベクトルへ)
デコーダ:系列データへ変換(可変ベクトルへ)
f:id:konchangakita:20210131152837p:plain

日本語から英語への翻訳で考えてみると
f:id:konchangakita:20210131153008p:plain


seq2seq の構造

エンコーダでは、各タイムステップの出力は使わず隠れ層の出力を伝播させる、最終単語の隠れ層の出力をデコーダに渡す
区切り文字 で開始/終了を示す

f:id:konchangakita:20210131153049p:plain
エンコーダとデコーダの構造が違っても良い

f:id:konchangakita:20210131153109p:plain

seq2seq の問題点

エンコードの出力は固定長ベクトル
 ➔入力系列が長すぎるとうまくいかない

Attention Mechanism

エンコーダの各ステップの出力を利用する
「入力と出力でどの単語が関連しているか」という対応関係を seq2seq に学習させる

Encoderの改良

最後の隠れ状態だけを Decoder に渡していたのを、入力される文章のすべてステップの出力の集合を作る
「ひとつの固定長ベクトル」という制約から開放
f:id:konchangakita:20210131170742p:plain

Decoder の改良

各ステップでRNNの出力結果を用いて重要度を算出する
f:id:konchangakita:20210131170805p:plain


終わりに

seq2seq からの、Attention Mechanism は非常に強力らしい
ただ、numpy で書いていくにはちょっと面倒なので、また TensorFlow Keras などでサクッと試してみようかな