深層学習後編2 keras～強化学習 講義課題視聴レポート (現場で潰しが効くディープラーニング講座)

### Keras
- kerasはTensorFlowをより簡易化したライブラリである
- Variablesで変数の定義やプレースホルダー設定が必要ないので、シンプルにコードを書くことができる

![無題27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/89c15ab8-cb74-21a5-a049-eefd19749415.png)
![無題28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/1c76fd5b-fa6c-b97c-c3de-cc2e1b9964f7.png)

##### OR回路

![無題29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/214c716a-0f62-b9a2-c4e3-b0324bdb705f.png)
![無題30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/179dccd3-7e66-30bd-c279-76f9ebf1e07e.png)

- ランダムシードを0から1に変更すると、学習の精度が落ちていることが分かった。ランダム要素を変えるだけで精度の良しあしが変わる

![無題31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/6be34da1-f4bf-a211-a9ed-c44ecee908e3.png)

- エポック数を30から100に変更することで、最終的な誤差が少なくなることが確認できた。しかし、エポック数を増やすと計算に時間がかかる、過学習を起こすなどのデメリットもある

![無題32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/ad2a4827-390f-9f39-198a-6a335dfd18a5.png)

- OR回路をAND回路に変更すると学習がうまくいくが、XOR回路にすると学習がうまくいかない。これはXOR回路が非線形なためである。これを解消するには活性化関数を使う、多層にするなどを行うとよい
![無題33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/689f8727-2e01-e503-dc14-1e75cd8286e5.png)
![無題34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/9917a37b-a915-025b-6bef-606c372ba281.png)

- バッチサイズを1から10に変えると一回の計算速度が速くなっていることが確認できる

![無題37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/77c9bbf2-294b-1fee-9dc8-8c1c2cbc811e.png)


##### irisデータの分類
- 活性化関数にrelu関数を使用したニューラルネットワークでirisデータの分析を行う

![無題38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/85458ef0-f05f-b33d-e956-ec3186212a7b.png)
![無題39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/91148dfb-e4a5-7620-acf8-a63ce7485412.png)

- 活性化関数をシグモイド関数にすると、同様に良い結果を得ることができた。層が深いニューラルネットワークにするとシグモイド関数のほうが精度が悪い場合が多い

![無題40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/392119cc-f078-fea3-6038-ec689a64c40b.png)

- 確率的勾配降下法の学習率を0.1にした場合、早い段階で精度が高くなっていることが確認できる(初期値は0.01なのでSGDをインポートしてcompileの引数に渡すことで学習率を変える)

![無題41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/ebd19390-dfa8-283f-6f1e-2fed22c3b5f3.png)

##### mnist(分類)
![無題42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/ee6a0579-f14b-d1be-e092-6cc45187f6d3.png)
![無題43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/b4961538-4e83-9ef0-5555-271aa505da6f.png)

- ワンホットベクトルをFalseにするとエラーが発生する。これは誤差関数にカテゴリカルクロスエントロピーを使う場合はワンホットベクトルを出力層の出力としなければならないためエラーが起きた。そこで誤差関数にスパースカテゴリカルクロスエントロピーを使うことでエラーを起こさず学習を行うことができる。分類をワンホットベクトルで行うか、そうでないかで使用する誤差関数を変える必要がある

![無題45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/75e7ca95-9552-fbfe-493c-b21c68f337a1.png)
 
- Adamの学習率を0.001から0.01にあげると学習精度はあまり変わらないことを確認した

![無題46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/0b660ecb-da4c-992e-8c66-2aa563fb2f2b.png)

##### mnist(CNN)
- kerasでは重み行列の列数、行数を手動で設定する必要がない
- TensorFlowと同様にpaddingをsameとすると入力と出力のサイズを一致させることができる
![無題47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/88093281-4bc3-11d9-56a4-7b53bf9ecb60.png)

![無題48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/09eec6bc-6a5a-5251-9f95-6e166f99e9ae.png)

##### cifer10
- 車や犬などの画像のデータセットを分類する問題
- 正解ラベルがワンホットベクトルではないため、必要に応じてワンホットベクトル化する必要がある

![無題49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/f97c8c65-ca62-aa2e-368c-1514a5d1cc45.png)
![無題50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/52f645ec-2cb2-8832-235f-36c7b638b032.png)

##### RNN
- 2進数の計算を行うRNN
- 活性化関数はシグモイド関数で、誤差関数は平均二乗誤差、オプティマイザーはSGDを使用

![無題51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/4e749fc5-fd60-5901-6660-9aac8217fa63.png)
![無題52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/b9f53584-c7e5-c6f0-45c8-d4686406d025.png)
![無題53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/51532f15-defe-d9a3-132f-fae5dc8de50b.png)

- RNNのノード数を128に変更しても、学習の精度は変わらず100%のままだった

![無題54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/73f4dcad-3307-f405-6c4b-f157633cabb3.png)

- 活性化関数をrelu関数にした場合、正解率が下がった

![無題55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/975833ee-1168-600b-f08f-e19b578976b5.png)

- 活性化関数をtanh関数にした場合、シグモイド関数同等の結果を得ることができた

![無題56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/754c4a89-fb3d-1b66-5b3b-9629d003516b.png)

- オプティマイザーをAdamにすると、学習の進みは遅いが最終的には初期と同様の結果を得られた

![無題57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/6e729be9-081f-696e-6eac-0529ed3a996e.png)

- 入力のドロップアウト率を0.5にすると、初期よりも学習精度が下がった

![無題58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/dbb7286c-c64b-e03d-dba0-f9c3050098e1.png)

- 再帰のドロップアウト率を0.3にすると入力のドロップアウト率を0.5にした時よりは良いが、初期よりは学習精度が下がった

![無題59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/4d7dcbb1-c3e4-2016-efbd-f34ab6d06460.png)

- kerasではunrollを使ってRNNを展開することで計算速度を早くすることができる。しかし、メモリを使うためデータサイズが大きい場合は有効でない

![無題60.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/7b5270dd-5adc-ad14-ae7a-f62a62af226e.png)

- kerasではsimpleRNNの部分をLSTMやGRUに変えることで簡単に実装することができる。そのためモデルの比較が容易である。

### 強化学習
- 強化学とは長期的に報酬を最大化することを目的として、環境の中でみずから行動を選択できるエージェントを作ることを目的とした機械学習の一分野
- 報酬を最大化するための行動原理を改善する仕組み
- 例)マーケティング
    - 環境：会社のマーケティング担当部署
    - エージェント：顧客のプロフィールと購入履歴をもとに、キャンペーンメールを送る顧客を決めるソフトウェア
    - 行動：顧客ごとにメールの送信、非送信の2つのどちらかを選択
    - 報酬：メール送信のコストという負の報酬とキャンペーンで生み出される売り上げという正の報酬
- ほかにも囲碁や将棋などのゲームの分野でも利用されている

##### 探索と利用のトレードオフ
- 環境について、「どの行動を起こせばどれくらい報酬が増える」ということを知っている場合は最適な行動をとることが可能となる
- 強化学習では上記の仮定は成り立たないとする。つまり手元にあるデータが不完全であり、新たにデータを収集しながら最適な行動を探していく
- この場合、過去のデータをもとにした最適な行動をとると未知の最適な行動を探索することができない。また、未知の行動をとり続けると過去のデータを利用することができない、というトレードオフの関係となる

##### 強化学習のイメージ
![無題11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/d5fef1ee-6eb8-8de3-0724-3401ab797f76.png)


##### 強化学習とその他の機械学習の違い
- 教師なし学習、教師あり学習は学習データに含まれるパターンを見つけ、そのパターンをもとに未知のデータについて予測することが目標
- 強化学習は与えられた環境のなかで報酬を最大化するための行動を探すことが目標

##### 強化学習の歴史
- 強化学習には計算速度の問題で冬の時代があった。しかし、近年CPUやGPUの高性能化により、複雑な強化学習も可能になりつつある
- また関数近似法とQ学習を組み合わせる手法も登場した
- Q学習とは行動価値関数を行動を行うたびに更新することにより、学習精度を高める手法
- 関数近似法とは行動価値関数や方策関数を関数近似する手法。関数近似することによって、行動と行動によって得られる報酬を連続値の関数で表現することができるようになるなどの利点がある

##### 行動価値関数とは
- 価値を表す関数には状態価値関数と行動価値関数の2種類ある
- ある状態の価値に注目した関数が状態価値関数
- ある状態の時にある行動をとった時の関数が行動価値関数

##### 方策関数
- 方策関数とはある状態においてエージェントがどのような行動をとるかの確率を与える関数
- 方策関数によって決められた確率と行動によって得られる価値によってエージェントの行動が決定される

##### 方策勾配法
- 方策勾配法とは方策関数を最適化する手法である

![無題12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/ab0202c6-73e1-e0be-fcb2-1c991ffe9d83.png)

- Jは方策の最適さを表し、あらかじめ定義する必要がある。その方法として平均報酬と割引報酬和の2つがある
- 平均報酬とは各行動をとったときに生まれる報酬の平均をとったもの。割引報酬和は報酬を加算する割合を徐々に減らしていったものである
- この2つに従って行動価値関数の定義をすると以下の方策勾配定理というものが成り立つ

![無題14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/f536c0fe-629e-4086-1d3d-f2afa7816089.png)


- 方策勾配定理は状態価値関数とベルマン方程式から対数微分法を利用することで導出することができる

![無題13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/4d52135c-a1d4-0e3c-7022-6ed852d14798.png)