ラビットチャレンジレポート(深層学習 day4)

#はじめに
本記事は、E資格取得講座のラビットチャレンジのレポートです。今回は深層学習 day4の講義を受けてのレポートを提出します。

#Section1:強化学習
##要点
強化学習とは、長期的に報酬を最大化できるように環境のなかで行動を選択できるエージェントを作ることを目標とする機械学習の一分野である。行動の結果として与えられる報酬をもとに、行動を決定する原理を改善していく。
　用語の意味として、強化学習における探索とは、未知の状態に対する報酬がどれくらいなのかを知ることである。また、利用とは、過去の探索で得た情報を使用して、報酬を最大化する方策を選択することである。この探索と利用はトレードオフの関係にある。すなわち、探索に重点を置くと、過去の情報を使用した利用が軽視され、利用に重点を置くと、未知の状態に対する報酬の情報を新たに知ることができない。このようなトレードオフが存在することを踏まえて方策を決定することが強化学習の目的である。

##ハンズオン
[ハンズオン結果](https://github.com/StoneRIeverKS/rabbit_challenge/blob/master/%E5%BC%B7%E5%8C%96%E5%AD%A6%E7%BF%92.ipynb)

#Section2:AlphaGo
##要点
AlphaGoとは、Google傘下のDeepMindが開発した囲碁AIである。AlphaGoの学習は、

1. 教師あり学習によるRollOutPolicyとPolicyNetの学習
1. 強化学習によるPolicyNetの学習
1. 強化学習によるValueNetの学習

の3ステップで学習される。
1ステップ目のPolicyNetの教師あり学習は、3000万局面分の教師を用意し、教師と同じ着手を予測できるように学習した。2ステップ目のPolicyNetの強化学習は、1ステップ目で作成したPolicyNetとPolicyPoolからランダムに選択されたPolicyNetを対局させることで強化学習を行った。3ステップ目では、教師あり学習で作成したPolicyNetと強化学習で作成したPolicyNet間で対局させ、強化学習を行う。

#Section3:軽量化・高速技術
##要点
　深層学習の学習ステップでは、パラメータ調整のための計算コストが高い。そこで、深層学習においては、データ並列化、モデル並列化、GPUによる高速技術が使われている。
　データ並列化は、親モデルを各ワーカーに子モデルとしてコピーし、子モデルは分割したデータから学習を行う手法である。
　モデル並列化は、モデルを複数のユニットに分割し、各ユニットごとに学習を行う手法である。
 GPUは、簡単な並列処理が得意な演算ユニットで、単純な行列演算が多い深層学習はこのGPUを用いることで並列に計算することができる。
　さらに学習するモデルのパラメータを減らすなどの軽量化の工夫もなされている。
計量化技術の一つに量子化がある。量子化はパラメータの型を下位のものにすることでメモリと演算処理の削減を行うことである。(例えば、float64ではなく、float32を使うなど)


#Section4:応用モデル
##要点
　畳み込みニューラルネットワークにおける畳み込み層は、計算量が多く実行環境を作ることが難しい。MobileNetsは、Depthwise ConvolutionとPointwise Convolutionを組み合わせることで畳み込み層の計算量を削減している。
　Depthwise Convolutionとは、一般の畳み込み層がフィルタをチャネル数分だけ保持し、チャネルごとに計算するのに対し、全てのチャネルに同じフィルタを用いて計算する手法である。
　Pointwise Convolutionとは、入力マップのポイントごとに畳み込みを行うことである。Depthwise Convolutionが層間の関係性を考慮しないためPointwiseとセットで使うことで精度を担保しながら計算量を削減することを可能にした。
　


##確認テスト
-スライドタイトル「MobileNetのアーキテクチャ」のページの(い)と(う)に当てはまる式を回答せよ

(い)$H \times W \times C \times K \times K$
(う)$H \times W \times C \times M$

- (WaveNetで)提案された新しいConvolution型アーキテクチャは(あ)と呼ばれ。←(あ)を埋めよ。

(あ)：Dilated causal convolution

- (あ)を用いた際の大きな利点は、単純なConvolution layerと比べて(い)ことである。

(い)パラメータ数に対する受容野が広い。


#Section5:Transformer
##要点
　Encorder-Decorderモデルには、文長が長くなると表現力が足りなくなり、翻訳精度が下がるという課題がある。そこで、注意機構(Attention)と呼ばれる仕組みが導入された。
　Attentionとは、翻訳元の文中の各単語の隠れ状態を$h$、文脈を$c$としたときに下記式の$\alpha$を指す。
$$c = \sum_{j=1}^{T} \alpha_{j} h_j$$
　注意機構には、Source Target AttentionとSelf-Attentionの2種類がある。Source Target AttentionはQueryをTargetとし、Key、ValueをSourceとする注意機構である。一方で、Self-AttentionはQuery、Key、Value全てをSourceとするような注意機構である。Self-Attentionによって、文脈を考慮して各単語をエンコードできるようになった。

##ハンズオン
[ハンズオン結果1](https://github.com/StoneRIeverKS/rabbit_challenge/blob/master/lecture_chap1_exercise_public.ipynb)
[ハンズオン結果2](https://github.com/StoneRIeverKS/rabbit_challenge/blob/master/lecture_chap2_exercise_public.ipynb)

#Section6:物体検知・セグメンテーション
##要点
　物体検知・セグメンテーションは、大きくわけて分類、物体検知、意味領域分割、個体領域分割の4種類に分けられる。上記4つのタスクは並べた順に難易度が上がる。また、各タスクの出力は、クラスラベル、Bounding Box、クラスラベル、クラスラベルである。
　画像認識に代表的なデータセットをレポートする。
　VOC12は日常品を写した画像で、クラス数は20個である。ILSVRC17は、ImageNetのサブセットであり、クラス数は200個である。COCOは、物体位置推定に対する新たな指標を提案したデータセットでクラス数は80個である。OICOD18は、Open Images V4のサブセットでクラス数は500個である。


#参考文献・演習問題など
##強化学習
強化学習におけるベルマン方程式を算出する。
まず、時刻$t$での報酬を$r_t$とし、割引率を$\gamma$とする。将来得られる報酬は現時点では低いとみなし、$\gamma^{m-1} r_{t+m}$と割り引かれると考える。このとき、状態$s_t$でアクション$a_t$を取ったときの行動価値を
$$Q(s_t, a_t) = \sum_{m=1}^M \gamma^{m-1} t_{t+m}$$
とすると、
$$Q(s_t, a_t) = r_{t+1} + \gamma Q(s_{t+1}, a_{t+1})$$
なる。これがベルマン方程式である。

##AlphaGo
本当はAlphaGoを実装したかったが、時間的に間に合わなかった。[こちら](https://qiita.com/ryuoujisinta/items/2439b4d3eb0de50be1c2)を参考にして今度実装しようと思う。

##軽量化・高速技術
分散処理フレームワークの一つにSparkがある。Sparkは様々なAPIで提供されており、python版は私も良く使う。
Sparkでの線形回帰モデルの作り方は[拙著](https://qiita.com/StoneRIeverKS/items/66f6318475fe56c17c4f)にまとめた。

##応用モデル
パラメータ数が多いからMixConvが生まれたという話だったので調べてみた。
まず、定番のResNet-152を調べたところ、パラメータ数はおよそ6,000万だった。また、Google提案の画像分類モデルBiTは10億のパラメータがあるという。[参考](https://ai-scholar.tech/articles/treatise/mixconv-ai-367)

##Transformer
[深層学習界の大前提Transformerの論文解説！](https://qiita.com/omiita/items/07e69aef6c156d23c538)によれば、Transformerは様々な自然言語処理モデルの基本となっているとのこと。翻訳タスクにおいて、Seq2Seqよりも早くて精度が高い、RNN、CNNを使わずにAttentionのみを使用したEncorder-Decorderモデルで計算量も精度も改善したとのこと。

##物体検知
認定テストのInceptionモジュールの問題がわからなかったので色々調べてみた。Inceptionモジュールは、複数の大きさのフィルタを使って並列に畳み込みを行い、後でそれを結合する畳み込みニューラルネットワークである。Inceptionモジュールを導入することで、層を深くすることができなかった(層を深くすることで過学習を起こしてしまった)畳み込みニューラルネットワークの層を深くすることができた。