深層学習 - 強化学習

#深層学習
- 強化学習
- AlphaGo
- 分散深層学習
- データ並列化
- モデル並列化
- 量子化
- 蒸留
- プルーニング
- MobileNet
- DenseNet
- BatchNorm
- LayerNorm
- WaveNet
- Seq2seq
- Transformer
- 物体検知
- セグメンテーション


##強化学習
長期的に報酬を最大化できるように、環境の中で行動を選択できるエージェントを作ることを目標とする機械学習の一分野である。

###教師あり・なし学習との違い
目標が違う
→教師あり・なし学習：
データに含まれるパターンを見つけ出し、そのデータから予測することが目標
→強化学習：
優れた方策を見つけることが目標

###歴史
冬の時代があったが、計算速度の進展と関数近似法・Q学習を組み合わせる手法の登場により強化学習の飛躍につながった。計算速度の進展により大規模な状態を持つ場合の強化学習を可能としつつある。
<b>Q学習</b>
行動価値観数を行動する毎に更新することにより学習を進める方法
<b>関数近似法</b>
価値観数や方策関数を関数近似する手法のこと

###探索と利用のトレードオフ関係
過去のデータでベストとされる行動のみを取り続けていれば、他にもっとベストな行動を見つけることはできない。
→探索が足りない状態

未知の行動のみを常に撮り続けていれば過去の経験が生かせない。
→利用が足りない状態

数学的記述
方策：方策関数
価値：行動価値観数、状態価値観数

###価値観数
状態価値観数→ある状態の価値に注目する場合
行動価値観数→状態と価値を組み合わせた価値に注目する場合
Vπ（s）：状態関数
Qπ(s,a):状態＋行動関数
→やり続けたら最終的にどうなるか

###方策関数
方策ベースの強化学習においてある状態でどのような行動を取るのか確率を与える関数のこと。
→π（s）=a
π(s,a)：VやQをもとにどういう行動を取るのか→その瞬間の行動をどうするか

###方策勾配法
方策をあるパラメータで表される関数とし、そのパラメータを学習することで直接方策を学習していくアプローチである。

```math 
θ^{t+1} = θ^{(t)} + ξΔJ(θ)\\

ξ_θΔJ(θ) = E_{πθ}[(Δ_θlogπ_θ(a|s)Q^π(s,a))]
```

##Alpha Go
###Alpha Go Lee
####学習ステップ
１　教師あり学習によるRollOutPolicyとPolicyNetの学習
２　強化学習によるPolicyNetの学習
３　強化学習によるValueNetの学習
ValueNet(価値観数)とPolicyNet(方策関数)からなる。

#####RollOutPolicy
NNではなく線形の方策関数である。探索中に高速に着手確率を出すために使用される。
<b>出力は、１９×１９マスの着手予想確率</b>
メリットとしては、学習速度の速さにある。

#####PolicyNet
Kas Go Server（ネット囲碁対局サイト）の棋譜データから3000万局面分の教師を用意し、教師と同じ着手を予測できるよう学習を行った。
具体的には、教師が着手した手を１とし、残りを０とした１９×１９次元の配列を教師とし、それを分類問題として学習した。→この学習で作成したPolicyNetの精度は５７％ほど。
<b>出力は、１９×１９マスの着手予想確率</b>
#####PolicyNetの強化学習
現状のPolicyNetとPolicyPoolからランダムに選択されたPolicyNetと対局シミュレーションを行い、その結果を用いて方策勾配法で学習を行った。
PolicyPoolとは、PolicyNetの強化学習の過程を500Iterationごとに記憶し保存しておいたものである。PolicyNet同士ではなくPolicyPoolに保存されているものから対局を使用する理由は、対極に幅を持たせて過学習を防ぐためである。
→PolicyNetの強化学習をMiniBatchSize128で1万回行い、その結果の勝敗を教師として学習した。
<b>出力は１９×１９マスの着手予想確率</b>

#####ValueNetの強化学習
教師あり学習で作成したPolicyNetでN手まで打つ。
→N＋１手目の手をランダムで選択し、その手で進めた局面をS（N+1）とする。
→S（N+1）から強化学習で作成したPolicyNetで終局までうち、その勝敗報酬をRとする。
→PolicyNetを使用して、対局シミュレーションを行い、その結果の勝敗を教師として学習した。
→S（N+1）とRを教師データ対とし、損失関数を平均二乗誤差とし、回帰問題として学習を行った。
→この学習をMiniBatchSize36で5000万回行った。
<b>出力は現局面の勝率を-1~1で表したもの</b>

###AlphaGo Zero
####AlphaGo Leeとの違い
- 教師あり学習を使わず、強化学習飲みで作成
- 特徴入力からヒューリスティック（先入観や経験に基づく思考）な要素を排除し、石の配置のみにした
- PolicyNetとValueNetを一つのネットワークにした
- ResidualNetを導入
- モンテカルロ木探索からRollOutシミュレーションをなくした

####PolicyValueNet
![IMG-5839.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/4fb77fe8-bd53-b920-1084-4ede44280e69.jpeg)


#####工夫点
######WideResNet
convolutionのFilter数をk倍にしたResNet。
1倍→k倍×ブロック　　→　　2倍→k倍×yブロック
と段階的に幅を増やしていくのが一般的。
Filter数を増やすことにより、浅い層で深い層数のものと同等以上の精度となり、またGPUをより効率的に使用できるため学習が速い。
######PyramidNet
WideResNetで幅が広がった直後の層に過度の負担がかかり精度を落とす原因となっているとして、段階的にではなく各層でFilter数を増やしていくResNet。

#####ResidualNet
ネットワークにショートカット構造を追加して、勾配の爆発・消失を抑える効果を狙ったもの。
構造としては、
convolution→BatchNorm→ReLU→convolution→BatchNorm→Add→ReLU
上のBlockを１単位にして積み重ねる形となる。
・１００層を超えるネットワークでの安定した学習が可能
・ResidualNetworkを使うことにより、層数の違うNetworkのアンサンブル効果が得られる

#####工夫点
######Bottleneck
1×１kernelのconvolutionを利用し、１層目で次元削減を行なって３層目で次元を復元する３層構造にする。2層のものと比べて計算量はほぼ同じだが１層増やせるメリットがあるとしたもの。
######PreActivation
ResidualBlockの並びを,
convolution→BatchNorm→ReLU→convolution→BatchNorm→Add→ReLU
とすることにより性能が向上したとされるもの。

##分散深層学習
深層学習は多くのデータを使用したり、パラメータ調整のために多くの時間を使用したりするため、高速な計算が求められる。→CPUの数を増やし、同時並行で学習させる（分散学習）

→複数の計算資源を使用し、並列的にニューラルネットワークを構成することで効率の良い学習を行いたいので、データ並列化、モデル並列化、GPUによる高速技術が必要である。

##データ並列化
親モデルを各ワーカーに子モデルとしてコピー→データを分割して各ワーカーごとに計算させる。
データ並列化は各モデルのパラメータの合わせ方で同期型か非同期型か決まる。
###同期型
各ワーカーが計算を終わるのを待ち、全ワーカーの勾配が出たところで勾配の平均を計算し、親モデルのパラメータを更新する。
###非同期型
各ワーカーはお互いの計算を待たず、各子モデルごとに更新を行う。学習が終わった子モデルはパラメータサーバーにpushされる。新たに学習を始めるときは、パラメータサーバーからpopしたモデルに対して学習していく。
###同期型と非同期型の比較
処理スピード→お互いのワーカーの計算を待たない非同期型の方が速い
精度→非同期型は最新のパラメータを利用できないので学習が不安定になりやすい。そのため、現在は同期型の方が精度が良いことが多いので主流となっている。

##モデル並列化
親モデルを各ワーカーに分割し、それぞれのモデルを学習させる。全てのデータで学習が終わった後で一つのモデルに復元。効果としては、モデルのパラメータ数が多いほどスピードアップの効率も向上。モデルの容量が大きいほど分割した時の効果が期待できる。
モデルが大きいときはモデル並列化を、データが大きいときはデータ並列化をすると良い。

##量子化（Quantization）
ネットワークが大きくなると大量のパラメータが必要になり、学習や推論に多くのメモリと演算処理が必要。→通常のパラメータの６４bit浮動小数点を32bitなど下位の精度に落とすことでメモリと演算処理の削減を行う。
利点は計算の高速化や省メモリ化、欠点は精度の低下である。
###省メモリ化
ニューロンの重みを浮動小数点のbit数をなくし、有効桁数を下げることでニューロンのメモリサイズを小さくすることができ、多くのメモリを消費するモデルのメモリ使用量を抑えることができる。
###計算の高速化
倍精度演算（64bit）と単精度演算(32bit)は、演算性能が大きく違うため、量子化により精度を落とすことによりより多くの計算ができる。
###精度の低下
ニューロンが表現できる有効桁数が小さくなるとモデルの表現力が低下する。ただし、実際の問題では倍精度を単精度にしても精度はほぼ変わらない。
###極端な量子化
注意点として、量子化する際は極端に精度が落ちない程度に量子化をしなければならない。そうしないと誤差の大きな式になってしまう可能性がある。

##蒸留
規模の大きなモデルの知識を使い、軽量なモデルの作成を行うこと。
→精度の高いモデルは、ニューロンの規模が大きなモデルになっている。そのため推論に多くのメモリと演算処理が必要になる。だから蒸留を行ってモデルを軽量化する。
利点は、通常の学習よりも少ない学習回数でより精度の良いモデルを作成することができる。
###モデルの簡約化
学習済みの精度の高いモデルの知識を軽量なモデルへ継承させる。知識の継承により、軽量でありながら複雑なモデルに匹敵する精度のモデルを得ることが期待できる。
#####教師モデル
予測精度の高い複雑なモデルやアンサンブルされたモデル
#####生徒モデル
教師モデルをもとに作られる軽量なモデル

教師モデルの重みを固定し、生徒モデルの重みを更新していく。誤差は、教師モデルと生徒モデルのそれぞれの誤差を使い重みを更新していく。

##プルーニング
ネットワークが大きくなると、大量のパラメータになるが、全てのニューロンの計算が精度に寄与しているわけではない。→モデルの精度に寄与が少ないニューロンを削減することでモデルの軽量化・高速化が見込まれる。
寄与の少ないニューロンの削減を行いモデルの圧縮を行うことで、計算を高速化する。
しかし、重みの閾値を高くするとニューロンは削減できるが精度も落ちる。

##MobileNet(画像認識)
ディープラーニングモデルは精度は良いが、その分ネットワークが深くなり計算量が増える。多くの計算リソースが必要でお金がかかってしまう。そこで、ディープラーニングモデルの軽量化・高速化・高精度化を実現したMobileNetの誕生である。
MobileNetはDepth-wise ConvolutionとPoint-wise Convolutionの組み合わせで計算量の削減を実現した。通常の畳み込みが空間方向とチャネル方向の計算を同時に行うのに対して、Depth-wise Separable ConvolutionではそれらをDepth-wise ConvolutionとPoint-wise Convolutionと呼ばれる演算によって個別に行う。

##DenseNet
畳み込みNNアーキテクチャの一種。
ニューラルネットワークの問題点として層が深くなるにつれて学習が難しくなるといった点が指摘されている。そこで、CNNアーキテクチャの一種であるDense Netを用いてこの問題を対処することができる。

###Dense Block
DenseNetでは、Dense BlockとTransition Layer呼ばれるモジュール・層を用いる。
Dense Blockは簡単にいうと、出力層に前の層の入力を足し合わせていくだけである。特徴マップの入力に対し、Batch正規化→ReLU→畳み込みと処理して出力を計算する。そして、一つ前の出力に対して入力特徴マップを足し合わせる。入力特徴マップのチャネル数がl×Kだったら出力は(l+1)×Kである。
####K（成長率＝growth rate）
Dense Block内の各ブロック毎にk個ずつ特徴マップのチャネル数が増加していく時、Kを成長率と呼ぶ。
Kが大きくなるほどネットワークが大きくなるため、小さな整数に設定すると良い。
###Transition Layer
Transition Layerは、Convolution->Pollingからなる。Dense Blockをつなぐ役割を持っている。
また、Pollingでは特徴マップのサイズを削減している。

##Batch Norm
レイヤー間を流れるデータの分布をミニバッチ単位で平均が０、分散が１になるように正規化する。
つまり、ミニバッチに含まれるSampleの同一チャネルが同一分布に従うよう正規化する。
具体的には、H×W×CのSampleがN個あった場合にN個のチャネルが正規化の単位となる。RGBの３チャネルのSampleがN個の場合はそれぞれのチャネルの平均と分散を求め正規化を実施。チャネルごとに正規化された特徴マップを出力する。Batch Normではチャネルごとに正規化というのがポイントである。

Batch Normはニューラルネットワークにおいて学習時間の短縮、初期値への依存低減、過学習の抑制などの効果がある。
問題点としては、Batch Sizeが小さい条件下では、学習が収束しないことがあり代わりにLayer Normalizationなどの正規化手法が使われることが多い。

##Layer Norm
それぞれのSampleの全てのPixelsが同一分布に従うよう正規化する。
N個のSampleのうち1つに注目する。H×W×Cの全てのPixelが正規化の単位である。
RGBの３チャネルのSampleがN個の場合は、あるSampleを取り出し全てのチャネルの平均と分散を求め正規化を実施する。特徴マップごとに正規化された特徴マップを出力する。

Layer　Normは、入力データや重み行列に対して、以下の操作を施しても出力が変わらないことが知られている。

- 入力データのスケールに関してロバスト
- 重み行列のスケールやシフトに関してロバスト
ロバストとは外からの影響によって変化することを阻止する内的な仕組みのことである。頑丈性ともいうことができる。

##Wavenet
生の音声波形を生成する深層学習モデル。高解像度の画像を精密に生成できる手法であるPixel CNNを音声に応用したものとなっている。
深層学習を用いて結合確率を学習する際に効率的に学習が行えるアーキテクチャを提案したことがWavenetの大きな貢献の一つである。ここでいう効率的に学習が行えるアーキテクチャはDilated Casual Convolutionと呼ばれる。このモデルを使う利点としては、単純なConvolution layerと比べてパラメータ数に対する受容野が広いといったものがある。

##Seq2seq
Seq2seqはEncoder-Decoderモデルである。下のような形で2つのパートに分かれている。
![スクリーンショット 2021-01-04 16.52.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/2a0e496e-eaae-d175-018c-0f263e6c7552.png)
これは、RNNと言語モデルで形成されている。
###RNN
RNNとは系列データを読み込むために再帰的に動作するNNである。再起処理は時間軸方向に展開できるため、前の時刻の出力を現在の時刻の入力にし、系列情報を取り入れて内部状態に変換できる。
###言語モデル
単語の並びに対して尤度を与える。すなわち、文章として自然かを確率で評価する。時刻tー１までの情報で、時刻tの事後確率を求めることで同時確率を計算することができる。
###RNN×言語モデル
各地点で次にどの単語がくれば自然（事後確率最大）かを出力できる。言語モデルを再現するようにRNNの重みが学習されていれば、ある時点の次の単語を予測することができる。つまり、先頭単語を与えれば文章を生成することも可能となる。
###Teacher Forcing
RNNでは、時刻tの出力を時刻t＋１の入力とすることができるが、この方法でDecoderを学習させると連鎖的に誤差が大きくなっていき、学習が不安定になったり収束が遅くなったりする問題が発生する。
そこで、Teacher Forcingという訓練時にはDecoder側の入力にターゲット系列をそのまま使うという手法を用いる。メリットとしては、学習が安定し収束が早くなるというものがある一方で、評価時は前の時刻にDecoderが生成したものが使われるため学習時と分布が異なってしまうというデメリットを持つ。
Teacher Forcingの拡張として、ターゲット系列を入力とするか生成された結果を入力とするかを確率的にサンプリングするScheduled Samplingという手法がある。
Schedule Samplingに関しては、[Scheduled samplingによるニューラル言語モデルの学習](https://tma15.github.io/blog/2020/07/19/%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86scheduled-sampling%E3%81%AB%E3%82%88%E3%82%8B%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E8%A8%80%E8%AA%9E%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E5%AD%A6%E7%BF%92/)を参考にしてみてください。

##Transformer
Transformerは、再帰も畳み込みも一切使わない、Attentionのみを用いたモデルである。
翻訳システムにおいて、RNNでは計算量が多いため、文章の依存関係を掴むための逐次的な計算を減らすCNNを使用していた。しかし、CNNの課題として文が長くなるほど、長文依存関係が掴めないというものが起きた。そこで、計算量を文章の長さに応じず、定数時間に抑えるAttentionが採用された。
####モデル構造
大枠は、Encoder-Decoderモデルでself-Attention層とPosition-wise全結合層を使用している。
![スクリーンショット 2020-12-31 12.12.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/1a7b1d7c-84fa-0d5d-33c9-d55328ea4bb4.png)
出典：「Attention is all you need」

Transformerについて上の図を分解して説明していく。

###Positional Encodeing(位置エンコード)
単語の位置関係を捉えることのできる再帰や畳み込みを使っていないため、このままだとTransformerにとって単語の順番は関係なくなってしまっている。
→Positional Encodingという考え方の登場
一番最初にこのモデルに単語の分散表現を入力するときに単語位置に一意の値を各分散表現に加算する。
単語に一意の値を加算する関数は、Sin関数・Cos関数を用いる。

Transformerは、単語の位置に一意の値を与えてくれる。Sin関数とCos関数のパターンもしっかりと学習してくれるため、結果として位置の依存関係を学んでくれているという算段になっている。

###Multi-Head Attention
各単語に対して、１組のQuery,Key,Valueを持たせるのではなく、比較的小さいQuery,Key,Valueをヘッドの数分作り、それぞれのヘッドで潜在表現を計算する。
最終的にそれらを一つのベクトルに落とすことによって獲得された潜在表現をその単語の潜在表現とする。

ヘッドを複数個用意することで、それぞれが異なる潜在表現の空間から有益な情報を持ってきてくれる。

###Layer Normalization(Add&Norm)
ミニバッチ全体に及んで正規化するのではなく、各データ（文章）それぞれで正規化する。

###Feed Forward(Position Wise全結合層)
単語の位置ごとに独立処理する全結合。
Position-Wiseとは、各単語ごとに独立してニューラルネットワークがあるということ。

##物体検知
物体検知は一言で言うと、画像内の物体を検知する技術のことである。画像を入力した時に画像のどこに何が写っているのかのバウンディングボックスをつけて出力する技術である。
###物体検知のフレームワーク
物体検知のフレームワークは多数存在するが、大きく分けると１段階検出器と２段階検出器に分類することができる。
####1段階検出器

- 候補領域の検出とクラス推定を同時に行う
- 相対的に精度が低い傾向
- 相対的に計算量が小さく、推論も早い傾向

####2段階検出器

- 候補領域の検出とクラス推定を別々に行う
- 相対的に精度が高い傾向
- 相対的に計算量が大きく、推論も遅い傾向

##セグメンテーション
画像内の全画素にラベルやカテゴリを関連づけるディープラーニングのアルゴリズムである。特徴的なカテゴリを形成する画素の集まりを認識するために使用される。セグメンテーションでは、Convolution+Pollingによって解像度が落ちてしまうのでUp-Samplingによって元の画像と同じ解像度を出力することを目指す。
###Up-Sampling
解像度を大きくする手法として、Deconvolution/Transposed Convolutionを紹介する。
####Deconvolution/Transposed Convolution
処理手順は、
１　特徴マップのPixel間隔をStrideだけ空ける
２　特徴マップの周りに（Kernel size - 1）- Paddingだけ余白を作る。
３　畳み込み演算を行う