描き方を学ぶ敵対的強化学習モデルSPIRAL

# 目的
強化学習を構造最適化に利用してみたいと考えている．この時，構造最適化において，構造は直線の組み合わせで出来上がっていることに気づいた．
よって，強化学習において直線を用いて画像を表現する手法がないかと調べたとき，こちらの論文[SPIRAL](https://arxiv.org/pdf/1804.01118.pdf)を発見した．
これを読んでみたので，その内容を忘れないうちにまとめておく．
また，こういったまとめは初めてなので，なにかありましたらご容赦，もしくはご意見お願いします．

# 論文紹介・画像引用・GIF引用
- [Synthesizing Programs for Images using Reinforced Adversarial Learning](https://arxiv.org/abs/1804.01118)

# SPIRAL
## Abstract
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556676/8b1ee746-60ae-003d-8b96-0562dd0d03ed.png" width=75%>

SPIRALとは，**画像を参考に，それの描き方を自動で学ぶことが出来る強化学習モデル**
今まで，描き方を学習する際，**描くこと自体（レンダリング）は微分不可能な動作の為，学習に難があった．**
本研究では**その問題を強化学習モデルを利用して克服している．**
また，ここでのAgentは，**GANのように敵対学習モデルを利用し，Discriminatorを欺くことでrewardを獲得している．**
驚きなのが，$L^2$誤差を報酬とする場合と比べて，Discriminatorを用いた方が学習がうまくいっているということ． 

## Overview
SPIRALのGenerator$G$は次の図のようになっている．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556676/0c41a069-da48-4444-0018-202a7e020c67.png" width=75%>
ここでの$R$は，連続するaction$a = (a_1, a_2, a_3,...,a_N)$を引数とし，2Dや3Dのレンダリングを行うものである．
このように， Model$G$は，RNNを用いたポリシーニューラルネットワーク$\pi$と$R$より構成される．
そして$\pi$は，Discriminator$D$を欺くことで得られる報酬を基に学習する．詳しいことは目的関数およびdistributed learningに書く．

そうして最終的に学習し終えた$\pi$は，ターゲットデータ(実際に存在するデータ)の分布$p_d$を，$G$が作り上げられるように$p_d\approx R(p_a)$となる分布$p_a$を求められるようになる．また，$G$が作り上げる分布は$p_g$とする．

## Objectives
SPIRALにおける$\pi$の学習には，GeneratorとDiscriminatorの二つを基に，GAN的な学習を行わせる．
Discriminatorにおいては，WGAN(Gulrajani et al., 2017) に倣い，$D$の目的関数を以下のような式とする．$$ L_D=- E_{x \sim p_d}[D(\mathbf{x})]+E_{x \sim p_g}[D(\mathbf{x})]+\mathbb{R}$$
ここでの$\mathbb{R}$は，リップシッツ連続関数の集合内に$D$が留まるための正則化項である（詳しいことはわからん）．

Generator$G$は，$p_g$を作り上げるために微分不可能関数$R$を利用して作成しているため，従来の目的関数$$ L_G=- E_{x \sim p_g}[D(\mathbf{x})]$$を利用できない．そこで，A2C(advantage actor-critic)を利用し，$G$の大元となる$\pi$を学習させることとした．よって，目的関数は，$$ L_G=- \sum_{t} \log \pi (a_t|s_t;\theta)[R_t-V^{\pi}(s_t)]$$となる．ここでの$V^{\pi}$は価値推定関数を指し，ポリシーネットワーク$\pi$のパラメータ$\theta$からは独立している．そして，$R_t=\sum_{t}^{N}r_t$は一回の報酬推定である． なお，報酬$r_t$は次の構成でできている．つまり，**基本は最終ステップにおいてのみ報酬を与えている．**なお，今回のアルゴリズムの検証においてはN=20となっていた．

```math
r_t = \left\{
\begin{array}{ll}
0 & (t < N) \\
D(\mathbf{x})=D(R(a_1,a_2,a_3,...,a_N)) & (t=N)
\end{array}
\right.
```
## Conditional Generation
ここまでの説明は，本物らしい画像をレンダリングできる条件なしSPIRALモデルに関する説明を行っていた．
ただ，SPIRALは，目的となる画像に近い画像を生成するConditional generatorを作成することが出来るように学習を行うことが出来る．その際の目的関数はどのようになるのか．
目的の画像を$x_{target}$とすると，Discriminatorに関する目的関数は次のように表すことが出来る．
$$ L_D=D(\mathbf{x_{target}}|\mathbf{x_{target}}) +E_{x \sim p_g}[D(\mathbf{x}|\mathbf{x}_{target})]$$
ここで，L2ノルムを目的関数に入れるべきという意見もあるだろうが，結果，入れない方が精度が良い結果が出た．理由に関しては，[元論文](https://arxiv.org/pdf/1804.01118.pdf)のAppendixAに書いてある．

## Distributed Learning
学習の全体図を次の図は示している．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556676/7dab0a50-27b0-1910-af34-c6198721261e.png" width=75%>

学習には，大きく分けて3つのworkerを作成した．

Actorsは$R$と$\pi$の交互の作用を基に成り立ち，それらの描画軌道(tragectory)を学習データとして保存する．ここで，それぞれの描画軌道は，描画actionの流れ$((\pi_t,a_t)|1<=t<=N)$に加え，$R$によって生成した途中画像も含まれている．

ポリシーネットワーク学習に関しては，Actorから描画起動を受け取り，それらをバッチとして処理し，目的関数$L_G$およびSGDを用いて$\pi$を学習する．また，探索を推進するため，$L_G$にエントロピー項を導入した．

Discriminator Learnerにおいては，$p_d$（リアルな画像）からランダムに収集したデータと$p_g$(actorによって作成された画像)のデータを用いて$L_D$を基に学習を行う．
WGANにおいては，良いパフォーマンスを出すためにはDiscriminatorをGeneratorよりも更新を多くすべきだという意見があった．今回の場合，それを考慮して，$D$の学習は$G$の動きに連動したものではなく独立させ，replay bufferを用いて学習を行わせるようにしている．

## Result
### 実験データ
実験データは，二次元データで文字を扱っているMNIST(数字),OMNIGLOT（50このAlphabet）,そしてポーズや背景、照明条件に大きなバリエーションがある著名人の20万点以上のカラーヘッドショットが収録されているCELEBRAにおいて実験を行った．
また，3Dデータにおいても扱えるかどうかを見るため，MUJOCO（四角形のプラットフォームに，最大5この物体が配置されているもの）を利用した．

### 実験環境
- それぞれの実験データにおいては，本アルゴリズムの汎用性を示すため，入力サイズをそれぞれ64×64にリサイズした．
- **ステップ回数は，20回とした．**
- MNIST,OMNIGLOT,CELEBRAにおいては，$R$にはオープンソースのペイントライブラリである[libmypaint](https://github.com/mypaint/libmypaint)を利用．それぞれのaction$a_t$は8つの要素からなるベクトル$(a_t^1,a_t^2,...a_t^8)$でできている．それぞれの要素の意味は，次の図にある通りである．なお，このストロークはベジェ曲線の式で示される（$\tau$の値($\tau \in [0,1]$)はどれくらいなのかは分からない．ただ，多分固定値）．$$p(\tau)=(1-\tau^2)l_t+2(1-\tau)\tau p_c+\tau^2 l_{t+1}$$
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556676/6e657460-6472-7368-5d15-f0e204b7279b.png" width=75%>

- 最後の要素である$a_t^8$はバイナリとし，ストロークを形成するか，しないで次の$l_{t+1}$にジャンプするかを選択することができる．
- グレースケールであるMNISTとOMNIGLOTではカラー要素は排除
- MUJOCOでは，MuJoCO-based environment(Todorov et al., 2012)に基づきレンダリングを行う．各ステップごとにagentはobjectの種類(4種類)とその位置(16×16)，そしてサイズ(3種類)，色(3種類の色，それぞれ4つの値)を選ぶ．また，動きをスキップするか，直近で作成した物体を変えることができる．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556676/0c41a069-da48-4444-0018-202a7e020c67.png" width=75%>

### MNIST
- 条件なし学習と条件付き学習を展開
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556676/5f3df050-e6e0-40bf-9b88-1ac25024a145.png" width=75%>

- 一回の連続した筆の動きで一桁の数字を描くことを促すために、連続した筆の動きを開始するごとに小さな負の報酬を与えている．これを行うことにより，なるべく小さい回数で行動を行うように制御できる（早く書き終わったら，あとはスキップすれば良い）．
- 同様に，目に見えるストロークを生成しない場合（多分ストロークが被ったとか）にペナルティを与えることに効果があった．
- 条件付き学習の際，$L^2$誤差のみを報酬として適用するか，それとも$D$のみを報酬として扱うか，というものを実験した．結果，後者の**$D$のみを利用した場合の方が結果的に$L^2$スコアに関して良い結果がでた．**なぜこの方が良いのかに関しては，AppendixAの方に書いてあったが，読み取れなかった．
- また，agentをblindにした場合の実験もした．この場合，$R$を用いた途中画像をagentの入力には用いない場合を指す．結果，途中画像を入力する場合と比べて精度は落ちるものの，まあまあな結果がでた．これはつまり，途中画像を入力とすることができないモデルにおいても本アルゴリズムは十分に適用性があることを示唆している．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556676/79933dad-e81d-bf65-b1dd-0e03594fe5f0.png" width=75%>

### OMNIGLOT
- 条件なし学習と条件付き学習を展開
![スクリーンショット 2020-10-09 15.54.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556676/4aaa5d3c-c291-fbab-1147-241532a14b51.png)
- このデータは，先のタスクと比べてデータの広がりが大きく，難しいデータセットである．しかし，結果としてよく復元できていた．
- また，同じように条件付き学習においては，$D$の報酬の方が優位であった．
- 多分前回と同じ報酬設計をしている（sameと言っているから）

### CELEBRA
- 条件なし学習と条件付き学習を展開
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556676/e0738200-6400-264c-56a9-c4a5cd68313d.png" width=75%>

- 前回までのものと違い，報酬設計として途中の工程に対する負のrewardは設けていない
- 損失関数が$L^2$にしろ，$D$にしろ，色の割合を表したヒストグラムにおけるターゲット画像との誤差を損失関数に追加して実験を行っている．ただ，著者曰くこの項はそこまで重要でないとのこと（本当か？）
- 結果，同じようにconditionのものでは$D$を用いたものの方が性能がよかった．しかし，全体的にぼやけている．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556676/a3e007a4-fdb9-c92f-55c5-9daedf39be7e.png" width=75%>

### MUJOCO
- 条件付き学習のみを展開
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556676/77f0823c-6fce-de1b-fbc9-f15a1beb3e98.png" width=75%>

- 補助的報酬は入れていない
- オブジェクトの個数は最大5こだが，それをagentは知らない．
- $D$の報酬設計の方が良い値がでた．
- 今回のタスクだと，選択肢が$M=4\times 16^2\times 3\times 4^3 \times 3$のため，力任せ探索では厳しい条件である．実際に，MCMC(?)アルゴリズムでは探索ができていない状況だった．つまり，SPIRALは優秀!!


## まとめ
WGANにおけるDiscriminatorを用いた報酬設計を持って，かつA2Cを持ってすれば描画機能を深層学習モデルに学習させるのは可能！