ありまっくすのへっぽこ日記

アラフォーでへっぽこエンジニアをしております。へっぽこなりに頑張っています。

DeepLearning講座(第6回)を受けてきたよ

6/22にDeepLearning講座の第6回目を受けてきました。

今日の内容は時系列処理(GRU)の実装とSeq2Seqの実装でした。なかなか難しいのですが、丁寧にアウトプットしていこうと思います。

GRU

GRUとは

GRUとはLSTMを簡略化したもので、メモリセルを廃止し入力ゲートと出力ゲートを一つにまとめたもの。その代わり、更新ゲートとリセットゲートがあります。

  •  更新ゲート:過去の情報をどれだけ取り込むかを決定する
  • リセットゲート:過去の情報をどれだけ捨てるかを決定する

f:id:ari_max:20180705064637p:plain

更新ゲートとリセットゲート


 

以下のステップで算出します。

  • 更新ゲートの値を計算する
  • リセットゲートの値を計算する
  • 保持している過去の入力値に対してリセットゲートの値を反映させる(忘れさせる)
  • 未来に使用するための入力値を計算
 更新ゲートの計算

 更新ゲートの式は

(入力値×重み +保持している過去の入力値×更新ゲート向けの重み) × sigmoidです。

f:id:ari_max:20180704122200p:plain

更新ゲートの式
リセットゲートの計算

一方、リセットゲートの式は

(入力値×重み + 保持している過去の入力値×リセットゲート向けの重み) × sigmoidです。

f:id:ari_max:20180704122157p:plain

リセットゲートの式
保持している過去の入力値に対してリセットゲートの値を反映

そして、リセットゲートの値で「保持している過去の入力値」を更新します。式は

「入力値×入力値の重み」 + 「リセットゲートと保持している過去の入力値×リセットゲート向けの重みを要素ごとに掛け算したもの」に対してtanh(活性化関数)を掛けたものです。

f:id:ari_max:20180704122152p:plain
保持している過去の入力値を更新
未来に使用するための入力値を計算

最後に、未来で使用するための入力値を計算します。「どれぐらい記憶を更新するか」という計算をするわけです。更新ゲートが1に近ければ近いほどリセットゲートを反映した過去の値を無視して更新することになります。

式は「更新ゲートと過去の入力値を要素ごとに掛け算したもの」と「(1ー更新ゲート)と『リセットゲートで更新した過去の入力値』を要素ごとに掛け算したもの」です。

 

f:id:ari_max:20180704122640p:plain
未来に使用するための入力値を計算

 

式で書くと非常に難しいですが、TensorFlowだと

tf.contrib.rnn.GRUCell(num_units=n_neurons)で済んでしまいます。。。 

Seq2Seq

Seq2Seqは「シーケンストゥシーケンス」といいます。Encoder-Decoder Modelの一種で、可変長文字列を可変長文字列に変換することができます。下の図のように翻訳などに使われるものです。

f:id:ari_max:20180705070709p:plain

seq2seq

Encoderでは入力を処理して最終的に一つのベクトル(人間には分からない形式)にし、Decoderでベクトルから復号し単語を出力しています。

※英仏翻訳の場合、512次元のベクトルを使用しています。(強力!)