E資格 深層学習Day4

# はじめに
ラビット・チャレンジ Deep Learning 「深層学習Day4」の受験レポート
要点のまとめ、実装演習結果、確認テスト結果の考察
講座受講中は手元のノートに記載している。
ここでは、振り返りながらメモレベルで表す

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

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


## AlphaGo
Google DeepMindによって開発されたコンピュータ囲碁プログラム

#### AlphaGo Lee
PlolicyNetが方策関数
ValueNetが価値関数

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

Residual Network
ネットワークにショートカット構造を追加して、勾配の爆発、消失を抑える効果を狙ったもの


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

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

データ並列化は各モデルのパラメータの合わせ方で、同期型か非同期型か決まる。
・処理速度は非同期型のほうが速い
・非同期型は、各ワーカーが最新のモデルを使用できないため、学習が不安定になりやすい。
・現在は、同期型の方が精度が良いことが多いので、主流となっている。

#### モデル並列
親モデルを各ワーカーに分割し、それぞれのモデルを学習させる。
すべてのデータで学習が終わったあとで、一つのモデルに復元。
モデルの枝分かれ部分を別の計算機に分割する方法が主流。

モデルが大きいときはモデル並列化を、データが大きいときはデータ並列化すると良い。

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


### GPU
低性能なコアを多数保持。
並列処理が得意。

GPGPU：グラッフィク用途以外に使用するGPUの総称

CUDA
・NVIDIAのGPUのみで使用可能。
・Deep Learning用に提供されているので使いやすい。
OpenCL
・NVIDIA以外のGPUでも使用可能。
・Deep Learning用に提供されているわけではない。




### 量子化
通常のパラメータの64bit浮動小数点を32bitなどの下位の精度に落とすことで、メモリと演算処理の削減を行う。

利点
　計算の高速化
　省メモリ化
欠点
　精度の低下
　※ただし、実際の問題では倍精度(64bit)を単精度(32bit)にしても精度は変わらない。

量子化する際は、極端に精度が落ちない程度に量子化をしなければならない。


#### 蒸留
学習済みの精度の高いモデルの知識を軽量なモデルへ継承させる
蒸留は教師モデルと生徒モデルの2つで構成される
教師モデル
　予測精度の高い、複雑なモデルやアンサンブルされたモデル
生徒モデル
　教師モデルをもとに作られる軽量なモデル



#### プルーニング
寄与の少ないニューロンの削減を行い、モデルを圧縮する。
ニューロンの削減の手法は重みが閾値以下の場合ニューロンを削減し、再学習を行う
例：重みが0.1 以下のニューロンを削減

## 応用モデル
### MobileNet
画像認識のネットワーク
ディープラーニングモデルは精度は良いが、その分ネットワークが深くなり計算量が増える。
計算量が増えると、多くの計算リソースが必要で、お金がかかってしまう。
ディープラーニングモデルの軽量化・高速化・高精度化を実現(その名の通りモバイルなネットワーク)
Depthwise ConvolutionとPointwise Convolutionの組み合わせで軽量化を実現する

### DenseNet
画像認識のネットワーク
ニューラルネットワークでは層が深くなるにつれて、学習が難しくなるという問題があった。
前方の層から後方の層へアイデンティティ接続を介してパスを作ることで層が深くても学習できるようにした。
前方の各層からの出力を全て後方の層への入力に用いる。
DenseBlockと呼ばれるモジュールを用いる。
DenseBlock間はTransition Layerと呼ばれる層でつなぐ。

●DenseNetとResNetの違い
○DenseBlockでは前方の各層からの出力全てが後方の層への入力として用いられる
○RessidualBlockでは前1層の入力のみ後方の層へ入力

●DenseNet内で使用されるDenseBlockと呼ばれるモジュールでは
成⻑率(Growth Rate)と呼ばれるハイパーパラメータが存在する。
○DenseBlock内の各ブロック毎にk個ずつ特徴マップのチャネル数が増加していく時、kを成⻑率と呼ぶ

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

実際には使いづらい。
GPUではメモリが少ないなどハードウェアに依存するため、効果が追えなくなる。

### LayerNorm
全てのチャネルの平均と分散を求め正規化する。
入力データや重み行列に対して、入力データをスケールしても、出力が変わらない。
入力データや重み行列に対して、重み行列をスケールやシフトしても、出力が変わらない。

### WaveNet
生の音声波形を生成する深層学習モデル
Pixel CNN(高解像度の画像を精密に生成できる手法)を音声に応用したもの
時系列データに対して畳み込み(Dilated convolution)を適用する
層が深くなるにつれて畳み込むリンクを離すDilated causal convolutionを提案した。

## Transformer
### BERTまでの流れ
Sec2Sec(Encoder-Decoder Model)
↓
Transformer
(Encoder-Decoder x Attention)
↓
BERT

### Seq2Seq
Encoder-Decoderモデルとも呼ばれる

RNNと言語モデル

### Transformer
ニューラル機械翻訳の問題点
長さに弱い

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

#### Attention
翻訳先の各単語を選択する際に、翻訳元の文中の各単語の隠れ状態を利用
query(検索クエリ)に一致するkeyを索引し、対応するvalueを取り出す操作であると見做すことができる。これは辞書オブジェクトの機能と同じである。

言語モデルとは
単語の並びに尤度（それがどれだけ起こり得るか）、
すなわち、文章として自然化を確率で評価する。

Seq2Seq
EncoderからDecoderに渡される内部状態ベクトルが鍵
隠れ状態の初期値にEncoder側の内部状態を受け取る


## 物体検知・セグメンテーション
### 物体検知
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344334/39475ac5-c843-e25f-5bbe-3c0facd75aa8.png)

画像を入力に
分類：画像に対し単一または複数のクラスラベル
オブジェクトディテクション（物体検知）：Bounding Boxを出力
セマンティックセグメンテーション：物体自体を区別する
インスタンスセグメンテーション：物体個々を区別する

#### データセット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344334/f003f226-db43-ec2d-53b1-5ce05fdfe775.png)

Box/画像
小さい：アイコン的な写り、日常感とはかけ離れやすい
大きい：部分的な重なり等も見られ、日常生活のコンテキストに近い

### セグメンテーション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344334/99e52a87-8faa-a831-5574-1270a446747c.png)

入力画像の各ピクセルに対しラベル付けをするタスク。
CNNのPoolingによって落ちてしまった解像度をUp-samplingにより元に戻す。

セマンティックセグメンテーションでは入力画像と同じサイズの出力画像の各ピクセルにクラス分類を行う。