レポート２

深層学習前編2
section1):勾配消失の問題[ReLU関数の使用]
　シグモイド関数を活性化関数として使用することで微分してアップデートを重ねていくと勾配が消失してしまう問題。活性化関数にシグモイド関数の代わりにReLU関数を使うことで問題が起きにくくなる。精度の面も担保されているため現在最も使われている関数。

復習：
確認テスト
連鎖律の原理を使い、dz/dxを求めよ。
z = t2
t = x +y

dz/dx= dz/dt・dt/dx
     =2t・1
     =2t
     =2(x+y)

確認テスト
シグモイド関数を微分した時、入力値が0の時に最大値をとる。その値を示せ。
→シグモイド関数の取りうる最大値は0.25

確認テスト
重みの初期値を０にするとどのような問題が発生するか。
→全ての値が同じ値で伝わるためパラメータのチューニングが行われなくなる。

確認テスト
一般的に考えられるバッチ正規化の効果を２点あげよ
→1.計算の高速化。2.勾配消失が起こりづらくなる。

Jupyter演習考察：活性化関数と初期値の選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/42ebb966-074a-c060-7c75-96dba028f3c2.png)


活性化関数と初期値設定の組み合わせにより勾配消失の問題を回避できる。

Section2):学習率最適化手法について
　学習率の値の決定について：学習率の値が大きすぎると最適値にいつまでもたどり着かず発散してしまい、逆に小さすぎる場合収束するまでに時間がかかってしまう。そのため、初期の学習率を大きく設定して徐々に学習率を小さくパラメータ毎に可変（最適化）させていく。

確認テスト：最適化法各特徴
・モメンタム
　誤差をパラメータで微分したものと学習率の積を減算したあと現在の重みに前回の重みを減算した値と慣性の積を加算する。局所的にならず、最適値に到達する時間も早い。

・AdaGrad
  誤差をパラメータで微分したものと再定義した学習率の積を減算する。緩やかな勾配の時に最適値に到達する時間が他に比べて速い。学習率が徐々に小さくなるため鞍点問題に陥りやすい。一度学習率が０に十分近くなってしまった次元に対しては新しく急な勾配が現れても対応できない*)。

・RMSProp
  AdaGradの*改善策。
誤差をパラメータで微分したものと再定義した学習率の積を減算する。局所最適解にならない。ハイパーパラメータの調整が必要な場合が少ない。

・Adam
　モメンタムの、過去の勾配の指数関数的減衰平均。RMSPropの過去の勾配の２乗の指数関数的減衰平均。この二つをそれぞれはらんだ最適化アルゴリズム。

Jupyter演習考察：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/cacb3e37-c7c3-d96a-6cb2-bc03512a4fa3.png)




Section3):過学習について
　訓練データに合わせ込まれすぎてテストサンプルに対して誤差が大きくなること。パラメータの数が多い、パラメータが適切ではないなど多くの原因がある。
対策法
・正則化
　ネットワークの自由度を制約。L1正則化、L2正則化の他、最も使われる手法としてドロップアウトがある。
pノルム：p=1 の場合L1、p=2の場合L2正則化
ドロップアウト＋L1等組み合わせで計算時間・アウトプットが変わるためサンプルごとに変えて試してみる。

確認テスト：機械学習の線形モデルの正則化はモデルの重みの制限で可能となる。リッジ回帰の特徴について選択しなさい。
→ハイパーパラメータを大きい値にすると全ての重みが限りなく0に近づく。

確認テスト：下図について、L1正則化を表しているものはどちらか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/05ab82a5-15b2-7b7f-633c-f454641a345e.png)




→右図：スパース推定。L1は０値をとることができるため計算リソースを縮小できる。L2はより計算のリソースが取られる。

例題チャレンジ：L２パラメータ正則化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/216a27c1-72d9-8ff7-4cd1-142dd10525e4.png)


→(4)param
 L2ノルムは||param||**2なのでその勾配が誤差の勾配に加えられる。2*paramは係数が1/2に吸収されるため。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/ca1426da-cd83-3140-75d9-2573e0c7dfce.png)


→(3)np.sign(param)
L1ノルムは、|param|なのでその勾配が誤差の勾配に加えられる。 
つまり、sign(param)である。signは符号関数である。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/033dc662-48a0-702d-412f-8105dc910b69.png)


→(1)image[:,top:bottom, left:right]
imageの形式が(縦幅, 横幅, チャンネル)であるのも考慮する。 

Section4):CNN畳み込みニューラルネットワーク
　画像のほか音声データなど時系列データにも対応。

・畳み込み層
　画像の場合、縦、横、チャンネルの3次元のデータをそのまま学習し、次に伝えることができる。 3次元の空間情報も学習できるような層が畳み込み層である。 

畳み込み演算：入力データに対してフィルターを一定の間隔（ストライド）でスライドさせて適用させる。入力データの要素とフィルターの要素を乗算してその和を求める。フィルター適用後、バイアスを加算。畳み込み層の処理を行う前に、入力データと出力データのサイズの調整を行うため、０などでデータを埋める（パディング）。ストライドを大きくすると出力サイズは小さくなる。
Jupyter演習：simple convolution network
→多次元データ(画像等)を２次元配列に変更。
im2col: 行列計算に落とし込むことで多くのライブラリを使うことができる。

・プーリング層
確認テスト：
　サイズ6×6の入力画像を、サイズ2×2のフィルタで 畳み込んだ時の出力画像のサイズを答えよ。 なおストライドとパディングは1とする。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/010b5055-802e-8ccd-2829-222fc564e804.png)

→出力サイズ7×7

Section5):最新のCNN
・Alexnet
　2012年に開かれた画像認識コンペティション2位に大差をつけて優勝したモデル。 AlexNetの登場で、ディープラーニングが大きく注目を集めた。 
モデルは5層の畳み込み層およびプーリング層など、それに続く3層の全結合層から構成される。 サイズ4096の全結合層の出力にドロップアウトを使用して過学習を防ぐ。



深層学習後編１

確認テスト復習：サイズ5.5の入力画像を、サイズ3.3のフィルタで畳み込んだ時の出力画像のサイズを答えよ。なおストライドは2、パディングは1とする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/d3d3b068-3650-c754-42bc-7a004117d503.png)




Section1): RNN再帰型ニューラルネットワーク全体像
　時系列データに対応可能なニューラルネットワーク。時系列データとは、時間的順序を追って一定間隔ごとに観察され，しかも相互に統計的依存関係が認められるようなデータの系列のこと。音声データやテキストなどが挙げられる。

確認テスト：RNNのネットワークには大きくわけて3つの重みがある。1つは入力から現在の中間層を定義する際にかけられる重み、1つは中間層から出力を定義する際にかけられる重みである。残り1つの重みについて説明せよ。
→中間層から中間層へ渡される重み

・RNNの特徴
　時系列モデルを扱うには、初期の状態と過去の時間t-1の状態を保持し、そこから次の時間でのtを再帰的に求める再帰構造が必要になる。
・BPTT
　RNNにおいてのパラメータの調整方法の一つ。誤差逆伝播の一種。

確認テスト：誤差逆伝播の復習
連鎖律の原理を使い、dz/dxを求めよ。
z = t2
t = x +y

dz/dx= dz/dt・dt/dx
     =2t・1
     =2t
     =2(x+y)

確認テスト：
　下の図のy1をx,S0,S1,Win, W, Woutを用いて数式で表せ。＊バイアスは任意の文字で定義。また中間層の出力にシグモイド関数g(x)を作用させよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/218a54c4-d7de-18db-4c9e-da3ef2ab0942.png)


→Z１=Sigmoid(S0W+x1Win+b)
  y1=Sigmoid(Z1Wout+c)

コード演習問題：
下の図はBPTTを行うプログラムである。なお簡単化のため活性化関数は恒等関数であるとする。また、calculate_dout関数は損失関数を出力に関して偏微分した値を返す関数であるとする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/2a3feae3-3472-1cf2-aaf1-cb202fe9f09c.png)

（お）にあてはまるのはどれか。
（1）delta_t.dot(W)
（2）delta_t.dot(U)
（3）delta_t.dot(V)
（4）delta_t* V
→（2）delta_t.dot(U)

Section2):LSTM
・RNNの課題
　時系列を遡れば遡るほど勾配が消失していく。長い時系列の学習が困難。これを解決するものがLSTM。
勾配消失問題について説明
→誤差逆伝播法が下位層に進んでいくに連れて、勾配がどんどん緩やかになっていく。そのため、勾配降下法による、更新では下位層のパラメータはほとんど変わらず、訓練は最適値に収束しなくなる。

確認テスト：
　シグモイド関数を微分した時、入力値が0の時に最大値をとる。その値を示せ。
→0.25

・勾配爆発
　勾配が、層を逆伝播するごとに指数関数的に大きくなっていく。

演習チャレンジ：
　RNNや深いモデルでは勾配の消失または爆発が起こる傾向がある。勾配爆発を防ぐために勾配のクリッピングを行うという手法がある。具体的には勾配のノルムがしきい値を超えたら、勾配のノルムをしきい値に正規化するというものである。以下は勾配のクリッピングを行う関数である。（さ）にあてはまるのはどれか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/66b47d15-101e-fbf6-b860-02042e81c615.png)

（1）gradient * rate
（2）gradient / norm
（3）gradient / threshold
（4）np.maximum(gradient, threshold)

→（1）gradient * rate
　勾配の閾値を超えなかった場合その閾値（rate）が掛け合わせられる。

・CEC
 勾配消失および勾配爆発の解決方法として、勾配が、1であれば解決できる。
 
課題：入力データについて、時間依存度に関係なく重みが一律である。つまりニューラルネットワークの学習特性が無いということ。

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

・忘却ゲート
　CECは過去の情報が全て保管されており、情報がいらなくなっても削除することができない。過去のデータがいつまでも影響を及ぼしてしまう。そのため忘却機能が必要。

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

「映画おもしろかったね。ところで、とてもお腹が空いたから何か____。」
→忘却ゲートが作用しても影響を及ぼさない。

演習チャレンジ：
　以下のプログラムはLSTMの順伝播を行うプログラムである。ただし_sigmoid関数は要素ごとにシグモイド関数を作用させる関数である。（け）にあてはまるのはどれか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/f685cc7d-9481-f51a-31d4-a6cc1a7b7b0f.png)


（1）output_gate* a + forget_gate* c
（2）forget_gate* a + output_gate* c
（3）input_gate* a + forget_gate* c
（4）forget_gate* a + input_gate* c
→（3）input_gate* a + forget_gate* c
　　計算されたセルへの入力と1ステップ前のセルの状態に入力ゲート、忘却ゲートを掛けて足し合わせたもので新しいセルを表現

・覗き穴結合
　CECの保存されている過去の情報を、任意のタイミングで他のノードに伝播させたり、あるいは任意のタイミングで忘却させたい。CEC自身の値は、ゲート制御に影響を与えていない。覗き穴結合とはCEC自身の値に、重み行列を介して伝播可能にした構造。


Section3):GRU
 LSTMでは、パラメータ数が多く、計算負荷が高くなる問題があった。これを解決するのがGRU。従来のLSTMでは、パラメータが多数存在していたため、計算負荷が大きかった。しかし、GRUでは、そのパラメータを大幅に削減し、精度は同等またはそれ以上が望める様になった構造。計算負荷が低い。

確認テスト：
　LSTMとCECが抱える課題について、それぞれ簡潔に述べよ。
→LSTM：パラメータが多く計算負荷がかかる
　CEC:勾配が常に１で渡されるため、パラメータ更新ができないため深層学習の特性がなくなる

演習チャレンジ：
　GRU(Gated Recurrent Unit)もLSTMと同様にRNNの一種であり、単純なRNNにおいて問題となる勾配消失問題を解決し、長期的な依存関係を学習することができる。LSTMに比べ変数の数やゲートの数が少なく、より単純なモデルであるが、タスクによってはLSTMより良い性能を発揮する。以下のプログラムはGRUの順伝播を行うプログラムである。ただし_sigmoid関数は要素ごとにシグモイド関数を作用させる関数である。（こ）にあてはまるのはどれか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/1b87ab53-36bb-e8e6-ca5b-4e73bc166f2c.png)


（1）z * h_bar
（2）(1-z) * h_bar
（3）z * h * h_bar
（4）(1-z) * h + z * h_bar
→（4）(1-z) * h + z * h_bar
　新しい中間状態は、1ステップ前の中間表現と計算された中間表現の線形和で表現される。つまり更新ゲートzを用いて、(1-z) * h + z * h_barと書ける。

確認テスト：
　LSTMとGRUの違い
　→LSTMはパラメータが多い
　　GRUは少ない

Section4):双方向RNN
 時系列データとして過去の情報だけではなく未来の情報を加味することで精度を向上させるためのモデル。文章の推敲、機械翻訳に非常に有効。RNNの中間層のユニットをLSTM blockと呼ばれるメモリと3つのゲートを持つブロックに置き換えることで実現される。

演習チャレンジ：
　以下は双方向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/550194/e5eb321d-4068-2e59-781c-a99eb483a626.png)

（1）h_f + h_b[::-1]
（2）h_f * h_b[::-1]
（3）np.concatenate([h_f, h_b[::-1]], axis=0)
（4）np.concatenate([h_f, h_b[::-1]], axis=1)
→（4）np.concatenate([h_f, h_b[::-1]], axis=1)
双方向RNNでは、順方向と逆方向に伝播したときの中間層表現をあわせたものが特徴量となる


Section5):Seq2Seq
 Encoder-Decoderモデルの一種。具体的な用途は機械対話や機械翻訳。

・Encoder RNN
 ユーザーがインプットしたテキストデータを単語等のトークンに区切って渡す。

・Decoder RNN
  システムがアウトプットデータを、単語等のトークンごとに生成する構造。

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

（1）時刻に関して順方向と逆方向のRNNを構成し、それら2つの中間層表現を特徴量として利用するものである。
（2）RNNを用いたEncoder-Decoderモデルの一種であり、機械翻訳などのモデルに使われる。
（3）構文木などの木構造に対して、隣接単語から表現ベクトル（フレーズ）を作るという演算を再帰的に行い（重みは共通）、文全体の表現ベクトルを得るニューラルネットワークである。
（4）RNNの一種であり、単純なRNNにおいて問題となる勾配消失問題をCECとゲートの概念を導入することで解決したものである。

→(2)

演習チャレンジ：
機械翻訳タスクにおいて、入力は複数の単語から成る文（文章）であり、それぞれの単語はone-hotベクトルで表現されている。Encoderにおいて、それらの単語は単語埋め込みにより特徴量に変換され、そこからRNNによって（一般にはLSTMを使うことが多い）時系列の情報をもつ特徴へとエンコードされる。以下は、入力である文（文章）を時系列の情報をもつ特徴量へとエンコードする関数である。ただし_activation関数はなんらかの活性化関数を表すとする。（き）にあてはまるのはどれか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/afb6b980-cb26-0b73-1c83-bc746f661ac4.png)


（1）E.dot(w)
（2）E.T.dot(w)
（3）w.dot(E.T)
（4）E * w
→（1）E.dot(w)
　単語wはone-hotベクトルであり、それを単語埋め込みにより別の特徴量に変換する。これは埋め込み行列Eを用いて、E.dot(w)と書ける。

・HRED
 Seq2seqでは１問１答にしか対応していない。Seq2seqでは、問いに対して文脈なく応答がなされたが、HREDでは、前の単語の流れに即して応答されるため、より人間らしい文章が生成される。

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

確認テスト：
　seq2seqとHRED、HREDとVHREDの違いを簡潔に述べよ。
→Seq2seqでは１問１答にしか対応していない。それを解決したのがHRED。
　VHREDはHREDの応答をより人間らしく、同じ意味の返答をランダムに違う表現で返答させる。

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

通常のオートエンコーダーの場合、何かしら潜在変数zにデータを押し込めているものの、その構造がどのような状態かわからない。VAEはこの潜在変数zに確率分布z∼N(0,1)を仮定したもの。
　VAEは、データを潜在変数zの確率分布という構造に押し込めることを可能にする。


確認テスト：
　VAEに関する下記の説明文中の空欄に当てはまる言葉を答えよ。
自己符号化器の潜在変数に____を導入したもの。
→確率分布


Section6):word2vec
課題:RNNでは、単語のような可変長の文字列をNNに与えることはできない。そのため、固定長形式で単語を表す必要がある。学習データからボキャブラリを作成。辞書の単語数だけone-hotベクトルができあがる。
　大規模データの分散表現の学習が、現実的な計算速度とメモリ量で実現可能。

Section7):AttentionMechanism
 seq2seq では2単語でも、100単語でも、固定次元ベクトルの中に入力しなければならない。文章が長くなるほどそのシーケンスの内部表現の次元も大きくなっていく仕組みが必要となる。Attentionmechanismは「入力と出力のどの単語が関連しているのか」の関連度を学習する仕組み。

確認テスト：
　RNNとword2vec、seq2seqとAttentionの違いを簡潔に述べよ。
→word2vecは重みに対する計算が現実的な速度でできる。ボキャブラリー×２。対しRNNはボキャブラリー数×ボキャブラリー数で重みが生成される。
Attentionを併用することでより長い文章を扱うことができる。




深層学習後編２
Section1):Tensorflowの実装

・Tensorflow：googleが作ったディープラーニングのフレームワークのこと。
グラフのノードは数学的演算を表し、グラフのエッジはそれらの間で伝達される多次元データ配列（テンソル）を表す。 柔軟なアーキテクチャにより、1つのAPIを使用してデスクトップ、サーバー、またはモバイルデバイスの1つ以上のCPUまたはGPUに計算を展開できる。


演習：ノイズの値が小さければ複雑な非線形でも精度よく予測することができる。

Try 
𝑦=30𝑥2+0.5𝑥+0.2について回帰する。誤差が収束するようにiters_numやlearning_rateを調整する。


結果考察
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/b7762a05-705b-654b-d24a-f9a1c5a5e292.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/e8495484-8039-71fc-6ea5-8cd489b6547a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/fe8b0bf9-2aaa-4947-1de8-a058a4339312.png)

iters_numの数値をあげて、plot_intervalを大きく取ることで精度が上がった。
計算速度は遅くなる。
Try：分類３層(mnist)
隠れ層のサイズ、optimizerを変更してみる
hidden_layer_size_1 = 600→1000
hidden_layer_size_2 = 300→500
optimizer:Adam→Adagrad, RMSProp,Momentum等に変更。

出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/f959e571-4f7a-4f0e-cc76-565b6f3f62cb.png)

隠れ層を増やすことで一回の計算速度は遅くなるが正解率は向上。
Optimizer:RMSPropで最も良い結果が出た。

Try:分類CNN(mnist)
ドロップアウト率を０に変更する。
dropout_rate = 0.5→０とすると制度が若干落ちる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550194/1530dea3-b060-c0ce-d832-bf2b489d27e3.png)



Section2):強化学習
　長期的に報酬を最大化できるように環境のなかで行動を選択できるエージェントを作ることを目標とする機械学習の一分野。行動の結果として与えられる利益(報酬)をもとに、行動を決定する原理を改善していく仕組み。教師あり・なし学習とは目的が異なる。教師なし、あり学習では、データに含まれるパターンを見つけ出すおよびそのデータから予測することが目標。一方強化学習では、優れた方策を見つけることが目標。