強化学習

#1. 強化学習

#1.1. 強化学習のイメージ
深層学習、機械学習は、教師のありなしがあっても、何かの特徴を捉えるのが仕事だった。
強化学習は、ちょっと趣が違い、何かの仕事の結果の利益を最大化するのがメインとなる。

ある環境で、長期的に、報酬を最大化出来る行動を選択出来るエージェントを作るのが強化学習。
現実に言いかえると、
ある職場で、長期的に、給料、成果を最大化する行動の選択決定方法を理解学習する。

![強化学習イメージ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/ac3a71d2-785a-1ec3-d036-78cef1b83fed.png)


なお、強化学習の考え方は、昔からあったが、計算量が膨大だったため、最近まで下火だった。
また、Q学習、関数近似法が出てきたので盛り上がっている。


#1.2. 強化学習でのトレードオフ

強化学習は、報酬を最大化する為に、今の状態に対しての最適な行動を決める必要がある。

+ 行動を決める指針として、過去の情報にだけ頼っていると、最適解が他にあっても見つけられない。適当でも冒険する事が必要である。
+ 逆に、冒険ばかりしていると、過去の経験を生かせない。

強化学習では、上記の２つのバランスを取ってやることが必要である。

#2. 強化学習の数学モデル

##2.1. 強化学習の学習対象関数
強化学習では、以下の２つを学習する。

+ 方策関数( $\prod (s ,a)$ )
+ 価値関数( $Q (s, a)$ )



##2.1.1. 方策関数

~~~math
方策関数：\prod (s) = a
~~~

action

方策関数は、エージェントがとる行動を決めるための関数である。
価値関数の結果を最大化するような行動をとるように決める。


##2.1.2. 価値関数

価値関数は、エージェントが目標とする価値を決める関数である。ゲームの終わりまで、今の方策を続けたときに、最終の報酬の予測値を求める。
そして、この価値関数は、以下の２つある。

+ 状態価値関数V：状態sによって価値が決まる。状態が良ければ価値が上がる。
+ 行動価値関数Q：状態sと、そのときエージェントがとった行動aによって価値が決まる。

~~~math
状態価値関数:V^{\prod} (s)
 \\
行動価値関数:Q^{\prod} (s, a)
~~~

status, action


##2.2. 学習方法

強化学習では、方策関数と、価値関数を学習する。価値関数は、将来的にどうあるべきかを指し示し、方策関数は、そこへ到達するために今何をすべきかを決定する関数である。


**関数近似法**
方策関数や価値関数を、関数近似する。昔の強化学習では、INに対してOUTが示されたマトリックスを利用して学習していたが、これを関数で対応するようになった。
深層学習の手法と合わせて利用する。

**Q学習**
価値関数を、行動するたびに更新する。機械学習みたいなかんじ。
深層学習の手法と合わせて利用する。


**方策勾配法**

方策関数をNNにして学習する。

~~~math
方策関数：\prod (s,a | \theta) 

~~~

方策関数 $\pi $ は、上のように重み$\theta$があるので、NNに出来る


~~~math

\theta^{t+1} = \theta^{t} + \epsilon \nabla J ( \theta ) \\

\\
※ \theta は、重み w　のこと \\
※　Jは誤差関数（強化学習の場合は期待収益）　\\
※  \epsilon は学習率\\
~~~

上記の式で、誤差関数を含む項が＋になっている。普通のNNの学習の場合、誤差を最小にするために学習するので、ここは－である。
しかし、強化学習の場合は、利益を最大化する必要があるので、＋になっている。

なお、右辺の項の期待収益部分を式展開すると以下になる。

~~~math

 \nabla_{\theta} J ( \theta ) = \nabla_{\theta} \sum_{a \in A} \prod_{\theta} (a | s) Q^{\pi} (s,a)

~~~

$\prod_{\theta} (a | s) Q^{\pi} (s,a)$ の部分は、ある行動をとった時の報酬をさす。
そして、$\sum$で、すべての行動パターンに対して合計している。




#3. AlphaGo

強化学習の有名モデル。

+ AlphaGo Lee
+ AlphaGo Zero


##3.1. AlphaGo Lee

AlphaGo　Leeでは、方策も価値関数もNNにしている。

###3.1.1. PolicyNet（方策関数）
方策関数を畳み込みNNのPolicyNetとしている。
入力は、碁盤の目19×19を48チャンネル持っている。このチャンネル数は、黒石、白石、履歴、呼吸点などの情報ごとに入力データがある。
そして、2次元データなので、内部で畳み込みを実施する。
出力では、ソフトマックス関数で、どこのマスに打てばよいかを出力している。

![AlphaGo_PolicyNet.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/f035735b-9d6c-fbe5-105b-dbf974acdcca.png)



###3.1.2. ValueNet（価値関数）

価値関数をこれも畳み込みNNのValueNetとしている。
入力に、今の手番が黒か白かチャンネルが増えて49チャンネル。
最後の方に、2次元データを1次元にするために全結合する。
出力では、このままで勝てるかどうかの勝率が-1～+1で出力される。


![AlphaGo_ValueNet.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/ccfaac69-0d37-9d51-8189-65ff8ac0a700.png)


###3.1.3. AlphaGo学習

AlphaGoの学習は次のステップ

1. 教師あり学習で、RolloutPolicyと、PolicyNet学習
1. 強化学習でPolicyNet学習
1. 強化学習でValueNet学習

最初のステップは、いきなり強化学習ではうまくいかないので、一回教師ありで学習をするという工夫である。

###3.1.4. RolloutPolicy学習

PolicyNet学習は、畳み込みのため、かなり時間がかかる。そこで、RolloutPolicy学習が出てきた。
これは、NNではなく、線形関数であり、PolicyNet学習の1000倍の速度で学習が出来る。
具体的には、過去の現実の囲碁の棋譜データを模倣するように学習する。

###3.1.5. モンテカルロ木探索

価値関数（ValueNet）を学習するさいには、モンテカルロ木探索が使われる。



##3.2. AlphaGo Zero

AlphaGo　Zeroは、Leeとは違って、強化学習のみで学習を行うのを特徴としている。

また、Leeでは、入力に48チャンネルがあった。この内容は人間が決めていた。こういう特徴データを人間が決めているのをヒューリスティックという。
Zeroでは、これを止め、石の配置だけを入力にした。

そして、入力に対して、２つの出力（Policy, Value）に途中で分岐するのが特徴的である。

![AlphaGoZero.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/969a7e11-2119-1f42-20a6-2c0142418c62.png)


###3.2.1. Residual Block

Residual Blockは、畳み込み層が数十層超える。しかしその中で、一部ショートカットするネットワークがある。これは、いろんなネットワーク構造を内部に持っていることになり、アンサンブル効果を発生する。
これにより、勾配消失問題、勾配爆発問題を回避することが出来る。