深層学習-後編2 -応用モデル

ラピッドチャレンジで学習したことを忘れないように残そうかと。
はい。

# 応用モデル
## MobileNet
画像認識モデル。
畳み込み演算を工夫している。

一般的な畳み込みレイヤーは計算量が多い。
この計算を減らしてあげる。

Depthwise Separable Convolution (Depthwise Convolution と Pointwise Convolution) で軽量化する。

一般的な畳み込みは空間方向とチャネル方向の計算を同時に行うが、それらを個別に行う。
とはいえ、演算自体は普通の畳み込み演算と同じ。

一般的な畳み込みの演算量は
$H \times W \times K \times K \times C \times H $

- Depthwise Convolution
    フィルタは1つ。(一般的な畳み込みはM枚)
    チャネルごとに畳み込みをする。出力は入力のチャンネル数と同じ。
演算量は $(K \times K \times 1 \times H \times W \times C) $

- Pointwise Convolution
    フィルタ数はM枚、カーネルサイズは $1 \times 1 \times C$
    1x1 conv と呼ばれる。

演算量は $H \times W \times C \times M$。

上記より、MobleNet の演算量は合計 
    
$(K \times K \times \times H \times W \times C) + (H \times W \times C \times M) $

## DenseNet
画像認識のネットワーク
ネットワークの繋げ方を変えただけ。

DenseBlock の概念が登場。

DenseBlock内の各ブロック毎にk個ずつ特徴マップのチャネル数が増加していく。
１層通過するごとに、kチャンネルずつ、チャンネル数が増えていく。
kを成⻑率(growth rate)と呼ぶ。

kはハイパーパラメータ。

DensBlock - transitionレイヤー(チャンネル数を減らす) -DensBlock ...
の繰り返し。

- 出力層に前の層の入力を足し合わせる。
- 入力特徴マップに対し、下記処理で出力を計算する
    - batch正規化
    - Relu関数による変換
    - 3x3畳み込み層による処理

## DensNetとResNetの違い
両方ともスキップの概念があるんだけど。。。

- DenseBLock では前方の各層からの出力全てが後方の層の入力する。
- ResidualBlock では前１層の入力のみ後方の層へ入力する。

##正規化手法
- BatchNorm
ミニバッチ単位で正規化する。

に含まれるsampleの同一チャネルが同一分布に従うよう正規化。
H x W x CのsampleがN個あった場合に、N個の同一チャネルが正規化の単位
ミニバッチのサイズを大きく取れない場合には、効果が薄くなってしまう

HWによってバッチサイズを変えざるを得ないので、あまり使いたくない手法。
効果がよくわからなくなってしまう。

- Layer Norm
それぞれのsampleの全てのpixelsが同一分布に従うよう正規化。
Layer Norm○N個のsampleのうち一つに注目。
H x W x Cの全てのpixelが正規化の単位。

- Instance Norm
各sampleの各チャネルごとに正規化。

## Wavenet
音声生成モデル。

生の音声波形を生成する深層学習モデル。
Pixcel CNN を音声に応用したもの。

時系列データに対して畳み込みを適用する。
飛び飛びで畳み込み処理をする。
より長い時間のデータを取り込める。
(Dilated casual convolution)

# Transformer
Encoder-Decorde x Attention

Encorder-Decorder モデルなどのニューラル機械翻訳は、長さに弱い！
Attention（注意機構）を導入する。

RNNを使わず、Attentionを使用する。
単語の位置情報を保持する。(Position Encording)

## Attention
Attention とは、query - key - value から構成される辞書オブジェクト。

weightValuequery(検索クエリ)に一致するkeyを索引し、対応するvalueを取り出す操作であると見做すことができる。

下記の２種類ある。
- ソース・ターゲット注意機構(Source Tearget Attention)
- 自己注意機構(Self Attention)

## Transformer-Encorder
Attention により文脈を考慮して各単語をエンコードする

## Self-Attention
入力を全て同じにして学習的に注意箇所を決めていく。
今、処理している文だけを対象にする。

## Position-Wise Feed-Forward Networks
位置情報を保持したまま順伝播させる。

- 2層の全結合NN
- 線形変換 -> ReLu -> 線形変換

## Scaled dot product attantion
全単語に関する Attentionをまとめて計算する。
softmax関数を使う。

## Multi-Head attention
Scaled dot product attention を合体させて出力する。

重みパラメータの異なる8個のヘッドを使用する。
8個のScaled Dot-Product Attentionの出力をConcat(結合)する。

## Decorder
Encorderと同じ6層持つ
注意機構(Attention)の仕組みは Encorderとほぼ同じ。
２種類の注意機構を使う。

## 自己注意機構
- 生成単語列の情報を収集する。
- 未来の情報を見ない様にマスクする。
- Encorder-Decorder attention
    - 入力文の情報を収集する。

## Add & Norm (学習のテクニック)
### Add (Residual Connection)
- 入力の差分を学習させる
- 実装上は出力に入力をそのまま加算する。
- 学習・テストエラーの低減ができる。

### Norm (Layer Normalization)
- 各層においてバイアスを除く活性化関数への入力を平均0, 分散1に正規化する。
- 学習の高速化ができる。

## Position Encording
単語列の語順情報を追加する必要がある


# 物体検知・セグメンテーション

## 物体認識タスク
- 分類 (Classification)
画像に対し、単一または複数のクラスラベルつける

- 物体検知 (Object Detection)
Bounding Box (どこに物体があるか？)

- 意味領域分割 (Semantic Segmantation)
各ピクセルに対して単一のクラスラベルをつける。
何がどこにあるか？

- 個体領域分割 (Instance Segmantation)
各ピクセルに対して単一のクラスラベルをつけるSSから更に、個々の分類ができる。

## DATASET
目的に応じてデータセットを選ぶ必要がある。
データセットの指標は下記がある。

- クラス数
- Training + Validation の数
- Box数(いくつ物体が存在するか？多いと現実世界に近い。)

## 評価指標

- True-Positiove/False-Negative/True-Negative/False-Negative

```math
Precision = \frac {TP}{TP + FP} \\
Recall = \frac {TP}{TP + FN}
```

閾値で True/False は変わる。

### IoU : Intersection over Union
物体検出においてはクラスラベル(物体が検出できているか？)だけでなく、物体位置の予測精度も評価したい！
Jaccard係数で表せる。

```math
IoU = \frac {TP}{TP+FP+FN}
```

TP : 本来の枠位置と検出した枠位置が一致している領域
FP : 本来の枠位置だが、検出されていない領域
FN : 本来の枠位置と外れている検出した枠の領域

confidence と IoU を合わせて正しく検出できているかどうか、判断する必要がある。

### mAP (mean Average Precision)
クラス毎に Precisionを計算して平均した値。
IoUを 0.5で固定したもの。

MS COCO ($mAP_{COCO}$) という指標がある。これは位置を厳密にチェックするということになる。

FPS : 検出速度

## 物体検知のアルゴリズム
2段階検出器
位置を出してから、それは何？と判断する。

- 精度が高い。
- 計算に時間がかかる。

1段階検出器

- 精度がひくい
- 検出が早い。

## SSD (Single Shot Detector)
One Stage Detector (一段階検出)
VGG16 と基本的構造は同じ

デフォルトボックスを用意して、そのデフォルトボックスの形を変えて検出枠にする。
検出した枠に対して、各クラスの confidence を持つ。

特徴マップは解像度が変わっている。
物理的な画像サイズが変わっている訳ではない。

多数のデフォルトボックスを用意したことによる弊害を回避する方法
- Non-Maximum Suppression
    いっぱい検出した枠がある。Confidence で選択する。
- Hard Negative Mining
    背景として誤って判断される。Negativeを減らす。

損失関数は、Confidenceに対して計算する事になる。

DSSDはベースネットワークをVGG16 ではなく、ResNetを使用している。

## Semantic Segmentation
共通する壁
解像度がどんどん落ちていくという問題がある。
解像度を落としたものを元にどうやって戻していくか？

解：Up-sampling

Pooling しなければいいんじゃね？
→ イヤイヤ。そうでなくて。深い convolutiionするとあれでしょ？

Up-sampling の方法として、下記がある。
- Deconvolution/Transposed convolution
- Unpooling

### Deconvolution/Tranposed convolution
演算の手順は下記。

1.  特徴マップのpixel間隔をstrideだけ空ける
1.  特徴マップのまわりに(kernel size - 1) - paddingだけ余白を作る
1.  畳み込み演算を行う

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

U-Netが有名。

### 受容野を広げる工夫
Dilated Convolution がある。

# 機械翻訳の評価指標
## BLEU
機械翻訳が参照翻訳より短い場合にペナルティを与え、機械翻訳が参照より長い場合はペナルティは与えない。
BO(brivity penalty)

```math
BP = exp(1-\frac{r}{c})
```

r: 参照翻訳の長さ
c: 機械翻訳の長さ