ラビットチャレンジレポート(深層学習 day3)

#はじめに
本記事は、E資格取得講座のラビットチャレンジのレポートです。今回は深層学習 day3の講義を受けてのレポートを提出します。

#再帰型ニューラルネットワークの概念
##要点
RNN(Recurrent Neural Network：再帰型ニューラルネットワーク)とは、時系列データを入力と出力にもつニューラルネットワークである。普通のニューラルネットワークにおいては、中間層の入力は、入力層の出力のみである。しかし、RNNは入力層からの入力だけでなく、時刻$t-1$の中間層の出力を時刻$t$の中間層の入力として取り込むことが特徴である。
　RNNにおいてパラメータは、BPTTと呼ばれるアルゴリズムを用いて更新する。これは、誤差逆伝播法をRNNで使えるように改良したものである。

##演習問題
- RNNのネットワークには大きくわけて3つの重みがある。1つは入力から現在の中間層を定義する際にかけられる重み、1つは中間層から出力を定義する際にかけられる重みである。残り1つの重みについて説明せよ。
時刻$t-1$の中間層から時刻$t$の中間層に値を渡す際にかける重み。

- (く)にあてはまるのはどれか。
(2)W.dot(np.concatenate([left, right]))

- 連鎖率の原理を使い、$dz/dx$を求めよ。
[深層学習(day2)のレポート](https://qiita.com/StoneRIeverKS/items/300c56f13dc76360ca4a)参照。

- 下図の$y_1$を$x, z_o, z_1, w_{in}, w, w_{out}$を用いて数式で表せ。
$b, c$をバイアスとする。このとき、

```math
\begin{eqnarray}
z_1 &=& f(w_{in}x+wz_0+b)　\\
y_1 &=& g(w_{out}z_1+c)
\end{eqnarray}
```
となる。

- (お)にあてはまるのはどれか。
(2)delta_t.dot(U)

##ハンズオン
[ハンズオン結果](https://github.com/StoneRIeverKS/rabbit_challenge/blob/master/3_1_simple_RNN.ipynb)

#LSTM
##要点
　RNNの課題として、時系列を遡る過程で、勾配が消失するもしくは爆発するという課題がある。それを解決するために提案されたのが、CEC、入力ゲート、出力ゲート、忘却ゲートである。
　CECは活性化関数の勾配が1のノードであり、時系列データを記憶する働きを持つ。しかし、勾配が1のノードであるため、学習機能がない。そこで、CECへの入力と出力に学習機能を持たせることが考え出された。それが入力ゲートと出力ゲートである。
　また、過去の情報が現在のデータに影響を与えているといっても、遠い過去のデータは不要と考えられる。したがって、遠い過去からの伝播を伝えなくする忘却ゲートというゲートがある。これによって、計算すべき勾配を減らすことができる。

##確認テスト
- シグモイド関数を微分したとき、入力値が0のときに最大値をとる。その値として正しいものを選択肢から選べ。

[ラビットチャレンジレポート(深層学習 day2)](https://qiita.com/StoneRIeverKS/items/300c56f13dc76360ca4a)で解答済み。

- 以下の文章をLSTMに入力し空欄に当てはまる単語を予測したいとする。文中の「とても」という言葉は空欄の予測においてなくなっても影響を及ぼさないと考えられる。このような場合、どのゲートが作用すると考えられるか。

忘却ゲート

- (け)にあてはまるのはどれか

(3)input_gate*a+forget_gate*c

##ハンズオン
[ハンズオン結果](https://github.com/StoneRIeverKS/rabbit_challenge/blob/master/LSTM.ipynb)

#GRU
##要点
　LSTMはパラメータ数が大きく、計算負荷が高くなる問題を抱えている。そこで、パラメータを大幅に削減しているにも関わらず、精度がLSTMに劣らないRNNが提案された。それがGRUである。
　GRUはネットワーク内にリセットゲートと更新ゲートという2つのゲートを持つ。リセットゲートは入力値、時刻$t-1$の出力値を入力し、出力を活性化関数に渡すゲートである。また、更新ゲートとは、入力値、時刻$t-1$の出力値を入力とし、出力と活性関数の出力を内積計算するゲートである。

##確認テスト
- LSTMとCECが抱える課題について、それぞれ簡潔に述べよ。

LSTMの課題は、入力、忘却、出力ゲートの3種類のゲートを持つことで、調整すべきパラメータ数が膨大になってしまったこと。CECの課題は勾配を1にすることで、学習機能を失ってしまったこと。

- (こ)にあてはまるのはどれか。

(4)(1-z)*h+z*h_bar

- LSTMとGRUの違いを簡潔に述べよ。

LSTMは入力、忘却、出力ゲートを持った構造であり、調整すべきパラメータが多い。GRUはリセット、更新ゲートのみであり、調整すべきパラメータがLSTMより少ない。

##ハンズオン
[ハンズオン結果](https://github.com/StoneRIeverKS/rabbit_challenge/blob/master/GRU.ipynb)

#双方向RNN
##要点
　過去の情報だけでなく、未来の情報も加味することで、精度を向上させるためのモデル。文章の推敲や、機械翻訳等に使われている。なお、学習の際は過去と未来の両方の情報が必要なことから、双方向RNNを実運用できる場面は限られてくる。

##確認テスト
- (か)にあてはまるのはどれか。

(4)np.concatenate([h_f, h_b[::-1]], axis=1)

#Seq2Seq
##要点
 Seq2Seqはエンコーダーとデコーダーと呼ばれる2つのRNNを用いたモデルである。機械翻訳や機械対話などに使われている。
エンコーダーは、入力された文章などを「文脈」に変換する。デコーダーは「文脈」を受け取り新たな文字列などを生成する。なお、モデル上「文脈」は数値のベクトルで表現される。

##確認テスト
- 下記の選択肢から、seq2seqについて説明しているものを選べ。

(2)RNNを用いたEncorder-Decorderモデルの一種であり、機械翻訳などのモデルに使われる。

- (き)にあてはまるのはどれか。

(1)E.dot(w)

- seq2seqとHRED、HREDとVHREDの違いを簡潔に述べよ。

seq2seq2は文脈を無視していたのに対して、HREDは文脈を考慮する。HREDは文脈を字面だけで考慮していたのに対して、VHREDは同じコンテキストに対しても、字面だけではない多様な返答ができる。

- VAEに関する下記の説明文中の空欄に当てはまる言葉を答えよ。

自己符号化器の潜在変数に「確率分布$Z \sim N(0, 1)$」を導入したもの。

#Word2vec
##要点
 RNNは可変長の文字列をニューラルネットワークに与えることができない。したがって、固定長形式で単語を表す必要がある。そこで、学習データから辞書を作成し、その辞書に対象の単語が含まれていれば1、含まれていなければ0とするone-hotベクトルを用いることが提案された。このone-hotベクトルからembeding表現を得るために使うモデルをword2vecと呼ぶ。

##確認テスト
確認テストがないので割愛。


#Attention Mechanism
##要点
　seq2seqの問題は長い文章への対応が難しいこと。例えば、seq2seqでは、2単語でも100単語でも固定次元ベクトルの中に入力する必要がある。したがって、文章が長くなればなるほど、シーケンスの内部表現の次元も大きくなっていく仕組みが必要となる。これをAttention Mechanismと呼ぶ。
　Attention Mechanismは入力と出力のどの単語が関連しているのか、関連度を学習する仕組み。

##確認テスト
- RNNとword2vec、seq2seqとAttention Mechanismの違いを簡潔に述べよ。

RNNは時系列データを処理するためのニューラルネットワーク。word2vecは単語の分散表現ベクトルを得るためのモデル、seq2seqは一つの時系列データから別の時系列データを得るためのモデル、Attention Mechanismは二つの時系列データに対して関連度を紐づけるモデル。

#参考図書
RNNについて、@ITにTensorFlowを用いた実装例が載っていた。[時系列データの予測を行う深層学習(RNN)を作成してみよう(TensorFlow編)](https://atmarkit.itmedia.co.jp/ait/articles/1804/26/news150.html#e383a2e38387e383ab)
これによると、やはり長期依存の時系列データはRNNでは予測精度が下がるそうだ。
LSTMについては、[細かいことは置いておいてLSTMで株価予測を試してみる](https://cpptake.com/archives/525)を読んだ。
これによると、LSTMは周期がない時系列データには弱いらしい。また、株価を後から追うような予測をしてしまい、実用性に乏しい。
GRUについては、[GRUネットワークを使用した性別の分類](https://jp.mathworks.com/help/deeplearning/ug/classify-gender-using-long-short-term-memory-networks.html)を読んだ。MathWorksは話者の性別を分類する学習済みのネットワークを提供しているらしい。今回のレポート作成までには間に合わなかったが、今後実験してみたい。
双方向RNNは[Bidirectional RNN](https://axa.biopapyrus.jp/deep-learning/rnn/brnn.html)が詳しかった。順伝播と逆伝播の関係性を数式レベルで確認できた。
seq2seqとAttention Mechanismについては、[Attentionを用いたseq2seqのメカニズム](https://tips-memo.com/translation-jayalmmar-attention)を参考にした。Attentionを用いることで、ある単語を翻訳する際に、デコーダーが訳を生成する前に注目すべき単語をピックアップできることを学んだ。
Word2vecについては、[Word2Vecを理解する](https://qiita.com/g-k/items/69afa87c73654af49d36)を参考にした。単語の分散表現を獲得する手法として、カウントベースの手法と推論ベースの手法の二つがあること。そして、Word2Vecは推論ベースの手法であることを学んだ。