DeepLearning講座(第6回)を受けてきたよ
6/22にDeepLearning講座の第6回目を受けてきました。
今日の内容は時系列処理(GRU)の実装とSeq2Seqの実装でした。なかなか難しいのですが、丁寧にアウトプットしていこうと思います。
GRU
GRUとは
GRUとはLSTMを簡略化したもので、メモリセルを廃止し入力ゲートと出力ゲートを一つにまとめたもの。その代わり、更新ゲートとリセットゲートがあります。
- 更新ゲート:過去の情報をどれだけ取り込むかを決定する
- リセットゲート:過去の情報をどれだけ捨てるかを決定する
以下のステップで算出します。
- 更新ゲートの値を計算する
- リセットゲートの値を計算する
- 保持している過去の入力値に対してリセットゲートの値を反映させる(忘れさせる)
- 未来に使用するための入力値を計算
更新ゲートの計算
更新ゲートの式は
(入力値×重み +保持している過去の入力値×更新ゲート向けの重み) × sigmoidです。
リセットゲートの計算
一方、リセットゲートの式は
(入力値×重み + 保持している過去の入力値×リセットゲート向けの重み) × sigmoidです。
保持している過去の入力値に対してリセットゲートの値を反映
そして、リセットゲートの値で「保持している過去の入力値」を更新します。式は
「入力値×入力値の重み」 + 「リセットゲートと保持している過去の入力値×リセットゲート向けの重みを要素ごとに掛け算したもの」に対してtanh(活性化関数)を掛けたものです。
未来に使用するための入力値を計算
最後に、未来で使用するための入力値を計算します。「どれぐらい記憶を更新するか」という計算をするわけです。更新ゲートが1に近ければ近いほどリセットゲートを反映した過去の値を無視して更新することになります。
式は「更新ゲートと過去の入力値を要素ごとに掛け算したもの」と「(1ー更新ゲート)と『リセットゲートで更新した過去の入力値』を要素ごとに掛け算したもの」です。
式で書くと非常に難しいですが、TensorFlowだと
tf.contrib.rnn.GRUCell(num_units=n_neurons)で済んでしまいます。。。
Seq2Seq
Seq2Seqは「シーケンストゥシーケンス」といいます。Encoder-Decoder Modelの一種で、可変長文字列を可変長文字列に変換することができます。下の図のように翻訳などに使われるものです。
Encoderでは入力を処理して最終的に一つのベクトル(人間には分からない形式)にし、Decoderでベクトルから復号し単語を出力しています。
※英仏翻訳の場合、512次元のベクトルを使用しています。(強力!)