レポート２

#深層学習（前編２）
##１　勾配消失問題
　　　　**勾配消失の問題点**
　　　　　誤差逆伝播が下位層（入力層側）に進んでいくに連れて、勾配がどんどん緩やかになっていく。
　　　　　そのため、勾配降下法による更新では、下位層のパラメータはほとんど変わらず、訓練は最適値に収束しなくなる。
　　　　　シグモイド関数は、大きな値では出力の変化が微小なため、勾配消失問題を引き起こす事があった。
　　　　　シグモイド関数を微分した時の最大値は、入力値が0の時で、その最大値は0.25であり、微分するごとに小さくなる。

　　　　　　　【sigmoid関数のソースコード例】
　　　　　　　　def sigmoid(x):
　　　　　　　　　　　　return 1/(1 + np.exp(-x))

　　　　　　　【sigmoid関数の微分のソースコード例】
　　　　　　　　def d_sigmoid(x):
　　　　　　　　　　　　return (1.0 - sigmoid(x)) * sigmoid(x)

　　　　**勾配消失の解決方法**
　　　　　・活性化関数の選択
　　　　　　　ReLU関数を使用することに勾配消失が起こりにくくなる。

　　　　　　　【ReLU関数のソースコード例】
　　　　　　　　def relu(x):
　　　　　　　　　　　　return np.maximum(0, x)

　　　　　　　【ReLU関数の微分のソースコード例】
　　　　　　　　def d_relu(x):
　　　　　　　　　　　　return np.where( x > 0, 1, 0)

　　　　　・重みの初期値の設定方法
　　　　　　　Xavierにより設定する。（重みの要素を、前の層のノード数の平方根で除算した値）
　　　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/d65136cd-0e97-414d-f834-0923a2c114f2.png)
　　　　　　　Heにより設定する。（重みの要素を、前の層のノード数の平方根で除算した値に対し、√２をかけ合わせた値）
　　　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/9e57478b-661b-a17d-2b83-8f632e1bdf56.png)
　　　　　・バッチ正規化
　　　　　　　ミニバッチ単位で、入力値のデータの偏りを抑制する手法
　　　　　　　活性化関数に値を渡す前後に、ZあるいはU(=WZ+b)をバッチ正規化層を加えて入力値とする。
　　　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/d57ddb62-87dd-8327-7f59-0943e56107d7.png)
　　　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/5f0106c3-8761-0f1b-63bf-9bf6835a9fcb.png)
　　　　**ソースコードで演習**
　　　　　　シグモイド関数は、HeよりXavierの方が相性が良いとされていたが、実際にやってみると、Heの方が良い結果となった。（たまには、そのようになる時もあるのかもしれない）
　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/29d197dc-741c-e741-3a8f-440d7fbc67f2.png)
　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/d19af606-d7da-9100-b7f5-8dc8b0c7a671.png)
　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/724bb04b-9144-4833-d1e3-a30e4c23bb50.png)

##２　学習率最適化手法
　　　　**勾配降下法の復習**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/daf12257-cd92-0c4a-15f1-7a55e02fd32e.png)
　　　　学習率は大きすぎても小さすぎてもダメ！

　　　　**主な学習率最適化手法の種類**
　　　　・モメンタム
　　　　・AdaGrad
　　　　・RMSProp
　　　　・Adam

　　　　**モメンタム**
　　　　　誤差をパラメータで微分したものと学習率の積を減算した後、現在の重みに前回の重みを減算した値と慣性の積を加算する。
　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/fbfd781e-8a26-ee82-3cb0-6cdd8ae2a713.png)
　　　　　慣性（ハイパーパラメータ）μは、一般的には0.05~0.09とする。
　　　　　メリットは、局所的最適解にはならず、大域的最適解となること。また、谷間にたどり着いてから最も低い位置（最適解）にいくまでの時間が早いこと。

　　　　**AdaGrad**
　　　　　誤差をパラメータで微分したものと再定義した学習率の積を減算する。
　　　　　学習率が徐々に小さくなる。
　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/69cd4383-968f-87e5-dc6e-02c22f0fc6a7.png)
　　　　　Θはすごく小さな値である。
　　　　　Θを加えるのは、ゼロにならないようにするためである。
　　　　　メリットは、勾配の緩やかな箇所に対しても最適値に近づくこと。
　　　　　デメリットは、学習率が徐々に小さくなるので、鞍点問題を引き起こす事があること。

　　　　**RMSProp**
　　　　　誤差をパラメータで微分したものと再定義した学習率の積を減算する。
　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/bb978a25-3bf2-0d18-96c4-d117f79f6856.png)
　　　　　メリットは、局所的最適解にはならず、大域的最適解となること。また、ハイパーパラメータの調整が必要な場合が少ないこと。

　　　　**Adam**
　　　　　モメンタムとRMSPropのいいところを取り入れたもの。
　　　　　　モメンタムの　過去の勾配の指数関数的減衰平均
　　　　　　RMSPropの　過去の勾配の２乗の指数関数的減衰平均

　　　　**ソースコードで演習**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/0595a8e1-128a-d202-af37-17b1f994a5ab.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/482cb915-44e1-acaa-318b-b4443d31f8e5.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/41a75aad-485b-e3b7-3cc2-fff02feceb39.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/602fa102-2d5f-dec8-fa67-08dc19dd68f6.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/aa0c6cbd-426d-1f23-16e0-d85b732d2ddd.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/fb688665-442c-7e04-0b95-27c810c2fa0a.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/caed857d-d2dd-aa0e-421e-edadb34332bc.png)

##３　過学習
　　　**復習**
　　　　過学習とは、テスト誤差と訓練誤差とで学習曲線が乖離すること。テスト誤差と訓練誤差とで学習曲線が乖離すること。特定の訓練サンプルに対して、特化して学習したもの。　
　　　　過学習の原因は、ネットワークの自由度（層数、ノード数、パラメータの値など）が高いことによる。

　　　**過学習の対策**
　　　　過学習の対策としては、ネットワークの自由度（層数、ノード数、パラメータの値など）を制限する正則化がある。
　　　　正則化の主な方法に、以下のものがある。これらを組み合わせることも可能である。
　　　　・L1正則化、L2正則化
　　　　・ドロップアウト

　　　**L1正則化、L2正則化**
　　　　L1正則化、L2正則化は、誤差の項に対して、正則化項を加算して、重みの大きさを抑制することで、過学習を抑制する。
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/5028e0d9-0265-9edf-a658-8e7898371cf2.png)
　　　　　Pが１の場合をL1正則化（L1ノルム）と呼ぶ。
　　　　　Pが２の場合をL2正則化（L2ノルム）と呼ぶ。
　　　　　λは、Weight decay係数と呼ぶ。
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/2146ecc4-1ab7-0c62-0a8b-76c9984d2a68.png)
　　　　　この絵の上の同心円は誤差項を示し、下の円やひし形は正則化項を示す。
　　　　　Lasso推定量がL1正則化である。スパース推定（ゼロにする）
　　　　　Ridge推定量がL2正則化である。縮小推定（ゼロに近づける）

　　　**ドロップアウト**
　　　　ドロップアウトは、ランダムにノードを削除して学習させることにより、過学習を抑制する。
　　　　データ量を変化させずに、異なるモデルで学習させるとも解釈できる。

　　　**ソースコードで演習**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/57b69f11-476f-4435-445e-90002c7ee70e.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/40f468d1-1fa6-5bde-44f2-585b77d7f489.png)

　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/f776557c-a139-a745-0cfe-e62d1acfb15f.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/dbcd163e-2648-01f4-67f3-3b19923343f4.png)

　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/7d566e00-395f-a402-9e69-6d612d5a8f31.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/e3980944-fcae-8792-ca87-f132c1f69512.png)
　　　　
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/cb48ebe2-b34f-3d24-0beb-27eead5f3294.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/8aceeca2-3788-718f-da72-c797bd26bb6c.png)

##４　畳み込みニューラルネットワークの概念
　　　**CNNの構造図（例）**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/e4b607db-c1bd-6860-4f83-69a08448290b.png)
　　　　いろいろな組み合わせがある。
　　　　CNNは、画像だけに使用されるのではない。

　　　**LeNetの構造図**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/7275a0ed-4b91-204d-e936-f6b4522753bb.png)

　　　**畳み込み層の全体像**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/fb91c7aa-c6d4-ce5d-0dc2-8288f4da6c8d.png)

　　　**全結合での学習**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/af5081c9-6fc3-7c52-f28d-0cbb86372181.png)

　　　**畳み込み層の演算概念（バイアス）**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/165c29fb-6c7b-f4fa-4ec2-2bfc9d5eb2cf.png)

　　　**畳み込み層の演算概念（パディング）**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/2d5cd286-0c1f-6661-cd5f-747f124d225f.png)
　　　　入力と出力のサイズを合わせるためにゼロで埋める。
　　　　ゼロ以外で埋めることも可能である。

　　　**畳み込み層の演算概念（ストライド）**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/9f8a28a9-55a2-904a-17bb-18f5af493741.png)

　　　**畳み込み層の演算概念（チャンネル）**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/b4dd4117-5368-7e28-9443-1ca096623996.png)
　　　　チェンネルを利用して3次元データにも対応できる。
　　　　チャンネルの数だけフィルターの数が必要となる。
　　　　全結合層では、RGBの各チャンネル間の関連性が学習に反映されない。
　　　　畳み込み層を使用すると各チャンネル間の関連性が学習される。

　　　**プーリング層の演算概念**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/2565db31-74a6-1872-5fe8-5dbf592d40ae.png)
　　　　マックスプーリングは、最大値
　　　　アベレージプーリングは、平均値
　　　　出力高さサイズ　＝　（データ高さサイズ　＋　２＊パディングサイズ　ー　フィルタ高さサイズ　／　ストライドサイズ）　＋　１
　　　　出力幅サイズ　＝　（データ幅サイズ　＋　２＊パディングサイズ　ー　フィルタ幅サイズ　／　ストライドサイズ）　＋　１

　　　**ソースコードで演習**
　　　・im2col
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/34a496b7-6036-400f-e4ae-6c8ddab5c2c1.png)
　　　　イメージデータ（多次元データ（2次元または３次元など））を行列データに展開する。
　　　　多くの演算処理で活用しやすくなる。
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/455461db-b371-2ef4-24ca-20323940e2b6.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/b48a906a-d457-1e7d-48d6-24693b0032de.png)

　　　・col2im
　　　　im2colの逆展開。im2colが復元されるとは限らない。
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/107bd92f-9af9-1df7-86b8-74d66054bed2.png)

　　　・convolution class
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/c58c9f04-c395-524c-356c-6a980c1efc2f.png)

　　　・pooling class（最大値）
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/871417c6-0593-d031-0e4b-cda6fc87283e.png)

　　　・sinple convolution network class
　　　　　conv - relu - pool - affine - relu - affine - softmax
　　　　　畳み込み層　－　ReLU　－　プーリング層　－　全結合層　－　ReLU　－　全結合層　－　SoftMAX
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/14008ad2-dea2-b0fd-9f1e-758ac7441062.png)

　　　・sinple convolution network classによる一連の処理
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/c1750a26-9027-56d5-0c80-93f6a237a0d1.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/740df90a-474e-9e61-4aa8-59bbce6e4574.png)

##５　最新のCNN
　　　**AlexNet**
　　　　2012年に開かれた画像認識コンペティション2位に大差をつけて優勝したモデルである。
　　　　AlexNetの登場で、ディープラーニングが大きく注目を集めた。

　　　　・モデルの構造
　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/620312b0-6204-6473-975d-0b0f7c92c1ea.png)
　　　　　5層の畳み込み層およびプーリング層など、それに続く3層の全結合層から構成される。
　　　　　過学習を防ぐため、サイズ4096の全結合層の出力にドロップアウトを使用している。

　　　**GoogleNet**
　　　　修了テストより
　　　　GoogleNetの特徴
　　　　　AuxiliaryLossを導入することでネットワークの中間層に直接誤差を加えることができる。


#深層学習（後編１）
##１　再帰型ニューラルネットワークの概念
　　　**RNNの概念**
　　　　時系列データに対応可能な、ニューラルネットワークである 。

　　　**時系列データとは**
　　　　時間的順序を追って一定間隔ごとに観察され，しかも相互に統計的依存関係が認められるようなデータの系列
　　　　音声データ、テキストデータ、株価、乗客数…etc

　　　**RNNの中間層について**
　　　　中間層が重要である。
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/606e6ddc-538e-efc3-e2dd-bd62928bb293.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/75ffce60-81f9-5094-78fb-9a85b3352516.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/c58e536b-0c30-3d1b-7ad8-9a07b29479f4.png)

　　　**RNNの重み**
　　　　大きくわけて 3 つの重みがある。
　　　　入力から現在の中間層を定義する際にかけられる重み。
　　　　中間層から出力を定義する際にかけられる重み。
　　　　中間層から中間層を定義する際の重み。

　　　**RNNの特徴とは**
　　　　時系列モデルを扱うには、初期の状態と過去の時間 t 1 の状態を保持し、そこから次の時間での t を再帰的に求める再帰構造が必要になる 。

　　　**ソースコードで演習**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/45eeee77-ad8d-3bb7-9b0d-db824f6ff0ce.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/7aeef30a-05a1-e7ed-94ad-f386e7883862.png)

　　　**BPTT（Backpropagation Through Time）**
　　　・BPTTとは
　　　　　RNNにおいてのパラメータ調整方法の一種。
　　　　　誤差逆伝播法を拡張したもの。

　　　・誤差逆伝播法の復習
　　　　　計算結果（＝誤差）から微分を逆算することで、不要な再帰的計算を避けて微分を算出できる 。
　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/be6b9a08-b6bf-55f9-abab-dc4933a27c40.png)

　　　・BPTTの数学的記述１
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/cc4a472b-755c-fa0a-6cc7-9be6f39bbcf3.png)

　　　・BPTTの数学的記述２
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/6390a84f-e424-aa19-8f49-066eb2b7bf73.png)

　　　・BPTTの数学的記述３
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/f2c467d4-01eb-e086-00c0-4eb87fd5723e.png)

　　　・パラメータの更新式
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/32ba7086-3907-cc85-08f3-45da845a6122.png)

　　　・BPTTの全体像
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/c393f924-7198-d69d-d19f-1b5f083c2cb2.png)

　　　**演習**
　　　　下図はBPTT を行うプログラムである。なお簡単化のため活性化関数は恒等関数であるとする。
　　　　また、calculate_dout 関数は損失関数を出力に関して偏微分した値を返す関数であるとする。
　　　　（お）にあてはまるのはどれか。
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/2a0f8309-6162-21a1-2816-235e89008ffd.png)
　　　　RNN では中間層出力 h_{t} が過去の中間層出力 h_{t -1},.., h_{1} に依存する。
　　　　RNNにおいて損失関数を重み W や U に関して偏微分するときは、それを考慮する必要があり、dh_{t}/dh_{t-1} = Uであることに注意すると、過去に遡るたびに U が掛けられる。
　　　　つまり、「delta_t = delta_t.dot(U)」となる。

##２　LSTM
　　　（Long short-term memory、長・短期記憶）

　　　**RNNの課題**
　　　　時系列を遡れば遡るほど、勾配が消失していく。長い時系列の学習が困難である。

　　　**RNNの解決策**
　　　　　　勾配消失の解決方法とは、別で、構造自体を変えて解決したものがLSTM。

　　　**LSTMの全体図**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/1fc7cd01-554b-0e9d-4565-7c9a3a91a29f.png)

　　　**CEC**
　　　　（Constant Error Carousel、定誤差カルーセル）
　　　　勾配消失および勾配爆発の解決方法として、勾配が1 であれば解決できる。
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/fa4891bb-8ffe-2e40-f830-b3ac023d9475.png)
　　　　・CECの課題
　　　　　　CECは、入力データについて、時間依存度に関係なく重みが一律である。
　　　　　　CECにより⇒ニューラルネットワークの学習特性が無くなる。
　　　　　　入力層から隠れ層への重みが一律になることを「入力重み衝突」と呼ぶ。
　　　　　　隠れ層から出力層への重みが一律になることを「出力重み衝突」と呼ぶ。

　　　**入力・出力ゲート**
　　　　・入力・出力ゲートの役割とは
　　　　　　入力・出力ゲートを追加することで、それぞれのゲートへの入力値の重みを、重み行列 W,U で可変可能とする。
　　　　　　それにより、CECの課題を解決 。

　　　**忘却ゲート**
　　　　・LSTMブロック（入力ゲート、CEC、出力ゲート）の現状と課題、解決策
　　　　　　現状：CECは、過去の情報が全て保管されている 。
　　　　　　課題：過去の情報が要らなくなった場合、削除することはできず、保管され続ける 。
　　　　　　　　　（関係性がほとんどない過去の情報に影響され続けてしまう）
　　　　　　解決策：過去の情報が要らなくなった場合、そのタイミングで情報を忘却する機能が必要 。
　　　　　　　　　　それが忘却ゲートである。

　　　　・忘却ゲートの作用
　　　　　　以下の文章の「とても」という言葉は、空欄の予測において、影響を及ぼさないようにする。
　　　　　　　「映画おもしろかったね。ところで、とてもお腹が空いたから何か（　　） 。」

　　　　・演習
　　　　　　以下のプログラムは、LSTM の順伝播を行うプログラムである。
　　　　　　ただし _sigmoid 関数は要素ごとにシグモイド関数を作用させる関数である。
　　　　　　（け）にあてはまるのはどれか。
　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/9ae903cd-fa41-05bc-1f01-0de27e2d5493.png)
　　　　　　新しいセルの状態は、計算されたセルへの入力と1 ステップ前のセルの状態に入力ゲート、忘却ゲートを掛けて足し合わせたものと表現される。つまり、「input_gate * a + forget_gate * c」である。

　　　**覗き穴結合**
　　　　・LSTMブロック（入力ゲート、CEC、出力ゲート）の課題、解決策
　　　　　　課題：CECの保存されている過去の情報を 、任意のタイミングで他のノードに伝播させたり 、あるいは任意のタイミングで忘却させたい。CEC自身の値は、ゲート制御に影響を与えていない 。
　　　　　　解決策：CEC自身の値に、重み行列を介して伝播可能にする構造が考え出された。
　　　　　　　　　　それが覗き穴結合である。

##３　GRU

　　　　・LSTMブロック（入力ゲート、CEC、出力ゲート）の課題、解決策
　　　　　　課題：LSTM では、パラメータ数が多く、計算負荷が高くなる問題があった 。
　　　　　　解決策：パラメータを大幅に削減し、精度は同等またはそれ以上が望める構造が考え出された。
　　　　　　　　　　それがGRUである。計算負荷が低くなるメリットがある。
　　　**全体像**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/2ecc5cc1-3d16-ee7e-0eb4-f5907fb30dbc.png)

　　　**演習**
　　　　GRU(Gated Recurrent Unit)も LSTM と同様に RNN の一種であり、単純な RNN において問題となる勾配消失問題を解決し、長期的な依存関係を学習することができる。LSTM に比べ変数の数やゲートの数が少なく、より単純なモデルであるが、タスクによっては LSTM より良い性能を発揮する。より良い性能を発揮する。以下のプログラムは GRU の順伝播を行うプログラムである。ただし _sigmoid 関数は要素ごとにシグモイド関数を作用させる関数である。
　　　　（こ）にあてはまるのはどれか。
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/98917275-22fd-b2c3-80ca-f13601c533a6.png)
　　　　新しい中間状態は、 1 ステップ前の中間表現と計算された中間表現の線形和で表現される。
　　　　つまり更新ゲート z を用いて、「(1 －z) * h + z * h_bar」と書ける。

##４　双方向RNN
　　　**双方向RNNとは**
　　　　過去の情報だけでなく、未来の情報を加味することで、精度を向上させるためのモデル
　　　　実用例は、文章の推敲や、機械翻訳等

　　　**イメージ図**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/cfaed8d3-f285-2ee1-42aa-414bba5e051d.png)

　　　**演習**
　　　　以下は双方向RNN の順伝播を行うプログラムである。
　　　　順方向については、入力から中間層への重み W_f , 一ステップ前の中間層出力から中間層への重みを U_f 、 逆方向に関しては同様にパラメータ W_b , U_b を持ち、両者の中間層表現を合わせた特徴から出力層への重みは V である。_rnn 関数は RNN の順伝播を表し中間層の系列を返す関数であるとする。
　　　　（か）にあてはまるのはどれか
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/328583b5-c457-df7a-9e42-8913e4a60973.png)
　　　　双方向 RNN では、順方向と逆方向に伝播したときの中間層表現をあわせたものが特徴量となるので、「np.concatenate([h_f , h_b[::-1]], axis=1)」である。

##５　Seq2Seq
　　　**Seq2Seqとは**
　　　　Encoder-Decoder モデルの一種を指す。
　　　　機械対話や、機械翻訳などに使用されている。

　　　**イメージ図**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/7b84b02d-64f2-fa16-a2d3-756e6dc6e175.png)

　　　**Encoder RNN**
　　　　ユーザーがインプットしたテキストデータを、単語等のトークンに区切って渡す構造 。
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/7c5348e1-be53-a40b-3e57-54f3e1410f7e.png)
　　　　・Encoder RNNの処理手順
　　　　　①Taking：　文章を単語等のトークン毎に分割し、トークンごとの ID に分割する 。 
　　　　　②Embedding：　ID から、そのトークンを表す分散表現ベクトルに変換 。
　　　　　③EncoderRNN：　ベクトルを順番に RNN に入力していく 。
　　　　　　　　　　　　　　vec1（ベクトル１） を RNN に入力し、 hidden state を出力 。このhidden state と次の入力 vec2（ベクトル２） をまた RNN に入力してきた hidden state を出力という流れを繰り返す 。最後の vec（最終ベクトル） を入れたときの hidden state を final state としてとっておく。この final state が thought vector と呼ばれ、入力した文の意味を表すベクトルとなる 。

　　　**Decoder RNN**
　　　　システムがアウトプットデータを、単語等のトークンごとに生成する構造 。
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/17b6926a-3302-57e7-0616-769525c284c8.png)
　　　　・Decoder RNNの処理手順
　　　　　①Decoder RNN：　Encoder RNNの final state (thought vector) から、各token の生成確率を出力していきます final state を Decoder RNN のinitial state ととして設定し、 Embedding を入力。
　　　　　②Sampling：　生成確率にもとづいて token をランダムに選びます 。
　　　　　③Embedding：　②で選ばれた token を Embedding して Decoder RNN への次の入力とします 。
　　　　　④Detokenize：　①～③を繰り返し、②で得られた token を文字列に直します 。

　　　**演習**
　　　　機械翻訳タスクにおいて、入力は複数の単語から成る文（文章）であり、それぞれの単語はone hot ベクトルで表現されている。Encoder において、それらの単語は単語埋め込みにより特徴量に変換され、そこから RNN によって（一般には LSTM を使うことが多い）時系列の情報をもつ特徴へとエンコードされる。以下は、入力である文（文章）を時系列の情報をもつ特徴量へとエンコードする関数である。ただし _activation 関数はなんらかの活性化関数を表すとする。
　　　　（き）にあてはまるのはどれか。
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/eaef5a29-739e-a4aa-92dd-295af20a5499.png)
　　　　単語 w は one hot ベクトルであり、それを単語埋め込みにより別の特徴量に変換する。
　　　　これは埋め込み行列 Eを用いて、「E.dot(w)」と書ける。

　　　**HREDとは**
　　　　Seq2seqでは、会話の文脈無視で、応答がなされたが、 HRED では 、前の単語の流れに即して応答されるため、より人間らしい文章が生成される 。

　　　**VHREDとは**
　　　　HREDにVAEの潜在変数の概念を追加したもの 。
　　　　HREDの課題を 、VAE の潜在変数の概念を追加することで解決した構造

　　　**VAEとは**
　　　　通常のオートエンコーダーの場合、何かしら潜在変数 z にデータを押し込めているものの 、その構造がどのような状態かわかない。
　　　　そこで、VAEは、データを潜在変数 z の確率分布という構造に押し込めることを可能にします。
　　　　VAEは、オートエンコーダ（自己符号化器）の潜在変数に確率分布 z ~N (0,1) を導入したもの。

　　　**オートエンコーダとは**
　　　　教師なし学習の一つ。そのため学習時の入力データは訓練データのみで教師データは利用しない 。
　　　　入力データから潜在変数z に変換するニューラルネットワークを Encoder
　　　　逆に潜在変数z をインプットとして元画像を復元するニューラルネットワークを Decoder

##６　Word2vec
　　　**RNNの課題**
　　　　RNN では、単語のような可変長の文字列を NN に与えることはできないので、固定長形式で単語を表す必要があった。

　　　**対策**
　　　　可変長の文字列でもNNに与えるようにしたのが、Word2vecである。

　　　**Word2vecの概念**
　　　　各単語の意味をベクトル表現化する手法。

　　　**one-hotベクトル**
　　　　例文） I want to eat apples. I like apples.
　　　　applesは以下のようなベクトルとして扱われる。
　　　　（本来は、辞書の単語数だけ one-hot ベクトルがある）
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/f466b46e-5733-c2db-38d7-78ad04fe50a9.png)

　　　**Word2vecのメリット**
　　　　従来は、ボキャブラリ × ボキャブラリの重み行列が発生していたが、
　　　　Word2vecにより、ボキャブラリ × 任意の単語ベクトル次元のみの重み行列が発生する。
　　　　これにより、大規模データの分散表現の学習が 、現実的な計算速度とメモリ量で実現可能にした 。
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/ec47c131-051a-089a-5db5-3978b825d596.png)

##７　Attention Mechanism
　　　**seq2seqの課題**
　　　　seq2seq の問題は長い文章への対応が難しいです。
　　　　seq2seq では、可変長ベクトルは無理なので、 2 単語でも100 単語でも、固定次元ベクトルの中に入力しなければならない。

　　　**解決策**
　　　　文章が長くなるほどそのシーケンスの内部表現の次元も大きくなっていく、仕組みが必要となる。
　　　　そこで、「入力と出力のどの単語が関連しているのか」の関連度を学習する仕組みであるAttention Mechanismが考え出された。

　　　**具体例**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/ba7dcd54-e8ca-29a1-7986-18d325369f8b.png)
　　　　「 a 」については、そもそも関連度が低く、「 I 」については「私」との関連度が高い。
　　　　関連度を重視するので、少ない計算で解析が可能となる。

　　　**演習**
　　　　以下は再帰型ニューラルネットワークにおいて、構文木を入力として再帰的に文全体の表現ベクトルを得るプログラムである。ただし、ニューラルネットワークの重みパラメータはグローバル変数として定義してあるものとして、_activation関数はなんらかの活性化関数であるとする。木構造は再帰的な辞書で定義してあり、rootが最も外側の辞書であると仮定する。
　　　　（く）にあてはまるのはどれか。
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/5a7222f1-2bf6-101d-c961-43731760334b.png)
　　　　隣接単語（表現ベクトル）から表現ベクトルを作るという処理は、隣接している表現 left と right を合わせたものを特徴量としてそこに重みを掛けることで実現する。
　　　　つまり、「W.dot( np.concatenate ([left, right]))」である。

#深層学習（後編２）
##１　Tensorflowの実装演習
　　　**なぜ、TensorFlowなのか**
　　　　実際にはNumpyから実装するということはあまりなく、TensorFlowなどのwrapperのライブラリーで実装することが多い。TensorFlowが一番多く使用されている。

　　　**TensorFlowとは**
　　　　グーグルが作ったディープラーニングのフレームワークであり、簡単にディープラーニングの実装ができる。

　　　**TensorFlowのエラーについて**
　　　　（演習中に発生したエラーとその対処方法についてメモ）

　　　　エラー「ModuleNotFoundError: No module named 'tensorflow'」
　　　　　　tensorflowがインストールされていなかったようだ。
　　　　　　→AnacondaPromptで「pip install tensorflow」を実行したら解決した。

　　　　エラー「AttributeError: module 'tensorflow' has no attribute 'Session'」
　　　　　　tensorflowのバージョンが悪かったようだ。
　　　　　　→AnacondaPromptで「pip uninstall tensorflow」「pip install tensorflow-gpu==1.3.0」を実行したら解決した。

　　　**constant**
　　　　定数の定義（先に定義する）
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/2b7dd58d-7ddb-652d-ee5f-859190c0fd3d.png)

　　　**placeholder**
　　　　変数の入れ物の定義
　　　　変数は後から定義できる
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/064d12aa-5422-0f24-f4bc-aab4cd97e516.png)

　　　**variables**
　　　　後で変数を変えることができる
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/e36f4aef-a4cf-af22-504f-06e8c5ba5f12.png)

　　　**線形回帰**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/33b1adb4-8168-b5fa-e9d4-b0f1b0c4b025.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/5a109b76-cb2f-2265-3d64-8aff898bcc74.png)

　　　**非線形回帰**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/c30d677f-fb50-b9f7-9a3e-7e5c45cb3935.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/d23ca5eb-ecca-7c94-e6f2-2eae77b1842b.png)

　　　**演習**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/1b092700-8056-69b3-392f-8c01d02f3b34.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/c0440dc5-17f3-09fd-2231-771815d09e3d.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/5ccf7191-49d0-86a2-c4b3-f6a7ec0c730c.png)

　　　**MNIST（エムニスト）分類１層**
　　　　入力値　28*28白黒画像、出力値　0~9の数字
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/63a9c800-9743-fd75-6244-af4ee1b0eb48.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/47fea4b8-c595-47b8-9bbc-46102cdb769f.png)

　　　**MNIST（エムニスト）分類３層**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/5d161c73-4a47-02b6-342b-f5a7fba566e1.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/0b64a0fb-8d93-ed7e-b5c1-050282d1c80a.png)
　　　　tensorflowでは、optimizerは以下のものが用意されている。
　　　　　　optimizer = tf.train.GradientDescentOptimizer(0.5)
　　　　　　optimizer = tf.train.MomentumOptimizer(0.1, 0.9)
　　　　　　optimizer = tf.train.AdagradOptimizer(0.1)
　　　　　　optimizer = tf.train.RMSPropOptimizer(0.001)
　　　　　　optimizer = tf.train.AdamOptimizer(1e-4)

　　　　すべて試したところ、RMSPropOptimizer(0.001)が一番よかった。（正解率0.976）

　　　**例題解説**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/d9f38285-2f00-545c-92e7-7f10ef949d3a.png)
　　　　正解：(a)　denseな演算ではなく、スパースな演算である。

　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/70091c10-8e4f-0839-3faf-b46fd67019db.png)
　　　　正解：(a)　1*1畳み込みによる次元削減により計算量が減少するが、Auxiliary Classifiersの追加により全体としては計算量が抑えられる訳ではない。

　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/580b2072-5568-0e29-abea-f6be255615a3.png)
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/34f85040-ef3b-4f13-35ca-647e79da2b27.png)
　　　　正解：(a)勾配消失問題
　　　　正解：(a)Identity

　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/dc965641-1f20-7c41-a2d9-437acd6bdba3.png)
　　　　正解：(a)

　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/955d8251-e841-565c-3fb4-7fe74b15a492.png)
　　　　正解：（あ）　ワンショット学習というのは、あるクラスに対して、画像を１枚用意して、その画像の特徴ベクトルがクラスに対して近いか遠いかを学習する。
　　　　　学習データが悪い場合の例
　　　　　　医師と看護師を分類する学習おいて、女性の医師と男性の看護師の場合にエラーが多い。
　　　　　　学習データのほとんどが、医師は男性で、看護師は女性であったため、男性か女性で判定していた。

　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/266f2e30-1c96-46cc-0928-76f2b092aade.png)
　　　　正解：(a)
　　　　　(b)は、最大２つではなく必ず２つ
　　　　　(c)は、単純和ではなく重み付け
　　　　　(d)は、２つの候補領域も出力される

##２　強化学習
　　　**強化学習とは**
　　　　長期的に報酬を最大化できるように環境のなかで行動を選択できるエージェントを作ることを目標とする機械学習の一分野。行動の結果として与えられる利益報酬をもとに、行動を決定する原理を改善していく仕組み。

　　　**強化学習の応用例**
　　　　マーケティング分野（キャンペーンのコストという負の報酬とキャンペーンで生み出されると推測される売上という正の報酬を受ける）、ゲーム分野

　　　**探索と利用のトレードオフ**
　　　　環境について事前に完璧な知識があれば、最適な行動を予測し決定することは可能。
　　　　どのような顧客にキャンペーンメールを送信すると、どのような行動を行うのかが既知である状況。
　　　　強化学習の場合、上記仮定は成り立たないとする。不完全な知識を元に行動しながら、データを収集。最適な行動を見つけていく。

　　　　①過去のデータで、ベストとされる行動のみを常に取り続ければ、他にもっとベストな行動を見つけることはできない。探索が足りない状態。
　　　　②未知の行動のみを常に取り続ければ、過去の経験が活かせない。利用が足りない状態。

　　　　①と②はトレードオフの関係性

　　　**強化学習のイメージ**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/faf45f8d-9d55-1f8b-c2c0-18cb2ff31996.png)

　　　**強化学習の差分**
　　　　強化学習と通常の教師あり、教師なし学習との違いは？
　　　　結論：目標が違う
　　　　・教師なし、あり学習では、データに含まれるパターンを見つけ出すおよびそのデータから予測することが目標
　　　　・強化学習では、優れた方策を見つけることが目標

　　　**強化学習の歴史**
　　　　・冬の時代があったが、計算速度の進展により大規模な状態をもつ場合の、強化学習を可能としつつある。
　　　　・関数近似法と、Q 学習を組み合わせる手法の登場

　　　　　Q学習：行動価値関数を、行動する毎に更新することにより学習を進める方法関数
　　　　　関数近似法：価値関数や方策関数を関数近似する手法のこと

　　　**価値関数**
　　　　・価値を表す関数としては、状態価値関数と行動価値関数の2 種類がある

　　　　　　状態価値関数：ある状態の価値に注目する場合
　　　　　　行動価値関数：状態と価値を組み合わせた価値に注目する場合

　　　**方策勾配法**
　　　　方策反復法。方策をモデル化して最適化する手法（再帰的に更新していく手法）。
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/74421365-08d5-9cae-124e-9904da817496.png)
　　　　Ｊとは？　→方策の良さを表す関数
　　　　Ｊを定義しなければならない
　　　　定義方法
　　　　　平均報酬：行動による全ての価値の平均
　　　　　割引報酬和：過去になればなるほど、加算する報酬の割合を減衰する方法（一番最近のものを重視する）
　　　　　上記の定義に対応して、行動価値関数Q(s, a)の定義を行う。
　　　　　方策勾配の定理が成り立つ。
　　　　　　方策勾配の定理
　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/af3b0644-16b7-1cb1-40f0-fd4a4067175c.png)

　　　**例題解説**
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540863/4f699aa2-63da-bd52-a765-ddc4df818a45.png)
　　　　正解：(a)

　　　**方策勾配定理導出のポイント**
　　　　方策勾配定理は基本的には下記の２式から導出される
　　　　　状態価値関数 v(s) = sum_a ( π( a|s)Q(s,a))
　　　　　ベルマン方程式 Q(s,a) = sum_s’(P(s’|s,a)[r(s,a,s’) + γ V(s’)]

　　　**DQN**
　　　　（修了テストより）
　　　　　DQNの特徴
　　　　　・強化学習で用いられるQ学習と呼ばれるアルゴリズムに基づいている。
　　　　　・DQNの出力の数はとることができる行動の数である。
　　　　　・学習を安定化させるためにTarget Networkと呼ばれる一定間隔ごとに更新されるネットワークを用いている。
　　　　　・DQNでは画像などの高次元データを直接入力として用いることはできる。

　※2021/01/11：ここに掲載したバナー広告は利用規約違反のため削除しました。