強化学習、DCGAN、Kaggle

※以下、個人的な勉強のためのレポートです。
※間違い多々あると存じますが、現在の理解レベルのスナップショットのようなものです。
※勉強のためWebサイトや書籍からとても参考になったものを引用させていただいております。
http://ai999.careers/rabbit/

#強化学習(Reinforcement Learning)
http://blog.brainpad.co.jp/entry/2017/02/24/121500

##機械学習の分類
- 教師あり学習：Supervised Learning
    - 入力と出力の関係」を学習する。「分類」や「予測」と呼ばれるような問題は、教師付き学習のクラスとなる。ex)今日の天気から明日の天気を予測するような問題。この場合、入力が今日の天気、出力が明日の天気となります。
- 教師なし学習：Unsupervised Learning
    - 「データの構造」を学習する。「教師なし」という名の通り、正解となる出力が学習の際に与えられないことが特徴。「クラスタリング」や「次元削減」と呼ばれるような問題は教師なし学習のクラスとなる。購買情報を元にユーザを数種類のグループに分けるような問題が教師なし学習にあたりる。この場合、入力は購買情報、出力はグループであり、その出力されたグループには正解がもともとあるわけではなく、単に「似ているユーザ」をグループ分けした結果である。
- 強化学習：Reinforcement Learning
    - 試行錯誤を通じて「価値を最大化するような行動」を学習する。教師付き学習とよく似た問題設定であるが、与えられた正解の出力をそのまま学習すれば良いわけではなく、もっと広い意味での「価値」を最大化する行動を学習しなければならない。例えば、株の売買により利益を得る問題が強化学習にあたる。
⇒強化学習と、「教師あり学習」「教師なし学習」では、目標が異なる。
- 「教師あり学習」「教師なし学習」の目的
    - パターンの発見と、予測が目標
- 強化学習
    - 優れた方先の発見が目標

##強化学習の考えかた
強化学習では、与えられた「環境」における価値（あるいは「利益」と呼びます）を最大化するように「エージェント」を学習させる。あるゲームが環境で、そのプレイヤーがエージェント。

###強化学習の用語
- 状態 s∈S とは、環境が今どうなっているのかをあらわすもの。株の売買の例では、各株式の今の値段や、持っている株式の数が状態にあたる。
- 行動 a∈A とは、エージェントが環境に対してどのような行動を起こすことができるのかをあらわす。株の売買の例では、株の売り買いの判断やその量にあたる。
- 報酬 r∈R とは、ある状態においてエージェントが行動を起こした結果、どれくらいの報酬が得られるのかをあらわす。株の売買の例では、売買の結果の儲けにあたる。コストなどは負の報酬となる。
    - 強化学習ではその時点で貰える報酬（即時報酬などと呼ぶ）ではなく、（将来に渡る）価値を最大化す。よって、単に即時報酬が多くもらえる近視眼的な行動ではなく、より未来を考えた**長期的**価値を最大化する行動を取らなければならない。

**確認テスト**
強化学習の応用例
"植物工場の栽培システム"
- 環境(状態)：植物の生育段階、市場価格、供給量
- 行動：日照時間、肥料、水耕栽培溶液の養分濃度の調整
- 報酬：市場販売した場合の利益

###探索と利用のトレードオフ
環境についてすべてを網羅した知識があれば、最適な行動を予測・実行し、報酬を最大化すること可能。しかし、強化学習の場合、既知であるという前提には立たない。よって、不完全な知識をもとに行動しながら、データを収集し最適な行動を見つけていくことが強化学習でいう、学習にあたる。
〇過去の情報のみから行動をとる←もっと良い行動があるかもしれない
〇新しい行動のみを行う←過去の経験が活かされない
⇒この調整をする必要がある

##強化学習のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/bd314f30-9245-9e49-670c-3f39a2d806f9.png)
- エージェントがある方策を実施して行動を実施すると状態sに遷移する
- それを観測する
- その状態sにほける報酬価値を受け取る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/1fc1c521-fa15-ebd6-d76f-20313cf1fe87.png)
- 方策：方策関数n(s,a)
- 行動、価値：行動価値関数Q(s,a)

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

##方策関数
方策ベースの強化学習手法において、「ある状態でどのような行動を探るのか」という確率を与える関数
ex)状態Aのとき、行動Xをとる確率は××%

##方策勾配法
方策を再帰的に更新していくモデル

```math
θ^{t+1} = θ^t + ε∇J(θ)
```
⇒ニューラルネットワークの考え方に同じく、t+1回目において、t回目のと学習率εで定義した方策の加算で次の値を構成していく

Jは方策の「良さ」を表すものなで、定義しなければならない。
定義方法として、「平均報酬」「割引報酬和」がある。この定義に従って、行動価値関数Qの定義を行うと、方策勾配定理が成り立つ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/4fdf5e0f-b893-9feb-df9f-73ee5e493708.png)


###価値の最大化
ある状態 s においてある行動 a を取った時の価値」がわかれば、その価値の一番高い行動を選択すればよい。この価値のことを Q値 あるいは状態行動価値と呼び、 Q(s,a) と書く。Q値は「報酬」ではなく「価値」であることに注意。つまり、Q値とは短期的な報酬ではなく、長期的な意味での価値を値として持っている関数。

「その行動によって、価値の高い状態に遷移できるような行動」は、遷移先と同じくらいの価値を持っているとみなすのが自然である。「価値の低い状態に遷移するような行動の価値は低い」ことも言える。つまり、現時点 t におけるQ値は一つ先の時点 t+1 のQ値によって記述することができる。

```math
Q(st,at)=Est+1(rt+1+γEat+1(Q(st+1,at+1)))
```

下付きの t は時点 t における状態や行動であることを表す。
rt+1 は得られた即時報酬で、外側の期待値が st+1 に関するもの、内側の期待値が at+1 に関するもの。γ は割引率と呼ばれ、将来の価値をどれだけ割り引いて考えるかのパラメータ。

##強化学習のアルゴリズム
- Q学習：Q 学習では、前述した式の期待値の中身 $$rt+1+γEat+1(Q(st+1,at+1)) $$を $$rt+1+γmaxat+1Q(st+1,at+1)$$と置き換えることで、次のように Q値を更新していく。
$$Q(st,at)←(1−α)Q(st,at)+α(rt+1+γmaxat+1Q(st+1,at+1))$$
α は学習率と呼ばれるパラメータ（0以上1以下）で、Q値の更新をどれだけ急激におこなうかを制御する。第一項が現在のQ値、第二項が新しいQ値にあたり、その二項が 1−α と α で足し合わされているので、現在のQ値を第二項にむかって α ぶんだけ近づける更新をしていく。式の内側の期待値はmax により置き換えられている。式の内側の期待値は、次の状態がどれくらいの価値を持つかを見積もっているわけである、その価値の見積もりを（現在推定されている値の）最大値にしてしまおう、という発想である。エージェントは自由に行動を選ぶことができるので、現在推定されている価値の最大値をもって価値の見積もりとするアルゴリズムであり、実際、Q学習はうまくいくことが多いことが昔から知られている。式は実装や見た目の都合上、少し展開して次の形式でよく登場する。$$Q(st,at)←Q(st,at)+α(rt+1+γmaxat+1Q(st+1,at+1)−Q(st,at))$$
- Sarsa：Sarsa もQ学習のように、式の期待値の中身$$rt+1+γEat+1(Q(st+1,at+1))$$ を $$rt+1+γQ(st+1,at+1)$$ で置き換える。Q学習では、期待値の見積もりを現在推定されている値の最大値で置き換えてきたが、Sarsa の場合、実際に行動してみたらどうなったかを使って期待値の見積もりを置き換える。よって、Sarsa では現在の価値を更新するためには、エージェントが実際にもう一度行動をおこなう必要がある。式で書くと、$$Q(st,at)←Q(st,at)+α(rt+1+γQ(st+1,at+1)−Q(st,at))$$
- モンテカルロ法：モンテカルロ法はQ学習やSarsaとは違い、Q値の更新のときに「次の時点のQ値」を用いない。代わりに、とにかく何らかの報酬が得られるまで行動をしてみて、その報酬値を知ってから、辿ってきた状態と行動に対してその報酬を分配していく。得られた報酬を r と書くことにすれば、モンテカルロ法でのQ値の更新式は次のとおり。$$Returns(s,a)←append(Returns(s,a),r)(5)
Q(s,a)←average(Returns(s,a))$$
ただし、Returns(s,a) は状態 s, 行動 a を経ることでこれまでに得られた報酬を格納している配列、append は配列に要素を付け足す操作、average は配列の平均をとる操作とする。辿ってきた行動と状態のペアに対してこの更新式に従いQ値を更新していく。モンテカルロ法では報酬が得られて初めてQ値を更新することができる。逆に言えば、報酬が得られるまでQ値を更新することができない。
このことは、Q値が「ある時点でとった行動による即時報酬だけでなく、未来に渡る価値も含む」ことを考えれば当然である。一方Q学習やSarsaは、「現在推定中のQ値でも、未来に渡る価値を含むはずだ」という前提で、次の時点でのQ値を使って常に更新をおこなっている。Q学習やSarsaでは、式の特性をうまく活かしているという見方もできるが、その方法だと、遠い未来で得られる報酬の学習は遅くなる。モンテカルロ法は一度未来を見てから一気にQ値の更新をかけるため、遠い未来の報酬も比較的早く学習できるという特徴がある。

##強化学習の既知問題
Q値に基づくアルゴリズムには、状態行動空間の爆発、と呼ばれる課題が存在する。規模の小さな環境では問題にならないが、状態や行動が連続値で定義され、その次元も非常に大きいような環境だと、状態と行動の組に対して定義されるQ値を保存するための領域が無限に必要となる。AlphaGoで使われているDeep Q-Network（DQN）では、この状態行動空間の爆発に対して、「Q値を直接表現するのではなく、ニューラルネットワークにより近似」することで対処している。Q値をニューラルネットワークで近似する、というアイデア自体はかなり前からあったものであるが、これまで実問題ではあまりうまくいってなかった。AlphaGoは、囲碁という巨大な環境であっても深層学習技術を応用して学習に成功させたことで、深層学習と強化学習の融合の可能性を大きく世に示した。


**JDLA例題**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/f4d33637-86c3-7c5b-0e8b-7799970b4bd1.png)

(答え)a
方策勾配定理の式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/71ae0a89-3d74-9707-883a-04f651d6a873.png)
⇒ポイント：対数微分法

#DCGAN：Deep Convolutional Generative Adversarial Networks
https://qiita.com/taku-buntu/items/0093a68bfae0b0ff879d
生成系のDNNの一例とてして、DCGANの論文を考察。他のGANのNNと比べても、性能がよいとされている。

##GAN(敵対的生成ネットワーク[GAN:Generative Adversarial Network])
GANはGeneratorとDiscriminatorという別々の学習・生成モデルを用いる。生成モデルとは、教師データを学習することで、それらのデータと似たような新しいデータを生成するモデルのことである。つまり、生成モデルは、人工的なデータを作り出すことができる。データを入れたらクラスを分類してくれるだけでなく、あるクラスに属する擬似的なデータそのものを作ることができるということである。GANはこの生成モデルの一種。

このGenerator(生成機)とDiscriminator(識別機)の関係は、しばしば紙幣の偽装者(Generator)と、その紙幣が偽装紙幣であるかを見抜く警察(Discriminator)の関係で表される。偽装者はできるだけ本物の紙幣に近い偽装紙幣を作り出すことで、警察の目を騙そうとします。逆に、警察も鑑定技術を上げてより本物の紙幣か偽物の紙幣かを見抜こうとします。GANではGeneratorはできるだけ本物（オリジナル）に近い画像を生成し、Discriminatorはそれが本物の画像か否かを判定するような構造をしている。

この関係は、イタチごっこの関係にあり、より精度の高い敵と競い合うことでスキルを高めていきます。GANでは、偽装者(Generator)の方に関心があり、より本物に近い画像などを生成することを目標としています。Generative Adversarial Nets(GAN)が敵対生成ネットワークという呼び名になっているのも、この競い合いのことを言っています。

##DCGAN：Deep Convolutional Generative Adversarial Networks
GANに対して畳み込みニューラルネットワーク(CNN)を適用し、かつネットワークを深くした手法。DCGANの登場によってより写真と見分けがつかない画像を生成することが可能となり、注目を集めた。
CGANの特徴は、
- 隠れ層に全結合を用いず、畳込みとする
    - えば3×3の領域から最大値や平均値を求め1つの値を生成する処理。これによりプーリング前のデータと比較して、プーリングはサイズの小さいデータが得られる。
- プーリングの代わりにストライドの畳み込みを用いる。
    - ストライドは、3×3の領域をスライドさせていく処理です。2画素飛ばしで処理することで、この処理でもサイズの小さいデータを得ることができる。
- バッチ正規化をすべての層に対して行う。
    - バッチ正則化では、各層の入力は常に平均が0、分散が1となるようにデータを変換します。これにより学習がより容易に進むようになると言われている。

- Generatorの活性化関数は出力層はtanh、それ以外はReLuを用いる。
- Discriminatorのすべての層の活性関数にLeakyReLuを用いる。

DCGANでは、多層の畳み込み層(Deep Convolutional Network)を用い、かつ上手く学習が進むように工夫することで、良い結果が得られることに成功した。

潜在空間でベクトルとして表現したものからGenaratorが画像を生成。画像の処理を数式的に扱うこともできる。
ex)
$$女性の笑顔 - 女性の通常時の顔 = 笑顔の要素$$
$$男性の通常時の顔 + 笑顔の要素 = 男性の笑顔$$

Gneratorは正規分布を使用したパラメータを使用し画像を生成
⇒DiscriminatorはGneratorが作った画像を正確に判定できるよう重みを更新していく
⇒GneratorはDiscriminatorに生成画像と判定されないような画像を生成するよう重みを更新してい※入手可能な実装もたくさんあるらしい

#Kaggle
- データ分析のコンペティション。データ分析やAIの世界一決定戦。Googleが開催。登録者200万人、応募者10万人。日本人の優勝者もいる。
- 有名なデータセットや、初心者向けコンテンツなども充実している。
- "kernels"では世界中の研究者の実装が閲覧できる
- 制限はあるが、計算機環境もある。