深層学習Day4　ラビットチャレンジ

深層学習Day4
Section1 強化学習
1-1強化学習とは
・長期的に報酬を最大化できるように環境のなかで行動を選択できるエージェントを作ることを目標とする機械学習の一分野　
　→行動の結果として与えられる利益(報酬)をもとに、行動を決定する原理を改善していく仕組み。
・教師あり、教師なし、強化学習、の3つの分類のうち1つ。強化学習は実際の仕事での人間の行動に似ている。
・エージェントと環境があり、エージェントが環境に対して行動すると、報酬wお環境から得る。エージェントは方策をだし行動。報酬をもらい価値を認識する。
・「方策」とはエージェントがどのようにしたら良いのかと考えること。環境における「状態」があり、その状態をエージェントが観測をする。

1-2強化学習の応用例
・例えばマーケティングの場合は、環境が販売促進部、エージェントはプロフィールや購入履歴に基づいてキャンペーンメールを送る顧客を決めるソフトウェア。行動は、顧客ごとにメールを送信するか、送信しないかの二値。報酬は、キャンペーンのコストと言う負の報酬と、キャンペーンで生み出されると推測される売上という正の報酬がある。

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

1-4強化学習のイメージ
・エージェントが方策を決めるのに用いられるのが方策関数Π(s,a)。
・報酬すなわち価値を決めるのが行動価値関数Q(s,a)
・強化学習と通常の教師ありおよび教師なし学習の違い
→目的が違う。教師ありおよびなし学習では、データに含まれるパターンを見つけ出し、そのデータから予測することが目標。強化学習では、優れた方策を見つけることが目標。
・強化学習により、ホワイトカラーの経験値、にあたるものが作成可能。人材育成コストが省ける。

1-4-2強化学習の歴史
・強化学習は冬の時代があったが、計算速度の進展により大規模な状態を保つ場合の、強化学習を可能としつつある。関数近似法とQ学習を組み合わせる手法が登場。
・Q学習：行動価値観数を、行動するごとに更新することにより学習を進める方法。
・関数近似法：価値観数や方策関数を関数近似する手法のこと(ここはニューラルネットワーク)

1-4-3価値関数
・価値を表す関数として、状態価値関数と行動価値関数の2種類がある。
・ある状態の価値に注目する場合は、状態価値関数。状態とエージェントの行動による価値を組み合わせた価値に注目する場合は行動価値関数。行動価値観数のほうが現在は重きが置かれていて、AlphaGoでも用いられている。
1-5強化学習の差分
1-6行動価値関数

1-7方策関数
・方策関数：方策ベースの強化学習において、エージェントがどのような行動を取るのか確率を与える関数のこと。
方策関数Π(s) = a
関数の関係
　エージェントは方策に基づいて行動する。
　Π(s,a): VやQをもとにどういう行動をとるか→経験を活かす or チャレンジするなど。→その瞬間瞬間の行動をどうするか
　VΠ(s):状態関数
　QΠ(s,a):状態＋行動関数
　→VΠとQΠ：ゴールまでの今の方策を続けたときの報酬の予測値が得られる。→やり続けたら将来的にどうなるか

1-8方策勾配法
　方策反復法：方策をモデル化して最適化する手法。そのうちの一つが方策勾配法
　NNの重みの更新式と同じイメージだが、強化学習ではより報酬を得られる行動をする(最大化)ため第1項と第2項を加算している。
　θ(t+1)  ＝　θ(t) + ε⊿J(θ)　

　Jとは：期待収益)方策の良さ)→これは定義しなくてはならない。
  ⊿J(θ) = ⊿θ∑Πθ(a|s)QΠ(s､a)　であり、ある行動を取る確率Πθと、その時の報酬QΠを乗算することで、ある行動aをとったときの報酬を表す。これを行動aについて和を取ると、報酬の期待値となる。

Section 2 AlphaGo
●AlphaGo Lee
・方策関数PolicyNet、価値関数ValueNet　どちらも畳み込みニューラルネットワークでできている。
・PolicyNet：19x19、48チャンネルの2次元の碁盤の情報。48チャンネルの理由は、石があるかどうかだけでなく、取れるかどうか、着手履歴、などが含まれているため。それらの入力から畳み込みを行い、最終的にsoftmaxで19x19盤面のうち、どこに打つとよいのかの確率が算出される。
・ValueNet：19x19、49チャンネルの情報を畳み込み、最終的にTanHをもちいて「勝てそうかどうか」を-1から1で表現して出力し価値観数として用いる。最終的に出力2次元をflattenかけて1次元として数値として扱う。
・AlphaGo Leeの学習ステップ
1．教師あり学習でRollOutPolicyとPolicyNetの学習を行う。
→棋譜データから3000万局面分の教師を用意し、教師と同じ着手を予測できるよう学習を行った。具体的には、教師が着手した手を1とし残りを0とした19×19次元の配列を教師とし、それを分類問題として学習した。過去の棋譜データ3000万曲分の教師で、57%の精度を出せた。
2．強化学習でPolicyNetの学習を行う。
→現状のPolicyNetとPolicyPoolからランダムに選択されたPolicyNetと対局シミュレーションを行い、その結果を用いて方策勾配法で学習を行った。PolicyPoolとは、PolicyNetの強化学習の仮定を500Iterationごとに記録し保存しておいたものである。現状のPolicyNet同士の対局ではなく、PolicyPoolに保存されているものとの対局を使用する理由は、対局に幅をもたせて過学習を防ごうというのが主である。この学習をmini batch size 128で1万回おこなった。
3．強化学習でValueNetの学習を行う。
→PolicyNetを使用して対局シミュレーションを行い、その結果の勝敗を教師として学習した。教師データの作成手順は1:まずSL PolicyNet(教師あり学習で作成したPolicyNet)でN手まで打つ。 2:N+1手目の手をランダムに選択肢、その手で進めた局面をS(N+a)とする。3: S(N+1)からRL PolicyNet(強化学習で作成したPolicyNet)で終局までうち、その勝敗報酬をRとする。　S(N+1)とRを教師データ対とし、損失関数を平均二乗誤差とし、回帰問題として学習した。この学習をmini batch size 32で5000万回行った。　N手目までとN+1手目のPolicyNetを別々にしてある理由は、過学習を防ぐためであると説明されている。
★この2,3のプロセスが大変なので、RollOutPolicyを行う。
RollOutPolicy: ニューラルネットワークではなく線形の方策関数。探索中に高速に着手確率を出すために使用される。→PolicyNetのような方策関数は畳み込みをしているため計算量が多かったがRollOutPolicyは遥かに速い。

★モンテカルロ木探索
コンピュータ囲碁ソフトでは最も有効とされている探索法。他のボードゲームではminmax探索やその派生系のαβ探索を使うことが多いが、盤面の価値や勝率予想値が必要となる。しかし囲碁では盤面の価値や勝率予想値を出すのが困難であるとされてきた。そこで、盤面評価値に頼らず末端評価値、つまり勝敗のみを使って探索を行うことができないか、という発送で生まれた探索法である。囲碁の場合、他のボードゲームと違い最大手数はマスの数でほぼ限定されるため、末端局面に到達しやすい。具体的には、原曲面から末端局面までPlayOutと呼ばれるランダムシミュレーションを多数回行い、その勝敗を集計して着手して優劣を決定する。また該当手のシミュレーション回数が一定数を超えたら、その手を着手したあとの局面をシミュレーション開始局面とするよう、探索木を成長させる。この探索木の成長を行うというのがモンテカルロ木探索の優れているところである。モンテカルロ木探索はこの木の調整を行うことによって、一定条件下において探索結果は最善手を返すということが理論的に証明されている。

●AlphaGo Zero
★AlphaGo LeeとAlphaGo Zeroの違い
1:教師あり学習を一切行わず、強化学習のみで作成
2:特徴入力からヒューリスティックな要素を排除し、石の配置のみにした
3:PolicyNetとValueNetを一つのネットワークに統合した(出力は2つ、方策関数と価値関数)
4:ResidualNetを導入した。
5:モンテカルロ木探索からRollOutシミュレーションを廃止した。
・Residual blockが39個連なっているのが特徴。

★Residual Network
ネットワークが深くなると勾配消失が起きるため防ぎたい。そのためにネットワークにショートカットを追加することで、勾配消失や勾配爆発を防いだ。
Residual Networkを使うことにより、100層を超えるネットワークでの安定した学習が可能となった。
基本構造は convolution→batchnorm→ReLU→Convolution→batchnorm→Add→Reluのブロックを1単位として積み重ねる形となる。
さらに、Residual Networkにより層数の違うNetworkが複数存在してることとなり、アンサンブル学習効果を出すことができる。

★Residual Blockの工夫
・Bottleneck：1x1 kernelのconvolutionを利用し、1層目で次元削減をおこなって3層目で次元を復元する3層構造にし、2層のものと比べて計算量はほぼ同じだが1層増やせるメリットが有る、としたもの。
・PreActivation：ResidualBlockの並びをBatchNorm→ReLU→Convolution→BatchNorm→ReLU→Convolution→Addとすることにより、性能が上昇したとするもの。

★ネットワークの工夫
・WideResNet：ConvolutionのFilter数をk倍したResNet。Filter数をk倍と段階的に増やすことにより、浅い層数でも深い層数のものと同等以上の制度となり、またGPUをより効率的に使用できるため学習も速い。
・PyramidNet：WideResNetで幅が広がった直後のそうに過度の負担がかかり精度を落とす原因となっているとし、段階的にではなく、各層でFilter数を増やしていくResNet。


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

3-2データ並列
・親モデルを使用する各ワーカーに子モデルとしてコピー、データを分割し、各ワーカーごとに計算をさせる。
・同期型：各ワーカーごとのモデルのパラメータの勾配の平均をとりもとの親モデルのパラメータを更新する。各ワーカーの計算が終わるのを待つ必要がある。
・非同期型：各ワーカーはお互いの計算を待たず、各子モデルごとにパラメータの更新を行う。学習が終わった子モデルはパラメータサーバに新しい子モデルをpushする。新しく学習を始めるときは、パラメーターサーバーからPOPしたモデルに対して学習していく。
・処理のスピードはお互いのワーカーの計算を待たない非同期型のほうが速いが、非同期型は最新モデルのパラメータを利用できないので、学習が不安定になりやすい Stale gradient problem
・現在は同期型のほうが制度が良いことが多いので腫瘤となっている。
3-1モデル並列
・親モデルを書くワーカーに分割し、それぞれのモデルを学習させる。すべてのデータで学習が終わったあとで、一つのモデルに復元する。
・モデルが大きいときはモデル並列化を、データが大きいときはデータ並列化すると良い。
・複数のPCで分散学習をさせると、誤差関数をまとめるのに時間がかかる。GPUなら１台のパソコンでできるので速い。
・モデル並列においてはモデルのパラメータ数が多い(大きいモデル)ほど、スピードアップの効率も向上する。
・Google社が2016年に論文で出したLarge Scale Distributed Deep Networksは、Tensorflowの前身と言われている。並列コンピューティングを用いることで大規模なネットワークを高速に学習させる仕組みを提案。モデル並列および非同期型データ並列の提案をしている。
3-3 GPU
・GPGPU(General-purpose on GPU)：もともとの使用目的であるグラフィック以外の用途で使用されるGPUの総称。
・CPU：高性能なコアが少数、複雑で連続的な処理が得意
・GPU：比較的低性能なコアが多数、かんたんな並列処理が得意、ニューラルネットの学習は単純な行列演算が多いので、高速化が可能。
★GPGPU開発環境
●CUDA
・GPU上で並列コンピューティングを行うためのプラットフォーム。NVIDIA社が開発しているGPUのみで使用可能。DL用に提供されているので使いやすい。
●OpenCL
・オープンな並列コンピューティングのプラットフォーム
・NVIDIA社以外の会社(Intel, AMD, ARM)のGPUからでも使用可能・
・DeepLearning用の計算に特化されているわけではない。
●DLフレームワーク内で実装されているので、使用する場合は指定すれば良い。

3-4量子化 Quantization 軽量化の１つ
・ネットワークが大きくなると、大量のパラメータが必要になり学習や推論に多くのメモリと演算処理が必要。
・通常のパラメータの64bit floatを32 bitなどの回の精度に起こすことで、メモリと演算処理の削減を行う。こうすればメモリの使用量は半分で済む。この何bitで表現するかを量子化する、という。
・省メモリ化：ニューロンの重みwお浮動小数点のbit数を少なくし、有効桁数を下げることで、ニューロンのメモリ使用サイズを小さくすることができ、多くのメモリを消費するモデルのメモリ使用量を抑えることができる。たとえば、16bit floatでは5bitで整数(10^8まで)を、10bitで少数を表現。64bitでは11bitで整数(10^11まで)を、52bitで少数以下を表す。
・量子化の利点と欠点：利点は計算の高速化、省メモリ化。欠点は精度の低下。
・機械学習では重みが小数点で表現されるので、これの影響を強く受ける。
・16bitが最も汎用的で使われている。

3-5蒸留
・精度の高いモデルはニューロンの規模が大きくなっているため推論に多くのメモリと演算処理が必要である。そのため、規模の大きなモデルの知識を使い、軽量なモデルの作成を行う。
・数百層の深い層のモデルから、軽量なモデルを作成する。
・蒸留は教師モデルと生徒モデルの２つで構成される。教師モデル：予測精度の高い複雑なモデルやアンサンブルされたモデル。生徒モデルは教師モデルをもとに作られる軽量なモデル。
・教師モデルの重みは固定する。生徒モデルの重みを更新していく。誤差は教師モデルと生徒モデルのそれぞれの誤差を使い重みを更新していく。

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


Section4 応用モデル
4-1 MobileNet　画像認識で軽量化したモデル
・2017年に精度は最高レベルに達しており、そこから先は軽くて性能が良いモデルを研究する事が多くなった。MobileNetはその先駆け。あまり計算量を増やさずに比較的高性能である事が目標。
・一般的な畳込みレイヤーは、入力特徴マップ HxWxC、畳み込みのカーネルサイズKxKxC、出力チャネル数(フィルタ数)Mのパラメータがある。paddingあり、stride１での計算量はKxKxCxMを、HｘWの画像サイズで畳み込むので、HxWxKxKxCxMの計算量が必要。この計算量を減らそう。
・Depthwise ConvolutionとPointwise Convolusionの組み合わせで軽量化を実現した。
・Depthwise Convolutionは、入力マップのチャネルごとに畳み込みを実施し、出力マップをそれらと結合する。(入力マップのチャネル数と同じになる)入力MAP HxWxC、カーネルサイズKxKでフィルタは１、出力マップはHxWxCで、出力チャンネルも入力と等しくなる。画像なら３チャンネル。
・Pointwise Convolutionは、カーネルサイズを１ｘ１として、フィルタ数をM個にする。1x1 convともよばれ、入力マップのポイントごとに畳み込みを実施する。出力マップはフィルタの数分だけ作成可能で、任意の数作れる。出力マップの計算量はHxWxCxM。
・通常の畳込みに似たような構成を、2つの畳み込みを組み合わせることで実現した。
★MobileNetのアーキテクチャ
・Depthwise Separable Convolutionという手法を用いて計算量を削減している。通常の多々m込みが空間方向とチャネル方向の計算を同時に行うのに対して、Depthwise Separable ConvolutionではそれらをDepthwise ConvolutionとPointwise Convolutionに分けることで個別に行う。

★★確認テスト★★
・Depthwise Convolutionはチャネルごとに空間方向へ畳み込む。すなわちチャネルごとにDk x Dk x 1のサイズのフィルターをそれぞれ用いて計算を行うため、その計算量は H x W x  C x K x K
・次にDepthwise Convolutionの出力をPointwise Convolutionによってチャネル方向に畳み込む。すなわち出力チャネルごとに1 x 1  x Mサイズのフィルターをそれぞれ用いて計算を行うために、その計算量は H x W x C x M

4-2 DenseNet 画像認識のネットワーク
・DenseNet; ニューラルネットワークでは層が深くなるにつれて学習が難しくなるという問題があったが、Residual Network (ResNet)などのCNNアーキテクチャでは前方の層から広報の層へアイデンティティ接続を介してパスを作ることで問題を対処した。DenseBlockと呼ばれるモジュールを用いた、DenseNetもそのようなアーキテクチャの一つである。
・Dense Blockが3回組み合わさっている。Dense Blockでは出力層に前の層の入力を足し合わせる。これにより、層間の情報伝達を最大にするためにすべての同じ特徴量サイズの層を結合する。
・入力特徴マップのチャンネル数がl x kだった場合、出力は(l+1)x k　となる。このkはハイパーパラメータで、growth rateと呼ぶ。kが大きいほど大きいネットワークになるため、小さな整数に設定するのが良い。
・Dense Blockの間にtransition layerをかませることで、ダウンサンプリングを行い整理を行うことで、計算量を少なくする。
・DenseNetとResNetの違い
→・DenseBlockでは前方の角層からの出力すべてが広報の層への入力として用いられる一方で、Resisual Blockでは前1層の入力のみ後方の層へ入力される。

4-3 Layer正規化/Instance正規化
●BatchNorm　Batch normだけがバッチサイズの影響を受ける。
・レイヤー間を流れるデータの分布を、ミニバッチ単位で平均0分散1になるように正規化する
・BatchNormはNNにおいて学習時間の短縮や初期値への依存提言、過学習の抑制などに効果がある。
・問題点として、Batch sizeが小さい条件下では学習が収束しないことがあり、代わりにLayer Normalizationなどの正規化手法が使われることが多い。
・Batch Normは実際には使いたくない。ミニバッチというのは非常に厄介。学習を行う時のハードウェア（CPU, GPU, TPU）によって、ミニバッチサイズは変えざるを得ない。そうすると、Batch Normalization の効果というのはよく追えなくなる。
・H x W x CのsampleがN個あった場合、N個の同一チャンネルが(赤のデータだけあつめるなど)正規化の単位。それぞれのチャンネルの平均と分散を求め、正規化を実施する。チャネルごとに正規化された特徴マップを出力する。
●Layer Norm
・それぞれのsample(1枚毎の画像)のすべてのpixelが同一分布従うよう正規化する(色ごとではなく1枚の画像のRGB通して正規化する）
・RGB3チャンネルのサンプルがn個の場合は、あるsampleを取り出し、すべてのチャネルの平均と分散を求め、正規化を実施する。ミニバッチの数に依存しない。
・入力データや重み行列に対して、以下の操作を施しても出力が変わらないことが知られている。
●Instance Norm
・channel数も同一分布従うように正規化する
・各サンプルの各チャネルごとに正規化する。バッチノーマライゼーションのバッチサイズ1と同じ。
・コントラストの正規化に寄与、画像のスタイル転送やテクスチャ合成タスクで使用する。

4-4 Wavenet　音声認識モデル
・Aaron van den Oordらにより2016年に提案。
・AlphaGoのプログラムを開発しており、2014年にgoogleに買収される。
・生の音声波形を生成する深層学習モデル。
・Pixel CNN(高解像度の画像を精密に生成できる手法)を音声に応用したもの。
・時系列データに対して多々m込みを行うわけだが、層が深くなるにつれて畳み込みのリンクを離す、Dilated convolutionを行う。受容野を増やすことができ、長い時間の流れを組み込むことができる。

★★確認テスト★★
・深層学習を用いて結合確率を学習する際に、効率的に学習が行えるアーキテクチャを提案したことがWaveNetの大きな貢献の一つである。提案された新しいconvolutionがたアーキテクチャは、Dilated causal convolutionとよばれ、結合確率を効率的に学習できるようになっている。答えはDilated causal convolution.
他の選択肢；Depthwise separable convolutionは、MobileNetのチャンネルの方向は１で、横縦方向のカーネルサイズでのみ畳み込む。Pointwise Convolution：カーネルサイズは1x1とし、チャンネル数は自分の希望するMチャンネルで畳み込む。Deconvolution:逆畳み込み。小さく畳み込まれた画像を、大きく逆畳み込みする。超解像など。
・Dilated causal convolutionを用いたときのメリットは、単純なconvolutional layerに比べて、パラメータ数に対する受容野が広い。

Section 5 Seq2SeqとTransformer
Section 5-1 Seq2Seq
・BERTを理解するには、Encoder-Decoderモデル→Tranformer（EDモデルにアテンションをかける）→BERT
・Sequence to sequence、系列を入力とし、系列を出力する。翻訳、音声認識、チャットボットなどに用いられる。
●RNN（LSTMなど改良版RNN含む）と言語処理モデルを組み合わせたもの。
・RNNは再帰的ニューラルネットワーク。中間層の出力を再度入力に戻す、時間軸に沿って。これにより系列情報を組み込むことができる。
・最終的に内部状態ベクトルhを出力する。
●言語モデル
・言語モデルは、単語の並びに確率を与えるもの。単語の並びに対して、文章として自然な具合を尤度として表現する。数式的には同時確率を事後確率に分解して表せる。
・時刻t-1までの情報で時刻tの事後確率を求めることが目標。これで同時確率が計算できる。 8:02
●RNNと言語モデルまとめ
・RNNは系列情報を内部情報に変換することができる
・文章の各単語が現れるときの同時確率は、事後確率で分解できる。したがって、事後確率を求めることがRNNの目標になる。
・言語モデルを再現するようにRNNの重みが学習されていれば、ある時点の次の単語を予測することができる。先頭単語を与えれば、文章生成することも可能。
●EncoderからDecoderに渡される内部状態ベクトルhが鍵。
・ここで、Decoder側に正解を与えれば、教師あり学習がEnd2Endで行える。出力に対して、Mean Cross Entropyを誤差関数として返す。

実装：17:05
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/handson_seq2seq_lecture_chap1_exercise_public.ipynb

Section 5-2  Transformer
・ニューラルネットによる機械翻訳の問題点→長さに弱い。長い文章を一つのベクトルに圧縮することで精度が落ちる。
・それを解決するためのattention(注意機構)がある。翻訳先の各単語を選択する際に、翻訳元の文中の各単語の隠れ状態を利用する。Sumを取ると1を取るような重みの分配をとるようにする。
・Attentionは辞書オブジェクトで、queryに一致するkeyを索引し、対応するvalueを取り出す操作と見ることができる。これは辞書オブジェクトと同じ機能ともとれる。(key value attention)
 Queryはinputのうち検索をかけたいもの、Keyは検索対象とQueryの近さを図る、Valueはkeyに基づき適切なvalueを出力する値。
・このAttentionを使っている機構がTransformer。2017年6月に登場、RNNを使わず、必要なのはAttentionだけ。当時のSOTAをはるかに少ない計算量で実現し、英仏3600万分の学習を8GPUで3.5日で完了。
・Seq2Seq同様EndcoderとDecoderモデルであるが、Transformerでは単語ベクトルに位置情報を付加すること、アテンションをかけることがencoderで特異的である。また、未来の単語を見えないようにマスクすることがdecoderで特異的である。
・Attentionには2種類あり：Source target attention　ソース・ターゲット注意機構とも呼ばれる。Queryに正解となる系列を与え、key valueに入力となる系列を与えるattention。；Self-attentionは自己注意機構。Queryに成果となる系列を与えるSource target attentionと違い、Self attentionではQuery, Key Valueすべて入力となる系列を与える。このSelf-atetntionが肝である。20：45
・Scaled dot product attention；全単語に関するAttentionをまとめて計算する。softmax関数に（QK^T/√dk)*V dkは内部の次元。
・Multi head attention；Scaled Dot-product attentionを8つ並べたもの。8つにユニットを分けてアテンションメカニズムを分散させることで、独自の注意のかけ方をそれぞれが学習していく。
・Residual connection：入出力の差分を与えることで学習効率を図る手法。
・Posiition-wise feed forward network：二層結合の全結合NN。単語の位置ごとに個別の順伝播ネットワークを作成し、ほか単語との影響を排除する。パラメータはすべてのネットワークで共通。
・Position encoding：TransformerではRNNを使っていないため、単語の語順情報を与える。25:30

実装
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/lecture_chap2_exercise_public.ipynb

Section 6 物体検知・セグメンテーション
★物体検知とSS解説１
・物体認識タスク：入力は画像、カラーやモノクロは問わない。出力は主に４つ。分類、物体検知、意味領域分割(semantic segmentation)、個体領域分割(instance segmentation)。
・分類は画像に対するクラスラベル。物体検知はboundig box(bb)、意味領域分割(各ピクセルに対し、単一のクラスラベル)、個体領域分割(各ピクセルに対し単一のクラスラベル)
・分類は物体の位置には興味なし。個体領域分割はインスタンスの区別まで行う。
・BBでは物体がそこにいるというconfidenceとともに出力される
・代表的データセットは物体検出コンペで用いられたデータセット：15:43
VOC12 (visual object classes12; Instance annotation)　クラス数20、Train+Valデータ11540、Box/画像の比2.4
ILSVRC17(ImageNet Scale Visual Recognition Challenge、ImageNetのサブセット(21841クラス、1400万枚以上))　クラス数200、Train+Valデータ476668、Box/画像の比1.1
MS COCO18 (マイクロソフト Common object in context; Instance annotation) クラス数8、Train+Valデータ123287、Box/画像の比7.3
OICOD18 (Open Images Challenge Object Detection. Open Images V4 (6000クラス以上、900万枚以上のサブセット); Instance annotation) クラス数500、Train+Valデータ1743042、Box/画像の比7.0
・Box/画像の比が小さいと、アイコン的な写りで日常感とはかけ離れる。大きいと、部分的な重なりも出てきて、日常生活のコンテキストに近くなる。Box/画像の比と、クラス数の数に応じて、作りたいモデルにあったデータセットを選択すること。
★物体検知の評価指標26:30
・分類問題における評価指標は、confusion matrixを作成し、accuracy, precision, recall, F-valueを算出して評価指標とした。
・物体検知においては、閾値を変更することで、閾値以上のpredictionのBBの枠およびそのラベルが表示される。閾値を上げることで、提示するBB自体の数が減る。
・IoU Intersection over Union:物体検出においてはクラスラベルだけでなく物体位置の予測精度も評価したい。真のBB(ground truth bb)と提案したBB(predicted bb)の和、分の、重複したBBの面積。Jaccard係数とも呼ばれる。IoU = TP\（TP + FP + FN）でもある。
・IoUは直感的な解釈は難しい。しかし、PredictedBBとGround-truth BBの和分の正解領域、とすることで、BBをすべて元のデータで覆われている、のような間違った精度評価をしなくて良い。
・実際の予測において、IoUに関しても閾値を設ける。なので、confidenceのラベルの閾値、および、BBのIoUの閾値を決める必要がある。また、同じ物体が2つ以上検出された場合、最もconfidenceの高いものだけをのこすのか、すべて残すのかを設定する必要もある。46:34
・PrecisionやRecallは画像1枚の中でのセグメンテーションであれば、BBごとに整数で計算して良い
・confidenceの閾値βを変えて、Precision-Recall curveを作成し、average precisionを作成す。Average Precision =∫0-1, P(R) dRで、PR曲線の下側面積となる。
・APはクラスラベルを固定して、人のAP,車のAPと計算されることになる。20クラスあるならば、20クラスの平均mean AP   を計算する。mAP = 1/C * ∑AP　56:30
・MS COCOでは、IoUの閾値を0.5から0.95まで0.05刻みでAPとmAPを計算し、算術平均を出す。
・FPS flames per scondについて。物体検知は、検出速度だけでなく、検出速度も重要である。
・マイルストーン　2012年AlexNetの登場を皮切りに、時代はSIFTからDCNNへ。2013年以降、ベースネットワークとして2014-2015VGG Net, Google Lenet、2016年Res Net、2016-17Inception-ResNet、DenseNet、2018年MobileNet、AmoebaNet。物体検知のフレームワークとして、YOLOなどが出てきた。
・フレームワークとしては2段階検出器や1段階検出器がある。2段階は、候補領域の検出とクラス推定を別々に行う。相対的に精度は高い。計算量は大きく、推定も遅い。一方で1段階検出器では、候補領域の検出とクラス推定を同時に行う。精度は高い。計算量は小さくて、推論も速い。

★物体検知とSS解説２
●Single shot Detectorは1段階検出器。
・検出したい物体に対して、default boxなる適当なBBを用意する。このDefault boxが優れたBBになるように変形していくよう学習していく。また、confidenceも出力する。
・VGG16　畳み込みと全結合層あわせて16層。これをSSDに利用する。
●●その他の工夫17:35
●Non-maximum supression
・Default boxが複数用意されたことにより、複数のpredicted BBが用意されてしまう。そこで、IoUを計算し、一定数どれもかぶっているのであれば、そのなかでconfidenceが最も高いもののみを残して、ほかはなしとする。
・RCNNでもすでに用いられており、SSDで初めて出てきた概念ではない。
●Hard negative mining
・たくさんのDefault boxを用意することで、背景と認識されるnegative classがある場合、背景とそれ以外の物体で検出数が不均衡となる。不均衡とならないように、positive ;negative = 1:3程度になるように制約をかける。
●その他に、Deafault boxのアスペクト比をどうするか、data augmentationによる水増しなどについても議論されている。
●損失関数は2つの和
・confidenceに対する損失関数
・locationに対する損失関数。Faster RCNNでも用いられるのはsmoothL1 loss。
●SSDの進化
DSSD deconvolutional signle shot detector (ResNetを用いている)
Extended the shallow part of Single Shot MultiBox Detector via Convolutional NN　VGG16を用いている
Single-Shot Refinement Neural Network for Object Detection　VGG16を用いている

★物体検知とSS解説３　Semantic Segmentationの概略
・畳み込みやプーリングを繰り返すことで、入力画像の解像度がどんどん落ちてしまい、解像度がおちることでsemantic segmentationにとっては問題になる。
・なぜなら、入力画像の解像度が落ちても、もとと同じサイズで出力させられるからである（アップサンプリングの壁）　各ピクセルに対してクラス分類が行われるのが基本。
・そもそもプーリングしなければアップサンプリングしなくていいのでは？→そもそも受容野を広げるために、畳み込み層を深くしたり、プーリングやストライドを増やす必要がある。深い畳込みは計算が多いため、プーリングする必要があるため、画像の演算ではしかたない。
●Deconvolution/Transposed convolution　アップサンプリングの一つ。
通常のcovolution層と同様にカーネルサイズ、パディング、ストライドを指定する
１．特徴マップのPixel間隔をstrideだけ空ける
２．特徴マップのまわりに(Kernel size -1) -paddingだけ余白を作る
３．畳み込み演算を行う。
・逆畳込みと呼ばれることも多いが畳み込みの逆演算ではないため、プーリングで失われた情報が復元されるわけではない。例えば輪郭の情報などは失われていく。
・そのために、低レイヤープーリング層の出力をelement-wise additionすることで、ローカルな情報を保管してからupsampleingするなどの工夫が上げられ、これにより輪郭情報が補完される。
・他にプーリング前の情報を伝達する方法としてU-Netがあり、skip connectionを用いて低レイヤープーリング層の情報を伝達する
・また、Unpoolingでは、poolingでのmax poolingの最大情報を持っていた位置情報も保持しておき、unpooling　mapを作成することもでき、解像度向上に貢献する。

●Dilated convolution
・Convolutionの段階で受容野を広げる工夫。
・Dilated convolutionはカーネルの隙間をあけて畳み込みを行う(3x3のカーネルだが、実際に隙間を開けて７ｘ７のピクセルを認識させる)ことで、受容野を広げる

★DCGAN
●GAN Generative Adversarial Nets
生成機と識別機を競わせて学習する生成アンド識別モデル。
Generator:乱数からデータを生成
Discriminator：入力データが真データであるか識別
・2プレイヤーのミニマックスゲーム：1人が自分の勝利する確率を最大化する作戦をとり、もう1人は相手が勝利する確率を最小化する作戦を取る。
・min(G) max(D) V (D,G)　このV(D.G)はバイナリークロスエントロピーの式と同じ。複数データをあつかうため、期待値を用いて計算する。
・最適化方法　Generatorのパラメータθgを固定したうえで、descriminatorを更新。勾配上昇法でθdを更新し、価値関数を高めていく。次に、Discriminatorのパラメータθdを固定化し、θgを勾配降下法で更新して誤差を減らしていく。13:00
・なぜGeneratorは本物のようなデータを生成するのか？生成データのpgと実際のデータpdataが等しい分布であるはず、という状況。価値関数がpg = pdataのときに最適化されていることを示せば良い。
→これを2つのステップで確認。Gを固定し、価値観数が最大値を取るときのDｘを算出。次に、上記のDxを価値観数に大入試、Gが価値観数を最小化する条件を算出する。
①価値関数を最大するDxは、微分して極大値を求める。V (D,G)を偏微分する。最大化するDx＝　pdata(x)/pdata(x) + pg(x)　となる。
②価値関数が最小となるのはp data = pgのときに最小値となる。26:29

●DCGAN
Deep convolutional GAN
・いくつかの構造制約により生成品質を向上している。
①Generator:pooling層の代わりに転置畳み込み層を用いる（アップサンプリング）。最終層はtanh、その他はReLUで活性化。
②Discriminator：Pooling層の代わりに畳み込み層を使用する。Leaky ReLU関数で活性化する。
③共通事項：中間層に全結合層を使わない、バッチノーマライゼーションを適用する。