E資格対策 深層学習

# はじめに

E資格認定講座の受講レポートです。E資格の受験を検討されている方、E資格に向けて勉強中の方の参考になればという思いで公開することにしました。

# DAY1

## ニューラルネットワークの全体像

※以降ニューラルネットワークをNNと記載する

前提として識別モデルを考える。NNは入力層、中間層、出力層から成り立ち、入力値が適切な値に変換されるように**重み**と**バイアス**を学習する

### 誤差関数
NNに入力 $\vec{x}$ を与えて得られた出力 $\vec{y}$ と訓練データ $\vec{d}$ との比較
NNの学習には誤差関数を使用する

### ニューラルネットワークでできること

NNは回帰にも分類にも使える。何かしらの**数値**を入力して何かしらの**数値**を出力する。
文字（文章）や音声などを含む数字として扱えるもの全てに対して使用できる。また、（一般的に）**4つ以上の中間層を持つニューラルネットワーク**を**深層ニューラルネットワーク**と呼ぶ。

## Section1） 入力層〜中間層

$\vec{w}$ （重み）は入力をどの程度の割合で使用するかを表す。重み（傾き）とバイアス（切片）が決まれば一次関数の式は一つに絞られるため、重みとバイアスがニューラルネットワークの重要な要素となる。

![E資格_DNN_レポート-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326104/d9296aec-a187-dd72-f9fa-f5314efa1a16.jpeg)

![E資格_DNN_レポート-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326104/cff61bcd-3a46-0d9b-015e-8b3b8997ee76.jpeg)

## Section2） 活性化関数

次の層への出力の大きさを決める**非線形**の関数

![E資格_DNN_レポート_活性化関数01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326104/4259e85d-2bd6-cb9e-82b1-075c1f16c8b1.png)

**非線形関数**を通すことでより**バラエティのある出力**を作り出すことができる

### 中間層用の活性化関数
①ステップ関数
　出力は常に1か0。線形分離可能なものしか学習できない。
②シグモイド関数
　なだらかに上昇する関数のため微分を利用することができ学習をうまく進めることができるようになる
　課題：勾配消失問題
③RELU
　勾配消失問題がある程度解消される
　入力値が0より小さい時に出力が常に0になることからスパース化できる特徴がある
　スパース化によりモデルがシンプルになる

### 誤差関数

NNの出力と訓練データのラベルを比較しどのくらい合っていたかを数値的に表したものが誤差関数である。

## Section3） 出力層

### 中間層と出力層の役割
中間層
　入力された値からいい感じの**情報を抽出する**ために用いられる
　どの値が重要か、どの値が特によく使用されるか中間層から次の層へ伝えていく
出力層
　欲しい値の出力
　中間層までで求められた値を使いやすい形に比率保持したまま変換する
　分類の場合：0〜1の範囲の確率、総和が1（100%）

### 出力層で使用される活性化関数

問題（タスク）によって出力層で使用する活性化関数と誤差関数は決まる（スライド参照）

## Section4） 勾配降下法

### 勾配降下法

NNを学習させる方法。深層学習の目的は誤差を最小化するようなパラメータ $\vec{w}$ と $b$ を発見することである。各学習ごとに誤差を減らす方向にパラメータを調整することで学習が進むにつれて徐々に誤差が減っていき最終的に最適解に辿り着く。最適解への収束の仕方は学習率εで決まる。εを適切に設定することで学習がスムーズに行われる。

学習をうまく進めるための手法として、Momentum、AdaGrad、Adadelta、Adamなどがあり、これらの手法は学習率の制御を改良する。詳細はDAY2参照。

![E資格_DNN_レポート 2021-01-11 14-51-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326104/a31e6b26-b46f-d540-28b2-7ea73f5d4507.png)

#### 勾配降下法におけるパラメータの更新

![sgd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326104/90c9e2ea-dc8a-06e5-3ca4-5fa20baf996b.png)

### 確率的勾配降下法（SGD）

学習に使う全データから一部分だけを使って学習を進めていく
より最適な答えを見つけることができる

### オンライン学習とバッチ学習

オンライン学習
　モデルに都度少しずつデータを与えてその結果を学習（パラメータを更新）する
　徐々に／リアルタイムに集まってくるデータに対して学習を行うことが可能になる

バッチ学習
　全てのデータから得られた誤差を学習の時に使用する
　データの量が多いとメモリに載せることが難しくなるという課題がある

### ミニバッチ勾配降下法

オンライン学習の特徴をバッチ学習で使えるようにした手法で、深層学習でよく使用される。データをミニバッチ（小分け）に分割して学習することで、メモリに乗らないようなデータの効率的な学習が可能になる。分割した個数に応じて全体の誤差の平均をとる。ミニバッチを利用することで同時並行で学習（計算）を行える（SIMD、Single Input Multiple Data）。



## Section5）誤差逆伝播法

$∇E = \frac{∂E}{∂w}$

重みの変化量を微分を使用して導き出す。

### 数値微分

m番目の重みを $w_m$ とした場合

$\frac{∂E}{∂w_m} = \frac{E(w_m + h) - E(w_m - h) }{2h}$

$w_m + h$ , $w_m - h$ を繰り返し計算することは計算量が多くなり負荷が大きい

無駄を省くことで計算の負荷を抑えつつ各 $w$ の更新量求めることができる方法が**誤差逆伝播法**である

### 誤差逆伝播法

それぞれの重みの変更量を次々前の計算で再利用していく。この再利用は微分の連鎖律を用いることで実現される。

ある重み $w$ を学習させるには誤差関数の値を元にどのぐらい調整しないといけいかを計算する必要がある。その際に誤差関数 $E$ の $w$ による微分を求める必要があり、この微分は微分の連鎖律を用いて $E$ から $w$ までの道のりをたどり掛け合わせることで求めることができる。

## ディープラーニングの開発環境

ディープラーニングの開発環境はクラウド（データセンターの間借り）とローカルに大別され、下記のハードウェアが使用される。

**使用されるハードウェア**

CPU、GPU、FPGA、ASIC、TPU

左から順に徐々に計算速度が速くなる。TPUは機械学習のモデルを計算するためだけに作られたプログラム不可の計算機でGoogleなどからクラウド上で提供されているものを利用するのが一般的である。GPUで実験を行い、その後より高速なTPUなどでモデルを作成する方法が主流。

## 入力層の設計

[0, 0, 1] のように一箇所だけ1が設定されているようなベクトルをone-hotラベルと呼ぶ。
入力値のうち値が定かでない部分は欠損値といい取り除くことが望ましい。

生のデータをNNに与え出力を得ることが理想的で、この人間の手が介入しないネットワークをエンドTOエンドと呼ぶ。エンドTOエンドは色々なデータへの適応がやりやすくなる利点がある。現実的にはあるNNの結果を別のNNに使用するケースがままあるが、前段階の結果に依存してしまうため可能な限り一貫した学習を行うようにしたほうがよい。

#### 入力値の悪い例

背番号など単に番号が振られただけのデータは数値データとして扱えない。また、例えばアンケート結果の場合「どちらでもない」と「無回答」に同じ値を割り当てることは見分けがつかなくなるため悪い例と言える。one-hotラベルを用いることで確実に（間違いなく）表現することができる。one-hotラベルは距離の関係のないデータに対して有効である。

#### 欠損値の取り扱い方法

入力として採用しない → 欠損地を含む**列（カラム）**を使用しない
欠損地を含む集合を除外 → 欠損地を含む**行**を使用しない

#### 正規化と正則化

正規化：0〜1の値に揃える
正則化：平均が0、分散が1の正規分布に揃える

## 過学習とドロップアウト

過学習は巨大なNNで（早い段階から）発生しうる事象で、学習用データに対しての性能が高く、テスト用データに対しての性能が低くなっている状態である。過学習を防ぐ方法としてドロップアウトという手法が存在する。

#### 過学習
　未知データに対しての誤差が大きい状態
　入力値が少なく、ニューラルネットワークが大きい（自由度が高すぎる）場合に起きやすい
　正則化（自由度を制約する）で抑制することができる

#### ドロップアウト
　ランダムにネットワークを切断することでネットワークにバリエーションを持たせデータが増えたような状態を作り出すことで過学習を防ぐ

# DAY2

## 深層学習全体像の復習 - 学習概念

ニューラルネットワーク
　入力層（データ）と出力層（欲しい情報）の間がNNのモデル
　繰り返し学習を行うことで、欲しい情報を出力するように重みとバイアスが自動で調整される

誤差関数
　計算結果と教師データの付き合わせ
　微分の連鎖率を用いたフィードバック（逆伝播）で重みとバイアスを調整

NNは中間層を増やすと複雑な入力データをうまく処理できるが、層を増やすことで勾配消失問題が生じることがある

![E資格_DNN_レポート 2021-01-11 14-52-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326104/e4cb1a6e-f0fe-0fd6-bb16-d54e9f81e24f.png)

## Section1） 勾配消失問題について

### 勾配消失問題
　誤差逆伝播（学習）がうまくいかなくなる原因の一つ
　中間層が増えた時に逆伝播で伝播される情報量が少なくなる
　各々の重みが更新されなくなり学習がうまくいかなくなる

### 勾配消失問題が起きる理由

①微分の式が増える
　微分値は0から1の範囲をとることが多いためかけ続けると値が小さくなり勾配が消失する

②活性化関数の微分結果
　シグモイド関数の微分の最大値は0.25

中間層が100あるとすると微分の結果（シグモイド関数の場合最大0.25）が100回出てくるため、入力層側の情報はほぼ0になり、学習が行われなくなる。

### 活性化関数

ReLU関数は勾配消失問題の回避とスパース化に対して良い成果をもたらしている。

スパース化　
　必要な重みだけ選択的に残る
　モデルの効果的な動きを自力で見つけられる

ReLU関数の場合、0以下の場合は常に0（微分結果も0）、0より大きい場合は微分結果が1となる。そのため、1で伝播される（伝播される情報が積極的に使用される）か何も伝わらない（重みが役に立たなたいめ全く使われない）かのどちらになる。

### 重みの初期値の設定方法

重みは入力されたデータをさまざまな角度（見方）から処理するためにランダムな値で設定することが望ましく乱数を用いて初期化することが多い。

#### 正規分布で初期化した場合の課題

![E資格_DNN_レポート 2021-01-11 14-52-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326104/1f7c97fc-7a86-3e7b-eaab-80f6a373a1fe.png)

標準正規分布の場合、各レイヤーの出力が0と1に偏り結果的にシグモイド関数の微分がほとんど0になる。そのため勾配消失が発生し、誤差逆伝播がうまくいかなくなる。

正規分布の標準偏差を極端に小さくすることで勾配消失問題は発生しづらくなるが、活性化関数を通した後にもかかわらず各レイヤーの出力が0付近に集中し、表現が大きく損なわれる課題が生じる（NNとしての効果がなくなってしまう）。

#### XavierとHe

正規分布を使用した際の課題を解消するための工夫としてXavierやHeで初期値を設定する

Xavier

* 極端な値の出力がなくなり、丁度いい重みの初期化ができる
* S字カーブになっているシグモイド、tanhなどの活性化関数に対してうまく働く
* 標準正規分布の値を前の層のノード数の平方根で割った値で初期化する

He

* ReLu関数に対して有効な初期値の設定方法
* 標準正規分布の値を $\sqrt{\frac{2}{n}}$ で割った値で初期化する

### バッチ正規化

NNを学習する時、ミニバッチという小さな固まりにデータを分割して学習を進める。ミニバッチの単位をもとに学習データをうまく制御する工夫がバッチ正規化である。ミニバッチに対して正規化を行うことで極端なばらつきをなくすことができる。

### バッチ正規化の数学的記述

通常の統計的な正規化と同様の手順で平均と分散の算出と正規化を行う。最終的に求めたいNNで扱いやすいように値を調整する $y_m$ （変倍・移動） と合わせて正規化された値を使用することでミニバッチに対しての正規化を行うことができる。

## Section2） 学習率最適化手法について

### モメンタム

前回の重みと慣性を用いて重みの更新を行う。進みが良い方向に一気に進むため、大域最適解の近辺に辿り着くまでの時間は早いが、最後の止まりが悪く動き続けるため最終解になかなか辿り着けない傾向がある。

### AdaGrad
重み一つ一つの調整量を意味するhを重みの更新に使用する。hは最初適当な値で初期化され、勾配の二乗を保持していくためこれまでの学習結果を蓄えることが可能になる。勾配の緩やかな斜面に対して適している最適化手法である。ただし、いずれの方向に進んでも学習の進めが変わらないような点（鞍点）にはまり抜けられない課題がある。このことを鞍点問題と呼ぶ。

### RMSProp

Adagradの鞍点問題をスムーズに解消できるようにした進化系。前回の経験をどのくらい活かすかをパラメータαで調整し、重みの更新を行う。Adagradと比べるとハイパーパラメータの調整が重要ではない。

### Adam

進みが良い方向に一気に進むモメンタムの特徴と前回の経験を活かす手法であるRMSPropを合体させた方法がAdamである。

## Section3） 過学習について

未知データに対しての誤差が大きい状態を過学習と呼ぶ。入力値が少なく、ニューラルネットワークが大きい（自由度が高すぎる）場合に過学習が起きやすい。

過学習は、特定の重みが大きすぎる（過大評価されている）時に起きる。重みが大きすぎることで一部の入力データに対して極端な反応を示しているためである。そのため、極端な重みや高すぎる自由度を抑制する正則化項を追加することで過学習を抑えることができる。

正則化項の式：$\frac{1}{p}λ||x||_p$

λ：ハイパーパラメータ

### L1正則化

![l1norm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326104/f453c870-c7c3-5bec-f751-d254b5560bce.png)

### L2正則化

![l2norm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326104/ce7cf02a-d21c-25e4-3456-06dc27c4e8a5.png)

### ドロップアウト

ドロップアウトはランダムにネットワークをすることでネットワークにバリエーションをもたらすことで過学習を防ぐ方法である。データが増えたような状態を作り出すことで学習の進み（正答率の上昇速度）が遅くなり、学習データにフィットしすぎることを抑制する。

## Section4） 畳み込みニューラルネットワークの概念

### CNNの概念

CNNは主に画像に使用されることが多いが、次元間で繋がりのあるデータであれば他のデータにも使用できる。

### 畳み込み層の特徴

全結合だと縦・横・チャンネルの情報が混在してしまうが、畳み込みそうの場合周囲のデータとの繋がり（次元間の繋がり）を活用しながらデータを読み取れる（特徴量の抽出が行える）。

### 畳み込み層の処理の流れ

①パディング
②フィルター
③バイアスとの足し算
④活性化関数

①パディング

畳み込み処理を繰り返すと画像が小さくなりすぎたり、31など2進数で表現した際に中途半端な数値のサイズになったりすることがある。そのため、フィルターを通す前に何ピクセルかずつ全方向に入力画像を広げることで出力のサイズを調整する。パディングには広げたピクセルを「0で埋める」方法と「1番近いところの数字で埋める」方法の主に2種類が用いられる。

②フィルター

フィルターは全結合での重みにあたる。フィルターの1つ1つの値が重み（個性）を表す。フィルターの数を**チャンネル**と呼び、フィルターをどれだけ1度にずらすかは**ストライド**で定義される（ストライド1の場合、1つずつずらして出力値を計算する）。

### プーリング層

畳み込みと組み合わせて使われることが多い。重みは使わずに処理する。最大値を使用するMaxプーリングと平均値を使用するAverageプーリングが存在する。

## Section5） 最新のCNN

### AlexNet

5層の畳み込みそう及びプーリング層などとそれに続く3層の全結合層から構成される画像認識のモデル。蚊学習を防ぐために全結合層の出力にドロップアウトが使用されている。

#### 全結合層の種類
Flatten：横方向に並べる（初期のNNではよく使用されているが、出力サイズが大きくなる傾向にある
Global Max Pooling：1番大きいものを使用する
Global Avg Pooling：平均を使用する

# DAY3

## Section1） 再帰型ニューラルネットワークの概念

RNN（Recurrent Neural Network）とは時系列データに対応可能な再起構造をもつニューラルネットワークである（再起構造：数珠つながりで前のものにつながっていく構造）。音声データ、株価データなどが時系列データに当たる。またテキストデータ（自然言語）も単語一つ一つをある時点のデータとして扱うことで、時系列データとして捉えることができる。他のNNと同様に入力層、中間層、出力層の基本構造をもつ。CNNが**次元的つながり**を持つデータに使用されるNNであることに対して、RNNは**時間的つながり**を持つデータに使用されるNNである。また時間的つながりは中間層の出力を中間層に戻す（前の時間の出力を利用する）ことで実現される。

### RNNで学習する3種類の重み

①入力層→中間層
②中間層→出力層
③中間層→中間層（前の中間層からの出力に対しての重み）

### BPTT

RNNではBPTT（Back Propagation Through Time）という方法を用いてパラメータを調整する。BPTTは誤差逆伝播の一種である。RNNは時系列を遡れば遡るほど、勾配が消失していく勾配消失問題や逆に勾配が増大していく勾配爆発問題などの課題がある。これらの課題は後述のLSTMを用いることで解決できる。

concatenateを行うことで、両方の特徴量を保持した状態でベクトルの結合を行うことができる

## Section2） LSTM

LSTMはCECの周りに学習機能を配置することで、考えることと記憶することの分離を可能にする。

### LSTMの主要素

①CEC
②入力ゲート
③出力ゲート
④忘却ゲート

①CEC：過去の情報の溜め込みによる勾配消失や勾配爆発の問題を解決するため勾配を1にする。記憶機能だけをもつ。

②入力ゲート：入入力データをどのような感じで覚えるかをNNで学習し、CECに指示を出す。

②出力ゲート：CECに記憶された情報を取り出して出力を作る。どんな感じにCECの出力を利用するか学習する。

**CEC、入力ゲート、出力ゲートを組み合わせることで全体として学習機能を持つ**

入力ゲートと出力ゲートは今回の入力をどのくらい判断材料に使用するかを表す重みwと前回の出力をどのくらい使用するかを決めるuの二つの重みを学習する。

![E資格_DNN_レポート 2021-01-11 14-52-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326104/dd1b03e3-59ec-0ef7-dbd4-17ceb8e0234d.png)

④忘却ゲート：出力ゲートはCECに残っている情報をどのくらい使うかを学習するためCECに情報が残っている限りは古い情報が使われる可能性がある。忘却ゲートはある時点で古いデータをクリアするために使用される。

### 覗き穴結合

現在のCECの状態を学習に使用する試み。大きな改善は見られなかった。

## Section3） GRU

LSTMにはパラメーター数が多く計算負荷が高いという課題がある。GRUはパラメータを削減し、LSTMと同等の精度を望むことができる構造で計算負荷が低いというメリットがある。GRUはリセットゲートと更新ゲートから成り立ち、計算の状態は隠れ層 $h(t)$ に保持されていく。リセットゲートはどのような状態で情報を保持しておくかを学習し、更新ゲートは現在の記憶と前回のを利用してどのように出力を得るかを学習する。

## Section4） 双方向RNN

双方向RNNは過去の情報だけでなく、未来の情報を加味することで精度を向上させるためのモデルである。機械翻訳などで使用され、ある時点までの単語と以降の単語を利用することで精度の向上を実現させる。順方向で伝播した時の中間層表現と逆方向に伝播した時の中間層表現をあわせたものが出力（特徴量）となる。

## Section5） Seq2Seq

2つのネットワークがドッキングしたモデルで自然言語処理、機械翻訳に用いられる。エンコーダーが入力値に保持された文脈の情報（意味ベクトル）を抽出し、別のNN、デコーダに抽出した情報を渡す。デコーダーは別の表現（例.別言語への翻訳）で出力する。デコーダーの機能はある時系列データから別の時系列データを出力することである。

### HERD

Seq2Seqは会話の文脈無視で応答がなされ1問1答しかできない。HREDは過去の文脈を次のRNNに引き継ぎ、過去の文脈を応答に加えることでより文脈に沿った人間らしい一文を作り出すことができる。しかしHREDは単調な解答をしがちという課題があり、この課題をVAEの潜在変数の概念を追加することで解決した構造がVHERDである。VHREDは文脈を意識しながら文を生成し、より応答にバリエーションを持たせることができる。

## Section6） Word2vec

単語の分散表現ベクトル（Embedding表現）を得る手法の一つ。RNNでは、単語のような可変長の文字列をNNに与えることができず固定長形式で単語を表す必要がある。Word2Vecには大規模データの分散表現の学習を現実的な計算速度とメモリ量で実現可能にするというメリットがある。

## Section7） Attention Mechanism

RNNは中間層（隠れ層）の大きさが入力値が短くても長くても同じ大きさで可変調の単語に対応しておらず、Seq2Seqは長い文章に対応できない。入力と出力のどの単語が関連しているのかの関連度を学習する仕組みがAttention Mechanismで自力で重要な単語を見極め重要な情報を抽出することができる。

# DAY4

## Section1） 強化学習

教師あり学習・教師なし学習がデータの特徴を見つけるのに対し、強化学習は目的を達成できるような方策を見つける。強化学習により今まで労働者の経験値が必要だった部分をコンピュタに覚えさせることが可能になり、人材の育成が不要になることやより効率的な手法が見つけ出されることが期待される。

ランダムに動く（未知の行動をとる）ことと過去の経験／データに基づいて動くことはトレードオフの関係にあり、両者の割りが強化学習のモデルの訓練においては重要になる

強化学習は方策関数と価値関数の2つを学習する。価値関数には行動価値関数と状態価値関数があり、最近は主に行動価値関数が使用されることの方が多い。

計算速度の進展と関数近似法とQ学習の組み合わせる手法の登場が近年の強化学習の発展に寄与している。
※関数近似法：InputとOutpuの対応表（価値関数や方策関数）を関数に近似する手法。関数に近似することでNNで学習することが可能になる。
※Q学習：行動価値観数を学習する手法

### 価値関数

状態価値観数が状態のみの価値に注目するのに対して行動価値関数は状態と行動を組み合わせた価値に注目する。最近の主流であるQ学習では行動価値関数が用いられている。

### 方策関数

価値観数の出力を最大にするような行動をきめる。

## Section2） AlphaGo

PolicyNetと呼ばれる方策関数とValueNetと呼ばれる価値関数を用いて強化学習を行う。また、より高速に着手確率を出すための方策関数として、RollOutPolicyと呼ばれる手法も用いられる。RollOutPolicyはPolicyNetと比べると計算速度が1000倍速く、教師あり学習で使用される。

### 学習ステップ

①教師あり学習によるRollOutPolicyとPolicyNetの学習
　人間が打った手を模倣するように学習する。
②強化学習によるPolicyNetの学習
③強化学習によるValueNetの学習

### モンテカルロ木探索
強化学習の学習手法で、価値関数の学習に使用される。この学習の過程でRollOutPolicyが使用される。

### AlphaGo（Lee）とAlphaGoZeroの違い

* 強化学習のみで作成
* ヒューリスティックな要素（人間が学習に役立つだろうと思って加えた要素）を排除。石の配置のみ。
* PolicyNetとValueNetを一つのネットワークに統合
* ResidualNetを導入
* モンテカルロ木探索からRollOutシュミレーションをなくした。

### Residual Network

ショートカット（深さを抑えるルート）を用意することで勾配消失・勾配爆発が起きづらくなる効果を狙ったネットワーク。ショートカットが加わることで、ルートの組み合わせが増え層数の異なる様々なネットワークが作成されアンサンブル効果（副作用）が得られるという説もある。

## Section3) 軽量化・高速化技術

コンピュータの性能の向上よりはるかに速いペースでモデルが複雑になっているため
→並列化や分散により処理を高速化することが不可欠

### データ並列化

データを並列化する際の（親）モデルへの学習の反映・パラメータ更新の方法として同期型と非同期型がある。主流となっているのは同期型である。

#### 同期型
全てのワーカの計算が終わるのを待ち、平均を計算しパラメータを更新する。全てのワーカの結果が取り入れられるため汎用的なモデルが作られる傾向にある。データセンターなどワーカの処理がある程度制御できる場合に用いられ、精度は後述の非同期型よりいい。

#### 非同期型
各ワーカはお互いの計算を待たずに、各子モデルごとに更新を行う。処理スピードは早いが、最新のモデルのパラメータを利用できないため学習が不安定になりやすい。世界中のスマホで学習するする場合など処理の終了のタイミングが不確定な場合に適している。

### モデル並列化
一連のモデルを分割して、分割されたそれぞれのモデルをワーカに学習させる手法。ネットワークが枝分かれしている部分で分ける（横方向に分ける）のが主流。PCが別の場合モデルの集約に時間がかかるため、一台のPCで完結する場合に使用されることが多い。大きなモデルあるほど、スピードアップの効率が向上し、小さなモデルでは分割の効果が薄らぐ。

### 量子化

小数をコンピュータで表すことを量子化といい、NNの場合重み（パラメータ）を何ビットの浮動小数点小数で表すかを量子化の程度という。

16bit：半精度
32bit：単精度
64bit：倍精度

機械学習、特にNNの場合、大半のケースで半精度で十分である。多少制度が悪くても高速な演算が行えるため有効な手段であるといえる。

現在の機械学習では同じ16ビットや32ビットの浮動小数点でも整数分と小数部の割合を変える工夫もなされている。

### 蒸留

精度の高い大きなモデルから軽量なモデルを作成すること。精度の高い学習済みモデルを教師モデルとし、教師モデルに近い精度で軽量である生徒モデルを作成することが目的である。教師モデルと生徒モデルそれぞれに入力値を与え、誤差を算出し、教師モデルに近づくように生徒モデルを学習する。教師モデルは学習済みでパラメータも固定されるため、更新されるのは生徒モデルのパラメータのみである。

### プルーニング

モデルの精度に寄与が少ないニュー流音を削除することでモデルの軽量化を目指す手法である。具体的には重みがある閾値より小さい場所を消す（重みを0とみなす）し再学習を行う。

## Section3) 応用技術

### MobileNet

画像認識モデルを軽量化したもの。PointWiseConvolution と DepthWiseConvolutionという二つの畳み込み演算の工夫が施されている。DepthWiseConvolutionはフィルター数を1に固定し、入力と同じチャンネル数を出力する（計算量：K x K x C x H x W）。PointWiseConvolutionは任意のMチャンネルの1x1のフィルターを用いて学習を行う（計算量：C x M x H x W）。一般的な畳み込みの計算量が H x W x K x K x C x M と掛け合わせであるのに対し、MobileNetではDepthWiseとPointWiseの足し合わせ（K x K x C x H x W + C x M x H x W）になるため計算量が削減される。

※K：フィルターのサイズ、C：チャンネル数、M：フィルター数

### DenseNet

DenseBlockと呼ばれるモジュールを用いた画像認識のネットワークである。DenseBlockでは通常の入力画像に前のレイヤーで計算された結果が足し合わされたものがそれぞれの層から出力される。DenseBlockの出力はTransition Layerで特徴量の抽出を行うことで入力と同じチャンネル数に戻される／減らされる。Transition Layerでは畳み込みとプーリングを用いて特徴量の抽出を行う。ResNetのスキップコネクションが前の層1層分のみ後方の層へ足し合わされていたいのに対し、DenseBlockでは各層からの出力全てが後方の層へ足し合わされている。DenseNetにはDenseBlock内の各フィルターのチャンネル数を表す成長率と呼ばれるハイパーパラメータが存在する。

### BatchNorm

ミニバッチ単位で正規化を行う。ミニバッチのサイズはハードウェアに依存するため、実際には使い勝手が悪い。またBatch Sizeが小さいと学習が収束しないこともある。

### LayerNorm

1つの画像に対して正規化を行う。入力データのスケールや重み行列のスケール、シフトに対してロバスト（堅牢）であることが知られている。

### InstanceNorm

一つの画像中の一つのチャンネルに対して正規化を行う。画像のスタイル転送やテクスチャ合成タスクなどで利用される。

### WaveNet

CNNを用いた音声生成モデル。スキップをかませることで時間的に幅広い範囲のでデータを利用することができる特徴がある。

## Seq2Seq

系列データを系列データに変換するモデル。

変換の例
・日本語から英語への翻訳
・音声からテキストへの変換
・チャットbot（テキストからテキストへの変換）

Seq2SeqはEncoderとDecoderの二つのRNNから構成される。Encoderが入力テキストを内部状態ベクトルに変換し、Decoderが内部状態ベクトルとStart Of Sequenceから別の系列データを生成する。Decoderに教師データを与えることで、End2Endeの学習を行うことが可能になる。

EncoderとDecoderではRNNと言語モデルが使用されている。RNNは再帰型NNで出力を次の入力に使用することで系列データを学習するモデルである。言語モデルは単語の並びに確率を与え、自然な文章を出力するように学習するRNNである。

## Transformer

RNNを使用したEncoder-Decoderモデルの課題として、長さへの弱さがある。この課題を解決するために生まれたのがAttention機構である。情報量が多くなった時に何に注意を払うべきか学習的に決定する機構がAttention機構である。このAttention機構を用いて構築されたモデルがTransformerであり、TransoformerではRNNモデルは一切使用されていない。Attention機構のみを用いることで計算量が少ないという利点もある。

TransformerはEncoder、DecoderともにSelf Attentionの機構が使用されている。Self Attention機構では自身の入力情報をだけをもとにどこに重みをおくかを決定するごとができる。CNNに近い考え方で、周辺情報を加味することで文脈を反映した自己表現を得ることができる。また、TransformerではRNNを使用しないため位置情報を事前に付加する必要があり、この処理がPositionalEncodingというユニットで行われる。

## 物体検知

### 概要
画像の分類タスクが位置情報に興味がないことに対し、物体検知、セグメンテーションでは位置情報を加味した学習を行う。物体検知では位置とその位置に属するラベル、confidenceの三つの値を出力する。

### データセット
物体検知タスクでデータセットを使用する場合、目的に応じてクラス数やデータ数とともに1画像あたりのBox数の平均（Box/画像）も確認することが重要である。Box/画像が低い場合、1つの物体が画像の中心に写っている（アイコン的な写り）ことが多く日常生活とはかけ離れていることが多い。対してBox/画像の数値が高い場合、部分的な重なり等も見られる日常生活のコンテキストに近い画像がデータセットに含まれることが多い。また、クラス数が多いことが必ずしもいいとは限らず同じような画像に違うラベルがつけられただけのケースもあるため注意が必要である。

### 評価指標
物体検知タスクの評価指標としてIoUが用いられる。IoUはGround-Truth BBとPredicted BBの重なり部分をGround-Truth BBとPredicted BBのUnionで割った値である（i.e Overlap/Union）。物体検知の結果に対して、PrecisionやRecallを計算する際は、閾値を超えてかつ検出済みでない場合のみTPとする。また本来検出されるべきものが検出されない場合はFNとなる。

評価指標として用いいられるAPはP(R）の曲線の下側の面積であり、APが大きい方が良いとされている。
APは一般的にクラスごとの指標を表し、mAPがクラス数で平均を取ったものである。MS COCOで導入された指標はconfidenceだけでなくIoUの式いいも変化させることで位置についてより厳しく評価を行うようになっている。

物体検知では検知精度だけでなく検知速度も重要な指標となり、Frame Per Seconde（FPS）やInference Timeなどが検知速度の指標として用いられる。

### 物体検知のフレームワーク

物体検知のフレームワークには2段階検出器と1段階検出器があり、その違いは候補領域の検出とクラス推定を別々に行うか同時に行うかである。2段階検出器はまず候補領域を特定し、その部分を切り出した上でクラス推定を行う。こ2段階の場合精度は高いが処理に時間がかかる傾向にある。1段階の場合候補領域の検出とクラス推定を同時に行うため、推論処理が早く済みリアルタイムでの検知に適している。

### SSD

VGG16をベースにした物体検知のネットワーク構造。Default Boxを修正していくことで物体の検知を行う。SSDでは多数のDefault Boxを配置するため、一つの物体でも複数表示されたり、背景と非背景のわりありが不均衡になったりする課題が生じる。この課題に対する工夫が以下のNon-Maximum SuppressionとHard negative Miningである。

* Non-Maximum Suppression：IoUが基準値以上のBBに関してはconfidenceが高いものだけを残す。基準値以下の場合は別のものを検出していると想定される。
* Hard Negative Mining：背景と非背景の比率を1：3に保つようにNegative（背景）領域を削る

## セグメンテーション

セグメンテーションでは解像度を元の入力画像の解像度まで戻すことが重要である。プーリングにより解像度が低くなった画像を元に戻すことをup-samplingと呼ぶ。

### FCN（Fully Convolutional Network）

FCNでは全結合層の部分でCNNを用いることでheatmapの出力を可能にする。

#### Deconvolution
up-samplingの手法の一つ。ピクセル間隔を開けることと特徴マップの周りに余白を作ることにより、特徴マップのサイズを拡大することができる。逆畳み込みと呼ばれることもあるが、逆演算ではなくpoolingで失われた情報を復元することはできない。

#### 輪郭情報の補完
Poolingにより失われた輪郭情報は低レイヤー層の出力で補完される。この補完処理は要素ごとの足し算によって行われる。U-NETと呼ばれるネットワーク構造でも同様の補完処理は行われるが、U-NETの場合はチャンネル方向に結合する点が異なる。

### Unpooling
up-samplingの別の手法。Pooling時の位置情報（どこに最大値があるか）を保持しておくことで、復元の際にその位置情報を利用できるようにする。

### Dilated Convolution
Convolutionの段階で受容野を広げる工夫