【ラビットチャレンジ】深層学習day4

#Section1:強化学習
●強化学習とは
　・長期的に報酬を最大化できるように環境のなかで行動を選択できる
　　エージェントを作ることを目標とする機械学習の一分野。
　　→行動の結果として与らえれる利益(報酬)をもとに、
　　　行動を決定する原理を改善していく仕組み。

●強化学習の応用例
　・マーケティングの場合
　　環境：会社の販売促進部
　　エージェント：プロフィールと購入履歴に基づいて、
　　　　　　　　　キャンペーンメールを送る顧客を決めるソフトウェア
　　行動：顧客ごとに送信、非送信のふやつの行動を選ぶことになる。
　　報酬：キャンペーンのコストという負の報酬と
　　　　　キャンペーンで生み出されると推測される売り上げという正の報酬を受ける。

●探索と利用のトレードオフ
　・環境について事前に完璧な知識があれば、最適な行動を予測し、決定することは可能。
　　→どのような顧客にキャンペーンメールを送信すると、
　　　どのような行動を行うのかが既知である状況。
　　　←強化学習の場合、上記仮定は成り立たないとする。
　　　　不完全な知識をもとに行動しながらデータを収集し、最適な行動を見つけていく。
　・過去のデータでベストとされる行動のみを常に取り続ければ、
　　他にもっとベストな行動を見つけることはできない。
　　未知の行動のみを常に取り続ければ、過去の経験が活かせない。

●強化学習の差分
　・強化学習と通常の教師あり、教師なし学習との違い
　　→目標が違う
　　　教師なし、あり学習では、データに含まれるパターンを見つけ出す、
　　　および、そのデータから予測することが目標。
　　　強化学習では、優れた方策を見つけることが目標。

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

●価値関数
　・状態価値関数：ある状態の価値に注目
　・行動価値関数：状態と価値を組み合わせた価値に注目

●方策関数
　・方策ベースの強化学習手法において、
　　ある状態でどのような行動を採るのかの確率を与える関数のこと。

●方策勾配法について
　・方策反復法
　　→方策をモデル化して最適化する手法、方策勾配法。
　・Jとは？
　　→方策の良さ、定義しなければならない。

#Section2:AlphaGo
●AlphaGo Lee
　・PolicyNet
　　・方策関数、畳み込みニューラルネットワーク
　　・出力は19x19マスの着手予想確率が出力される。
　・ValueNet
　　・価値関数、畳み込みニューラルネットワーク
　　・出力は現局面の勝率を-1から1で表したものが出力される。

●AlphaGoの学習
　①教師あり学習によるRollOutPolicyとPolicyNetの学習
　②強化学習によるPolicyNetの学習
　③強化学習によるValueNetの学習

●PolicyNetの強化学習
　・PolicyPoolとは、PolicyNetの強化学習の過程を500Iteraionごとに記録し、
　　保存しておいたもの。

●RollOutPolicy
　・NNではなく線形の方策関数
　　探索中に高速に着手確率を出すために使用される。

●AlphaGo LeeとAlphaGo Zeroの違い
　①教師あり学習を一切行わず、強化学習のみで作成
　②特徴入力からヒューリスティックな要素を排除し、石の配置のみにした
　③PolicyNetとValueNetを1つのネットワークに統合した
　④Residual Netを導入した
　⑤モンテカルロ木探索からRollOutシミュレーションをなくした

●ResidualNetwork
　・ネットワークにショートカット構造を追加して、
　　勾配の爆発、消失を抑える効果を狙ったもの
　・層数の違うNetworkのアンサンブル効果が得られているという説もある。

●Residual Networkの派生系
　・PreActivation
　・PyramidNet

#Section3:軽量化・高速化技術
●分散深層学習
　・深層学習は多くのデータを使用したり、パラメータ調整のために
　　多くの時間を使用したりするため、高速な計算が求められる。
　・複数の計算資源を使用し、並列的にニューラルネットを構成することで、
　　効率の良い学習を行いたい。
　・データ並列化、モデル並列化、GPUによる高速技術は不可欠である。

●データ並列化
　・親モデルを各ワーカーに子モデルとしてコピー
　・データを分割し、各ワーカーごとに計算させる。

●データ並列化：同期型
　・データ並列化は各モデルのパラメータの合わせ方で、同期型か非同期型か決まる。
　・各ワーカーが計算が終わるのを待ち、全ワーカーの勾配が出たところで、
　　勾配の平均を計算し、親モデルのパラメータを更新する。

●データ並列化：非同期型
　・各ワーカーはお互いの計算を待たず、各子モデルごとに更新を行う。
　　学習が終わった子モデルはパラメータサーバにPushされる。
　　新たに学習を始める時は、パラメータサーバからPopしたモデルに対して学習していく。

●同期型と非同期型の比較
　・処理のスピードは、お互いのワーカーの計算を待たない非同期型の方が早い。
　・非同期型は最新のモデルのパラメータを利用できないので、学習が不安定になりやすい。
　・現在は同期型の方が精度が良いことが多いので、主流となっている。

●モデル並列化
　・親モデルを各ワーカーに分割し、それぞれのモデルを学習させる。
　　全てのデータで学習が終わった後で、一つのモデルに復元。
　・モデルが大きい時はモデル並列化を、データが大きい時はデータ並列化をすると良い。

●モデル並列
　・モデルのパラメータ数が多いほど、スピードアップの効率も向上する。

●GPUによる高速化
　・GPGPU
　　→元々の使用目的であるグラフィック以外の用途で使用されるGPUの総称
　・CPU
　　→高性能なコアが少数
　　 複雑で連続的な処理が得意
　・GPU
　　→比較的低性能なコアが多数
　　 簡単な並列処理が得意
　　 ニューラルネットの学習は単純な行列演算が多いので、高速化が可能

●GPGPU開発環境
　・CUDA
　　→GPU上で並列コンピューティングを行うためのプラットフォーム
　　→NVIDIA社が開発しているGPUのみで使用可能。
　　→Deep Learning用に提供されているので、使いやすい。
　・DeepLearningのフレームワーク内で実装されているので、
　　使用する際は指定すればよい。

●量子化とは
　・ネットワークが大きくなると大量のパラメータが必要となり
　　学習や推論に多くのメモリと演算処理が必要。
　・通常のパラメータの64bit浮動小数点を32bitなど下位の精度に落とすことで
　　メモリと演算処理の削減を行う。

●省メモリ化
　・ニューロンの重みを浮動小数点のbit数を少なくし有効桁数を下げることで
　　ニューロンのメモリサイズを小さくすることができ、
　　多くのメモリを消費するモデルのメモリ使用量を抑えることができる。

●量子化の利点と欠点
　・利点：計算の高速化、省メモリ化
　・欠点：精度の低下

●計算の高速化
　・倍精度演算と単精度演算は演算性能が大きく違うため、
　　量子化により精度を落とすことにより、より多くの計算をすることができる。

●精度の低下
　・ニューロンが表現できる小数の有効桁が小さくなると、モデルの表現力が低下する。
　・実際の問題では、倍精度を単制度にしてもほぼ精度が変わらない。

●極端な量子化
　・表現できる値が0,1の1bitの場合、誤差の大きな式になってしまう。
　　量子化する際は極端に精度が落ちない程度に量子化をしなければならない。

●蒸留
　・精度の高いモデルはニューロンの規模が大きなモデルになっている。
　　そのため、推論に多くのメモリと演算処理が必要。
　・規模の大きなモデルの知識を使い軽量なモデルの作成を行う。

●モデルの簡約化
　・学習済みの精度の高いモデルの知識を軽量なモデルへ継承させる。
　　→知識の継承により、軽量でありながら複雑なモデルに匹敵する
　　 精度のモデルを得ることが期待できる。

●教師モデルと生徒モデル
　・蒸留は教師モデルと生徒モデルの2つで構成される。
　・教師モデル：予測精度の高い、複雑なモデルやアンサンブルされたモデル。
　　生徒モデル：教師モデルをもとに作られる軽量なモデル。
　・教師モデルの重みを固定し、生徒モデルの重みを更新していく。
　　誤差は教師モデルと生徒モデルのそれぞれの誤差を使い、重みを更新していく。

●蒸留の利点
　・少ない学習回数でより精度の良いモデルを作成することができている。

●プルーニング
　・ネットワークが大きくなると大量のパラメータになるが、
　　すべてのニューロンの計算が制度に寄与しているわけではない。
　・モデルの制度に寄与が少ないニューロンを削減することで、
　　モデルの軽量化、高速化が見込まれる。

●計算の高速化
　・寄与の少ないニューロンの削減を行いモデルの圧縮を行うことで、
　　高速に計算を行うことができる。

●ニューロンの削減
　・重みが閾値以下の場合、ニューロンを削減し、再学習を行う。

●ニューロン数と精度
　・ニューロンを削除しても、意外と精度は変わらない。
　・閾値を高くすると、ニューロンは大きく削減できるが、精度も減少する。

#Section4:応用モデル
●MobileNet
　・畳み込みの演算を工夫している。

●Depthwise Convolution
　・フィルタ数が1固定になる。
　・通常の畳み込みカーネルは全ての層にかかっていることを考えると
　　計算量が大幅に削減可能。
　・各層ごとの畳み込みなので層間の関係性は全く考慮されない。
　　通常はPW畳み込みとセットで使うことで解決。

●Pointwise Convolution
　・カーネルのサイズを固定にする。

●DenseNet
　・出力層に前の層の入力を足し合わせる
　　→層間の情報の伝達を最大にするために全ての同特徴量サイズの層を結合する。

　・特徴マップの入力に対し、下記の処理で出力を計算
　　・Batch正規化
　　・Relu関数による変換
　　・3x3畳み込み層による処理

　・kをネットワークのgrowth rateと呼ぶ
　　kが大きくなるほどネットワークが大きくあるため、小さな整数に設定するのがよい。

　・Transition Layer
　　・CNNでは中間層でチャネルサイズを変更。
　　・特徴マップのサイズを変更し、ダウンサンプリングを行うため、
　　　Transition Layerと呼ばれる層でDence blockをつなぐ。

●DenseNetとResNetの違い
　・DenseBlockでは前方の各層からの出力全てが後方の層への入力として用いられる。
　・ResBlockでは前1層の入力のみ後方の層へ入力
　・DenseNet内で使用されるDenseBlockと呼ばれるモジュールでは、
　　成長率と呼ばれるハイパーパラメータが存在する。

●Batch Norm Layer
　・レイヤー間を流れるデータの分布を
　　ミニバッチ単位で平均が0・分散が1になるように正規化
　・ニューラルネットワークにおいて、
　　学習時間の短縮や初期値への依存低減、過学習の抑制などの効果がある。
　・Batch Sizeが小さい条件化では、学習が収束しないことがあり、
　　Layer Normalizationなどの正規化手法が使われることが多い。

●Batch Norm以外の正規化
　・Batch Norm：ミニバッチに含まれるsampleの同一チャネルが同一分布に従うよう正規化
　・Layer Norm：それぞれのsampleの全てのpixelsが同一分布に従うよう正規化
　・Instance Norm：さらにchannelも同一分布に従うよう正規化

●H x W x CのsampleがN個あった場合に、N個の同一チェネルが正規化の単位
　・RGBの3チャネルのsampleがN個の場合は、それぞれのチャンネルの兵員と分散を求め
　　正規化を実施。チャンネルごとに正規化された特徴マップを出力。
　・ミニバッチのサイズを大きく取れない場合には、効果が薄くなってしまう。

●Layer Norm
 ・N個のsampleのうち一つに注目。H x W x Cの全てのPixelが正規化の単位。
　・RGBの3チャネルのsampleがN個の場合は、あるsampleを取り出し、
　　全てのチャネルの平均と分散を求め正規化を実施。
　　特徴マップごとに正規化された特徴マップを出力。
　・ミニバッチの数に依存しないので、上記の問題を解消できていると考えられる。
　・入力データや重み行列に対して、以下の操作を施しても、出力が変わらない。
　　・入力データのスケールに関してロバスト
　　・重み行列のスケールやシフトに関してロバスト

●Instance Norm
　・各sampleの各チャネルごとに正規化
　・コントラストの正規化に寄与・画像のスタイル転送やテクスチャ合成タスクなどで利用。

●Wavenet
　・Aaron van den Oord et.al., 2016らにより提案
　　AlphaGoのプログラムを開発しており、2014年にgoogleに買収される。
　・生の音声波形を生成する深層学習モデル。
　・Pixel CNN(高解像度の画像を精密に生成できる手法)を音声に応用したもの。

●Wavenetのメインアイディア
　・時系列データに対して多段込みを適用する。
　・Dilated convolution
　　・層が深くなるにつれて畳み込むリンクを離す。
　　・需要野を簡単に増やすことができるという利点がある。

●深層学習を用いて結合確率を学習する際に、
　効率的に学習が行えるアーキテクチャを提案したことがワヴェネtの大きな貢献の1つ。
　霊安されて新しいConvolution型アーキテクチャは、
　Dilated causal convolutionと呼ばれ、結合確率を効率的に学習できる。

●上記を用いた際の大きな利点は、単純なConvolution layerと比べて、
　パラメータ数に対する需要野が広いことである。

#Section5:Transformer
●seq2seq
　・系列を入力として、系列を出力するもの。
　・Encoder-Decoderモデルとも呼ばれる。
　・入力系列がEncodeされ、内部状態からでc尾でする。
　・実応用上も入力・出力ともに系列情報なものは多い。
　　・翻訳(英語→日本語)
　　・音声認識(波形→テキスト)
　　・チャットボット(テキスト→テキスト)
　・Decoder側の構造は言語モデルRNNとほぼ同じだが、
　　隠れ状態の初期値にEncoder側の内部状態を受け取る。
　・Decoderのoutput側に正解を当てれば、教師あり学習がEnd2endで行える。
　・Googleの翻訳もseq2seqを多層化したもの。

[実装演習]
src: show your own business .
tgt: 自分 の 事 を しろ 。
out: 自分 の 仕事 を 知 っ て い 。

●Attention(注意機構)
　・翻訳先の各単語を選択する際に、翻訳元の文中の各単語の隠れ状態を利用。
　　・翻訳元の各単語の隠れ状態の加重平均。
　　・重み(すべて足すと1)重みはFFNNで求める。

●Attentionは何をしているのか
　・Attentionは辞書オブジェクト
　・queryに一致するkeyを検索し、対応するvalueを取り出す操作であると
　　見なすことができる。辞書オブジェクトの機能と同じ。
　・文長が長くなっても翻訳精度が落ちない。

●Transformer
　・2017年6月に登場
　・RNNを使わず、必要なのはAttensionだけ。
　・当時のSOTAをはるかに少ない計算量で実現。
　　・英仏(3600万文)の学習を8GPUで3.5日で完了。

●Self-Attentionが肝
　・入力を全て同じにして学習的に注意箇所を決めていく

●Transformer-Encoder
　・自己注意機構により文脈を考慮して各単語をエンコード

●Position-Wise Feed-Forward Networks
　・位置情報を保持したまま順伝搬させる。
　・アウトプットの次元を整えるための全結合層。

●Scaled dot product attention
　・全単語に関するAttentionをまとめて計算する。
　・線形変換されたものがQ,K,Vの入力となる。

●Multi-Head attention
　・重みパラメタの異なる8個のヘッドを使用。
　・8個のScaled Dot-Product
　・Attentionの出力をConcat
　・それぞれのヘッドが異なる種類の情報を収集

●Decoder
　・Encoderと同じく6層
　　・各層で二種類の注意機構
　　・注意機構の仕組みはEncoderとほぼ同じ
　・自己注意機構
　　・生成単語列の情報を収集
　　　・直下の層の出力へのアテンション
　　・未来の情報を見ないようにマスク
　・Encoder-Decoder attention
　　・入力文の情報を収集
　　　・Encoderの出力へのアテンション

●Add & Norm
　・Add
　　・入出力の差分を学習させる。
　　・実装上は出力に入力をそのまま加算するだけ。
　　・効果：学習・テストエラーの低減
　・Norm
　　・各層においてバイアスを除く活性化関数への入力を平均0、分散1に正則化
　　・効果：学習の高速化

●Position Encoding
　・RNNを用いないので単語列の語源情報を追加する必要がある。
　・単語の位置情報をエンコード
　・posの2進数表現

●Attentionの可視化
　・注意状況を確認すると、言語構造を捉えていることが多い。

[実装演習]
src: show your own business .
tgt: 自分 の 事 を しろ 。
out: 自分 の 商売 を <UNK> に 見せ て い 。

・BLEUの評価
25.848940324032505

#Section6:物体検知・セグメンテーション
●講義の物体認識タスク
　・分類→クラスラベル
　・物体検知→Bounding Box
　・意味領域分割→クラスラベル
　・個体領域分割→クラスラベル

●代表的データセット
　・VOC12
　・ILSVRC17
　・MS COCO18
　・OICOD18
　　※いずれも物体検出コンペティションで用いられたデータセット

　・Box/画像が少ない場合、アイコン的な映り、日常感とはかけ離れやすい。
　　大きい場合、部分的な重なり等も見られる。日常生活のコンテキストに近い。

●代表的データセットのポジショニングマップ　
　・目的に応じたBox/画像を選択する。
　・クラス数が大きいことは嬉しいのか？
　　・同じものが違う名前でラベル付けされてたりする。

●物体検出においてはクラスラベルだけでなく、物体位置の予測精度も評価したい。
　・IoU:Intersection over Union
　　　　 Area of Overlap / Area of Union

●AP:Average Precision
　・AP=∮P(R)dR (PR曲線の下側面積)
　　※クラスラベル固定のもとで考えていたことに注意。
　　 APはクラスごとに計算される。

●MS COCOで導入された指標
　・ここまでIoU閾値は0.5で固定していたが、
　　0.5から0.95まで0.05刻みでAP&mAPを計算し算術平均を計算。
　　→位置について厳しく計算するということ。

●FPS:Flames per Second
　・応用上の要請から、検出精度に加え検出速度も問題となる。
　・どのデータセットを使ったかも問題となる。

●深層学習以降の物体検知
　・AlexNetの登場を皮切りに、時代はSIFTからDCNNへ。
　・物体検知のフレームワークは大きく2つに分けられる。
　　・2段階検出器：候補領域の検出とクラス推定を別々に行う。
　　　　　　　　　 相対的に精度が高い傾向。
　　　　　　　　　 相対的に計算量が大きく推論も遅い傾向。
　　・1段階検出器：候補領域の検出とクラス推定を同時に行う。
　　　　　　　　　 相対的に精度が低い傾向。
　　　　　　　　　 相対的に計算量が小さく推論も早い傾向。

●SSD:Single Shot Detector
　①Default BOXを用意
　②Default BOXを変形し、conf.を出力

●SSDのネットワークアーキテクチャ
　・SSDの特徴であるマルチスケール特徴マップ

●特徴マップからの出力
　・マップ中の1つの特徴量における1つのDefault Boxについて
　　出力サイズ #Class + 4 ※オフセット項
　・マップ中の各特徴量にk個のDefault Boxを用意するとき、
　　出力サイズ k (#Class + 4)
　・更に、特徴マップのサイズがmxnであるとすれば、
　　出力サイズ k (#Class + 4) mn
　　
●その他の工夫
　・多数のDefault Boxを用意したことで生ずる問題への対処
　　・Non-Maximum Suppression
　　　・1つに対して重複して検出してしまう場合。
　　　・IoUがある程度大きいものは1つにまとめる。
　　　・RCNNでも既に用いられている。
　　・Hard Negative Mining
　　　・背景として判断されるクラスが多い場合。
　　　・Negativeが3倍以下になるようにする。

●Semantic Segmentation
　・落ちた解像度を元の解像度に戻すのが肝。
　・そもそもPoolingしなければ良いのでは？
　　→正しく認識するために受容野にある程度の大きさが必要。
　　 深いConv.層、プーリング
　　　　　↑多層化に伴う演算量・メモリの問題

●FCN(Fully Convolutional Network)の基本アイディア
　・convolution層に置き換えることでヒートマップを得られる。

●Deconvolution/Transposed convolution
　①特徴マップのpixel感覚をstrideだけ空ける
　②特徴マップのまわりに(kernel size - 1) - paddingだけ余白を作る
　③畳み込み演算を行う

●輪郭情報の補完
　・Poolingによりローカルな情報が失われていく。
　　低レイヤーPooling層の出力をelement-wise additionすることで
　　ローカルな情報を補完してからUp-sampling

●Dilated Convolution
　・Convolutionの段階で受容野を広げる工夫。