ラビットチャレンジ - 深層学習 Day3 Section4 双方向RNN


0.概要

本記事は日本ディープラーニング協会認定の講座プログラムである「ラビット・チャレンジ」が提供している科目の1つである深層学習のレポートである。
記事タイトルに記載のとおり、Day3 Section4 双方向RNNについて以下にまとめる。

1.双方向RNN(Bindirectional RNN)

通常のRNNは過去の情報を保持することで時系列データの学習を実現していたが、双方向RNNの場合は過去の情報に加えて未来の情報も加味させるモデル。

ただのRNNにももちろん適用できるがLSTMやGRUにも適用することが出来る。

文章の推敲や機械翻訳等、主に自然言語処理で活用されている。
「PythonとKerasによるディープラーニング」によると、これは自然言語の特性によるものとのこと。

例えば気温の予測の場合、予測したい日の直近の日の気温が最も重要となることもあり、逆方向(未来)から学習させると非常に精度の低いものになる(未来の日ではなく予測したい日より先のデータもある前提)。
これは過去から未来を予測するという至極一般的な考え方通りである。
しかし、ある単語の次に来る単語はなにか等の予測をさせようとした場合、逆方向から学習させても精度が出るらしい。
つまり、自然言語は気温等のように過去から未来のように順方向で学習しなければならないと決まっているわけではなく、順方向で学習しても未来から過去のように逆方向で学習しても良いという特性がある。
もちろん順方向と逆方向で学習する内容は異なる。

参考:
https://axa.biopapyrus.jp/deep-learning/rnn/brnn.html
https://www.slideshare.net/ShannonLab/brnn-69866920

2.演習チャレンジ

2.1.双方向RNN

def bindirectional_rnn_net(xs, W_f, U_f, W_b, U_b, V):
  # W_f, U_f:入力から中間層、前の中間層から今の中間層の順方向の重み
  # W_b, U_b:W_f, U_fの逆方向
  # V:順方向、逆方向の中間層から出力層の重み
  xs_f = np.zeros_like(xs)
  xs_b = np.zeros_like(xs)

  for i, x in enumerate(xs):
    xs_f[i] = x
    xs_b[i] = x[::-1]

  hs_f = _rnn(xs_f, W_f, U_f)
  hs_b = _rnn(xs_b, W_b, U_b)
  hs = [np.concatenate([h_f, h_b[::-1]], axis=0)] for h_f, h_b in zip(hs_f, hs_b)
  ys = hs.dot(V.T)
  return ys

通常のRNNだと順方向だけだったものに逆方向が増えたものなので複雑なものではない。

X.ラビットチャレンジとは

ラビットチャレンジとは、日本ディープラーニング協会認定の講座プログラムの1つ。
E資格を受験するためにはこのラビットチャレンジ等、いずれかの講座プログラムを修了しなければならない。

ラビットチャレンジの特徴は「現場で潰しが効くディープラーニング講座」の通学講座録画ビデオを編集した教材を使用した自習スタイルであるという点。
サポートは他の講座より少なく、受け身ではなく自主的に学んでいく姿勢でなければ進められないが、その分、他の講座に比べると安価であり、手が出しやすい。
ある程度知識がある人、自力で頑張るぞというガッツのある人向けではないかと感じる。