ラビットチャレンジ　実装演習レポート　深層学習（後編）

# 深層学習　Day3
# 1. 再起型ニューラルネットワークの概念
## 1-A. 講義内容
**時期列データ**
時系列データとは、時間的順序を追って一定間隔ごとに観察され、相互に統計的依存関係が認められるようなデータの系列のこと。音声データやテキストデータが、時系列データに該当する。

**RNN（Recurrent Neural Network）**
RNNとは、再起型ニューラルネットワークを意味し、中間層の出力を次の中間層の入力として利用する再帰的な構造をとるため、時系列データに対応可能できる。

```math
\begin{align}
&\boldsymbol{u}^{t}=\boldsymbol{W}_{(in)}\boldsymbol{x}^{t}+\boldsymbol{W}\boldsymbol{z}^{t-1}+b \\
&\boldsymbol{z}^{t}=f(\boldsymbol{W}_{(in)}\boldsymbol{x}^{t}+\boldsymbol{W}\boldsymbol{z}^{t-1}+b) \\
&\boldsymbol{v}^{t}=\boldsymbol{W}_{(out)}\boldsymbol{z}^{t}+c \\
&\boldsymbol{y}^{t}=g(\boldsymbol{W}_{(out)}\boldsymbol{z}^{t}+c) \\
\end{align}
```

**BPTT（Backpropagation Through Time）**
BPTTとは、RNNにおけるのパラメータ調整方法の一種で、誤差逆伝搬に掲示変化の要素を取り入れた手法である。

## 1-B. 実装演習結果
サンプルコードを実行すると、誤差は下図となった。うまく収束しているようだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/8048b94a-fd4c-21ed-1871-1ea73d17acde.png)

学習率を1/10にしてみると下記となった。誤差が1と高い水準で揺れている。勾配消失であろうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/d925befd-f5df-f458-dc38-3b7b892e457e.png)

サンプルコードの中間層の活性化関数をReLUに変更してみると下図となった。誤差が乱高下しており、勾配爆発によるものか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/03158da4-9ad0-9a76-2a8b-579cbc8968b2.png)

## 1-C. 確認テスト考察
●P. 11
問
サイズ5×5の入力画像を、サイズ3×3のフィルタで畳み込んだ時の出力画像のサイズを答えよ。なおストライドは2、パディングは1とする。

回答
(5 + 1 * 2 -3)/2 + 1 = 3
よって3x3

●P. 23
問
RNNのネットワークには大きくわけて3つの重みがある。1つは入力から現在の中間層を定義する際にかけられる重み、1つは中間層から出力を定義する際にかけられる重みである。残り1つの重みについて説明せよ。

回答
中間層から、次の時刻の中間層への入力を定義する際の重み。RNNでは中間層からの出力の一部は、再帰的に次の時刻の中間層への入力となるようにノードが連けるされている。

●P. 36
問
連鎖律の原理を使い、dz/dxを求めよ。
z = t<sup>2</sup>
t = x + y

回答
dz/dxは連鎖率より、(dz/dt)(dt/dx)と書けるので、
dz/dt = 2t
dt/dx = 1
したがって
dz/dx = 2t

●P. 45
問
下図のy<sub>1</sub>をx・z<sub>0</sub>・z<sub>1</sub>・w<sub>in</sub>・w・w<sub>out</sub>を用いて数式で表せ。
※バイアスは任意の文字で定義せよ。
※また中間層の出力にシグモイド関数g(x)を作用させよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/4578f408-5efc-174f-9edf-73016845b0c8.png)

回答
y<sub>1</sub> = g(w<sub>out</sub>(wz<sub>0</sub> + w<sub>in</sub>x<sub>1</sub> + b) + c)

## 1-D. 関連記事レポート

# 2. LSTM
## 2-A. 講義内容
**LSTM**
BPTTにおける重み更新の際、時系列を遡れば遡るほど勾配が消失していくため、長い時系列の学習が困難であった。全結合ネットワークやCNNでの対応とは異なり、ネットワーク全体の構造を変化させることで勾配消失問題の解決を目指し、生まれたのがLSTMである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/01f122de-623c-e4b2-284c-b40b15d307d6.png)
講義資料より

**CEC**
中間層で中心部分に配置されたノード。LSTMでは、考える機能とこれまでの入出力を記憶する機能を分離して扱っており、CECは記憶機能を担当している。そのため、入力データについて時間依存度に関係なく重みが一律となっており、CEC単体では考える＝学習することができない。そこで、CECの周囲に学習機能を持った、入力ゲートや出力ゲートを配置して、CECに対して何を記憶させるか、CECが記憶した内容をどう使うかを制御している。

**入力ゲートと出力ゲート**
入力ゲートと出力ゲートは、それぞれCECに対して何を記憶させるか、CECが記憶した内容をどう使うかを制御している。各ゲートへの入力は時刻tの中間層への入力と、時刻t-1の中間層からの出力で、各ゲートからの出力は内積演算ユニットに対して行われる。各ゲートへの入力値の重みを、重み行列W,Uで可変可能とすることで、学習機能を実現しCECの課題を解決している。

**忘却ゲート**
CECは記憶機能をつかさどっているが、過去の情報が要らなくなった場合でも、情報を削除することはできないため保管され続けてしまう。そこで、過去の情報が要らなくなった場合に、そのタイミングで情報を忘却する機能をもった忘却ゲートが導入された。

**覗き穴結合**
CEC自身の値は、ゲート制御に影響を与えていないため、CECに保存されている過去の情報を任意のタイミングで他のノードへの伝播・忘却させることはできない。そこでCEC自身の値に、重み行列を介して伝播可能にした構造が覗き穴結合である。この試みは失敗に終わっている。

## 2-B. 実装演習結果
通常のRNNを用いると、some of them looks likeに続き単語はetと予想された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/54036f2d-0f20-1f83-0f21-d2834d8813cb.png)


## 2-C. 確認テスト考察
●P. 62
問
シグモイド関数を微分した時、入力値が0の時に最大値をとる。その値として正しいものを選択肢から選べ。

回答
シグモイド関数は、f(x) = 1/(1 + exp(-x))の式で表現できる。ここで、X = 1 + exp(-x)とおくと、
連鎖率より、
df(x)/dx = {d(1/X)/dX}{dX/dx}
         = -{1/X<sup>2</sup>}{-exp(-x)}
         = (1/X){exp(-x)/1 + exp(-x)}
         = f(x)(1 - f(x))
よってdf(0)/dx = 0.5・0.5 = 0.25    (2)

●P. 78
問
以下の文章をLSTMに入力し空欄に当てはまる単語を予測したいとする。文中の「とても」という言葉は空欄の予測においてなくなっても影響を及ぼさないと考えられる。このような場合、どのゲートが作用すると考えられるか。
「映画おもしろかったね。ところで、とてもお腹が空いたから何か____。」

回答
忘却ゲート
「とても」は強調の副詞として、動詞「空いた」の意味を強めるだけなので空欄の予測に寄与せず、よって忘却ゲートによってCECから情報を削除する必要がある。

## 2-D. 関連記事レポート

# 3. GRU
## 3-A. 講義内容
**GRU**
LSTMはパラメータが多く、計算負荷が大きいことが課題であった。GRUは、そのパラメータを大幅に削減しつつ、精度は同等またはそれ以上が望める様になった構造。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/13324bd1-af53-7cb8-178e-39f3137d4b42.png)
講義資料より

**LSTMとの比較**
・CECが存在しない
・隠れ層の状態で、これまでの入出力を記憶
・入力ゲート、出力ゲート、忘却ゲートがなくなり、リセットゲート、更新ゲートを追加
・各ゲートへの入力は時刻tの中間層への入力と、時刻t-1の中間層からの出力である点は同じ
・各ゲートからの出力は内積演算ユニットに対して行われる点は同じ

## 3-B. 実装演習結果
## 3-C. 確認テスト考察
●P. 88
問
LSTMとCECが抱える課題について、それぞれ簡潔に述べよ。

回答
・LSTMは構成が複雑であるためにパラメータが多く、計算負荷が大きい。
・CECそのものに学習能力がないこと。そのため、入力ゲート、出力ゲート、忘却ゲートをCECの周囲に配置する必要があり、上記の原因となる。

●P. 92
問
LSTMとGRUの違いを簡潔に述べよ。

回答
LSTMは主にCEC、入力ゲート、出力ゲート、忘却ゲートの4つの部分からなり、パラメータ数が多いため計算負荷が大きくなる。GRUにはCECがなく、リセットゲート、更新ゲートの比較的単純な構造であるため、パラメータ数が少なく計算負荷も小さい。

## 3-D. 関連記事レポート

# 4. 双方向RNN
## 4-A. 講義内容
**双方向RNN**
文章の推敲問題や機械翻訳の問題は、話し言葉のリアルタイム翻訳の問題などとは異なり、入力となる配列構造が末尾まで一気に与えられるため、ネットワークは時刻tの配列要素を出力するにあたり、時刻t-1以前の情報のみならず、時刻t+1以降の情報も利用することができる。このように過去の情報だけでなく、未来の情報を加味することで精度向上を図るRNNを双方向RNNという。

## 4-B. 実装演習結果
## 4-C. 確認テスト考察
確認テストなし

## 4-D. 関連記事レポート

# 5. Seq2Seq
## 5-A. 講義内容
二つのNNから構成されるEncoder-Decoderモデルの一種で、機械対話や、機械翻訳などに利用されている。Encoderでは、順に入力された文書などの文脈の情報を中間層に記憶してゆき、Decoderでは中間層に蓄積された文脈情報をもとに別の系列を生成する。Encoder、Decoderは決まったネットワークがあるわけではなく、RNNなどが利用される。

**Encoderでの処理**
Taking：文章を単語等のトークンに分割し、トークンごとにIDに変換される
Embedding：対応表を元に、IDからトークンを表す分散表現ベクトルに変換される
Encoder RNN：ベクトルを順番にRNNに入力していく

分散表現ベクトルは、最近ではgoogleのbertなどを利用して生成されるが、その際にMasked Learning Model(MLM)といった人手による教師データの作成が不要な方法をとることで大量のデータを学習できるようになった。

**Decoderでの処理**
Decoder RNN：Encoder RNNのfinal state (thought vector) から、各トークンの生成確率を出力する
　　　　　　　final stateをDecoder RNNのinitial stateとして設定し、Embeddingを入力する
Sampling：生成確率にもとづいてトークンをランダムに選び出す
Embedding：2で選ばれたトークンをEmbeddingしてDecoder RNNへの次の入力として渡す
Detokenize：1 -3 を繰り返し、2で得られたトークンを文字列に変換する

**HRED**
通常のSeq2seqでは、一問一答にしか対応しておらず、会話の文脈を考慮できない。そこで、過去n-1個の発話から次の発話を生成するHREDが考案された。Context RNNと呼ばれる構造を含んでおり、Encoderのまとめた各文章の系列をまとめて、これまでの会話コンテキスト全体を表すベクトルに変換している。

**VHRED**
HREDは短く、情報量に乏しい答えをしがちであったため、HREDにVAEの潜在変数の概念を追加したVHREDが考案された。

**オートエンコーダー**
教師なし学習の一つで、入力データを潜在変数zに変換するNN：Encoderと、潜在変数zを入力として元データを復元するNN：Decoderの2つNNからなる構造をとる。潜在変数zの次元が元データより小さい場合、エンコードすることは次元削減ととらえることができる。

**VAE**
通常のオートエンコーダーの場合、潜在変数zにデータを圧縮して保存しているものの、その構造がどのような状態かわからない上、一部の情報は失われている可能性がある。例えば、MNISTの画像を数字の0~9に対応する10次元のone-hotベクトルに圧縮してしまった場合、数字同士の絵面の類似度（「1」と「7」は似ている、「3」と「5」は似ているといった類似）の情報は失われてしまう。そこで、VAEはこの潜在変数zに確率分布z∼N(0,1)を仮定し、情報をできるだけそのまま圧縮できるような措置をとっている。具体的には、Encoderの出力直前にノイズを加えることで実現している。

## 5-B. 実装演習結果
## 5-C. 確認テスト考察
●P. 109
問
下記の選択肢から、seq2seqについて説明しているものを選べ。
（1）時刻に関して順方向と逆方向のRNNを構成し、それら2つの中間層表現を特徴量として利用するものである。
（2）RNNを用いたEncoder-Decoderモデルの一種であり、機械翻訳などのモデルに使われる。
（3）構文木などの木構造に対して、隣接単語から表現ベクトル（フレーズ）を作るという演算を再帰的に行い（重みは共通）、文全体の表現ベクトルを得るニューラルネットワークである。
（4）RNNの一種であり、単純なRNNにおいて問題となる勾配消失問題をCECとゲートの概念を導入することで解決したものである。

回答
（2）
（1）は双方向RNNの説明。（3）は構文木の説明。（4）はLSTMの説明。

●P. 119
問
seq2seqとHRED、HREDとVHREDの違いを簡潔に述べよ。

回答
seq2seqとHRED
seq2seqは一問一答形式での文章生成であるため、以前の文章の文脈を加味した文章を作成できない。一方、HREDはある時刻の文脈ベクトルを次の時刻の文脈ベクトルに伝達するため、文脈を考慮した文章を生成できる。

HREDとVHRED
HREDは短く情報量に乏しい回答を生成する傾向があるが、VHREDはHREDにVAEの潜在変数の概念を追加することで、バリエーションに富んだ回答を生成できる。

●P. 128
問
VAEに関する下記の説明文中の空欄に当てはまる言葉を答えよ。自己符号化器の潜在変数に____を導入したもの。

回答
確率分布∼N(0,1)
潜在変数zにN(0,1)の確率分布を仮定することで、元の入力データの特徴をできる限り保ったまま情報を圧縮できる。

## 5-D. 関連記事レポート

# 6. Word2vec
## 6-A. 講義内容
**RNNの課題**
RNNは、可変長の系列を処理できるが、文書の単語に相当する系列の要素が可変長である場合には、処理ができない。そこで、単語を単なる文字列として扱うのではなく、固定長で表現する必要がある。

**One-hotベクトル**
単語をベクトルで表現する手法の一つで、1つの単語を1要素のみが1で、他の要素はすべて0となるベクトルに対応させる方法。訓練データの単語を重複なく取り出し、単語のリストを作成して通し番をふり、単語ごとに通し番の要素のみを1としたベクトルを得る。単語リストの数だけベクトルの次元が大きくなる。また、単語同士の意味の類似度はベクトルに表現されていない。

**Word2vec**
単語のEmbedding表現を得る手法の一つで、One-hotベクトルよりも小さな次元で単語を表現し、ベクトルの類似度は単語の類似度を示している。

## 6-B. 実装演習結果
## 6-C. 確認テスト考察
確認テストなし

## 6-D. 関連記事レポート

# 7. Attention Mechanism
## 7-A. 講義内容
**Attention Mechanism**
Seq2seqは、入力データが何単語からなる文章であっても、固定の文脈ベクトルに情報を格納していくため、長い文章への対応が難しい。この問題を解決するには、文章が長くなるほどそのシーケンスの内部表現の次元も大きくなっていく、仕組みが必要になる。そこで、「入力と出力のどの単語が関連しているのか」の関連度を学習する仕組みが開発され、これをAttention Mechanismという。例えば、機械翻訳の課題では英単語「I」は、日本語の「私」と関連度が高くなるよう学習が行われる。

## 7-B. 実装演習結果
## 7-C. 確認テスト考察
●P. 137
問
RNNとword2vec、seq2seqとAttentionの違いを簡潔に述べよ。

回答
RNNとword2vec
RNNは再帰的な構造を持った時系列データの処理に適したNNのこと。一方、word2vecはNNではなく、分散表現ベクトルを得るための手法である。

seq2seqとAttention
seq2seqは時系列データを入力にとり、時系列データを出力するNNのこと。AttentionはNNではなく、時系列データ間・時系列データ自身の構成要素の間で関連性に重みづけをする手法。

## 7-D. 関連記事レポート

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

**強化学習の応用例**
マーケティングの場合
■ 環境：会社の販売促進部
■ エージェント：プロフィールと購入履歴に基づいて、キャンペーンメールを送る顧客を決めるソフトウェア
■ 行動：顧客ごとに送信、非送信の2つの行動から1つを選択する
■ 報酬：キャンペーンのコストという負の報酬、またはキャンペーンで生み出されると推測される売上という正の報酬

**探索と利用のトレードオフ**
強化学習では、探索と利用はトレードオフの関係にある。探索とは、特に学習初期などの知識が不足している状態において、ランダムのような行動のことを意味し、ここでいう利用とは、学習が進んでいきある程度知識を得た際に、その知識を利用してベストな行動をとること。探索を続けていると、新たな経験から新たな知識を入手できるが、過去の知見を活かせず、逆に利用を続けていると新たな知識が身につかず、ベストな解にたどり着かない。この関係を探索と利用のトレードオフという。

**強化学習と教師あり/なし学習の違い**
強化学習と、これまで学んできた教師あり/なし学習は、目標が異なっている
■ 強化学習：優れた方策を見つけることが目的
■ 教師あり/なし学習：データに含まれるパターンを見つけ出すこと、及びそのデータから予想することが目的

**強化学習の歴史**
強化学習は、その考え方は古くから存在していたが、当時のコンピューターには計算量が多く処理しきれなかった。近年、強化学習の計算を処理できるまでにコンピューティング技術が発展したため、強化学習は再び脚光を浴び始めた。また、関数近似法とQ学習を組み合わせた手法が登場したことも強化学習の発展の一因である。

・Q学習：行動価値関数を行動する毎に更新することにより学習を進める方法
・関数近似法：価値関数や方策関数を関数近似する手法のこと
　　　　　　　関数近似法以前は、状態に対して行動を紐づける巨大な表を基に強化学習が行われていた
　　　　　　　NN技術が発達した現在では、この関数をNNに置き換えるなどの手法がとられている

**価値関数**
価値を表す関数で、状態価値関数と行動価値関数の2種類がある
■ 状態価値関数：ある状態の価値に注目する関数
■ 行動価値関数：状態と行動を組み合わせた価値に注目する関数
　　　　　　　　最近の流行はこちら

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

**方策勾配法**
方策関数をNNを用いて実装した場合の、最適化法の一つ。NNでは誤差関数が小さくなるように学習を進めていたが、強化学習では対照的に期待収益がより大きくなるように学習を行う。

# 2. AlphaGo
## 2-A. 講義内容
**AlphaGo**
AlphaGoは、DeepMindによって開発されたコンピュータ囲碁プログラムで、強化学習を用いて実装されている。AlphaGo LeeとAlphaGo Zeroの2種類が存在する。

**AlphaGo Lee**
方策関数のPolicyNetと、価値関数のValueNetの2つのCNNからなる。PolicyNetは19x19の碁盤の目情報と48チャネルを入力にとり、19x19マスの2次元の着手予想確率を出力する。ValueNetは19x19の碁盤の目情報と49チャネルを入力にとり、現局面の勝率を-1~1の数値で出力する。

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

■ AlphaGo Leeの学習ステップ
強化学習は計算量が多いため、初めに教師あり学習でヒューリスティックなRollOutPolicyを学習させることで時間を短縮している。
１、教師あり学習によるRollOutPolicyとPolicyNetの学習
２、強化学習によるPolicyNetの学習
３、強化学習によるValueNetの学習

**AlphaGo Zero**
AlphaGo Leeと下記の点で異なっている。
・教師あり学習を一切行わず、強化学習のみで作成された
・特徴入力からヒューリスティックな要素を排除し、石の配置のみにした
・PolicyNetとValueNetを１つのネットワークに統合し、枝分かれ構造とした
・Residual Netを導入した
・モンテカルロ木探索からRollOutシミュレーションをなくした

■ Residual Net
ネットワークにショートカットを追加して、勾配の爆発/消失を抑える効果を狙った構造。Residual Networkを使うことにより、100層を超えるネットワークでの安定した学習が可能となった。Residual Blockと呼ばれる基本構造を持ち、ネットワーク全体としてはResidual Blockが複数個繰り返し配置されている。AlphaGo ZeroではResidual Blockは、Convolution　→　BatchNorm　→　ReLU　→　Convolution　→　BatchNorm　→　Add　→　ReLUという構造をしており、Addの部分でショートカットと再度合流している。このBlockが39個配置されている。Resisual Networkはショートカットを持つことで、あたかも層数の違う別のネットワークを組み合わせたかのようなふるまいをし、アンサンブル効果が得られているという説もある。

■ Residual Netの派生
・Residual Blockの工夫
　・Bottleneck：1×1KernelのConvolutionを利用
　・PreActivation：Residual BlockをBatchNorm　→　ReLU　→　Convolution　→　BatchNorm　→　ReLU　→　Convolution　→　Addの順に変更

・Network構造の工夫
　・WideResNet：ConvolutionのFilter数をk倍に増やす
　・PyramidNet：段階的にではなく、各層でFilter数を増やしていく方法

■ AlphaGo Zeroの学習ステップ
１、現状のネットワークでモンテカルロ木探索を用いて自己対局を行う
２、自己対局で作成した教師データを使い学習を行う
３、現状のネットワークと学習後のネットワークとで対局テストを行い、勝率の高いほうを採用する

# 3. 軽量化・高速化技術
## 3-A. 講義内容
**データ並列**
親モデルを各ワーカーに子モデルとしてコピーし、データを分割して各ワーカーごとに計算させる手法。各モデルのパラメータの合わせ方で、同期型か非同期型かに分類できる。
■ 同期型
各ワーカーの計算が終わるのを待ち、全ワーカーの勾配が算出されたところで勾配の平均を計算し、親モデルのパラメータを更新する。互いのワーカーの計算が終わるのを待つため、処理に時間がかかってしまうが、最終的な精度は同期型より良いことが多いため、現在はこちらが主流となっている。

■ 非同期型
学習が終わった子モデルはパラメータサーバにPushされる。新たに学習を始める時は、パラメータサーバからPopしたモデルに対して学習していく。互いのワーカーの計算が終わるのを待たないため、処理が早く終わる。最新のモデルのパラメータを利用できないので、学習が不安定になりやすい。

**モデル並列**
データではなく、親モデルそのものを各ワーカーに分割し、それぞれのモデルを学習させる方法。全てのデータで学習が終わった後で、1つのモデルに復元させる。モデルが大きい時はモデル並列化を、データが大きい時はデータ並列化を利用すると効率が良い。

**GPU**
CPUと比較して、一般的に低性能なコアを多数含んでいる。簡単な並列処理を得意としており、単純な行列演算が多いNNの学習の高速化に向いている。元々の使用目的であるグラフィック以外の用途で使用されるGPUをGPGPU(General-purpose on GPU)という。GPGPUの開発環境には、NVIDIA社のGPUのみで利用できるCUDAや、NVIDIA社以外の会社(Intel, AMD, ARMなど)のGPUで利用可能なOpenCLがある。

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

**蒸留**
精度の高いモデルは一般にニューロンの規模が大きいため、推論に多くのメモリと演算処理が必要となる。そこで規模が大きなモデルから、小さなモデルへと知識の伝承を行うことで、軽量でありながら高精度のモデルを得ようとする手法。知識を伝承するモデルを教師モデル、伝承を受けるモデルを生徒モデルといい、モデル間の誤差を用いて生徒モデルの重みのみを更新していく。

**プルーニング**
ネットワークが大きくなるとパラメータが増えてゆくが、すべてのニューロンの計算が制度に寄与しているわけではない。そこで、モデルの制度への寄与が少ないニューロンを削減することでモデルの軽量化・高速化を行う手法。

## 3-D. 関連記事レポート
ネットワークの軽量化技術の一つ蒸留について調べました。
蒸留にはいくつかのバリエーションがあるようです。
**モデルの出力を利用**
教師モデルと生徒モデルに同一の学習データを与え、教師モデルの出力値、または出力層に近い層の値を、教師データとして生徒モデルを学習させる手法。教師モデルの出力と、生徒モデルの出力間の誤差関数にもバリエーションがあり下記などが使用される。
・ユークリッド損失関数
・温度付きソフトマックス関数
・KLダイバージェンス

**モデルの中間層の値を利用**
生徒モデルに、教師モデルの中間層の値を学習させる手法。中間層のノード数が異なる場合は、一層分重みを作用させてから誤差を計算する。出力値を利用する方法と組み合わせて行うことができる。

**特権情報を利用**
教師モデルの訓練時にのみ、入力データに追加の情報を付加し、生徒モデルに伝承する手法。生徒モデルは、追加の情報を利用することはできない。
例：画像の分類問題で、教師モデルには画像とそのキャプションを与え、生徒モデルには画像のみを与える。

参考：
http://codecrafthouse.jp/p/2018/01/knowledge-distillation/

# 4. 応用モデル
## 4-A. 講義内容
**MobileNet**
小規模でありながら高精度が出るよう工夫された、画像認識のネットワーク。Depthwise Separable Convolutionという手法が用いられており、空間方向の畳み込みとチャネル方向の畳み込みが分離されている。
■ Depthwise Convolution
1枚のフィルターのみを用いて、入力画像のチャネルごとに別々で畳み込み演算を行う。各チャネルごとの畳み込みなのでチャネル間の関係性は全く考慮されないが、通常はPW畳み込みとセットで使うことでこの問題を解消している。出力チャネル数は、入力画像のチャネル数と同じ。

■ Pointwise Convolution
サイズが1x1のフィルターを複数用いて、チャネル横断的に畳み込み計算を行う。出力チャネル数は、フィルターのチャネル数と同じ。

**DenseNet**
画像認識のネットワークの一つ。Dense Blockという構造が繰り返し配置されており、1つのDense Block内では層を通り抜けるごとに、Block内のそれ以前の層の出力をチャネルとして累積してゆく。チャネルの増加量は一定で、growth rateと呼ばれる。Dense Block間には畳み込み層とプーリング層からなるTransition Layerと呼ばれる層が挟まれており、ここで増えた分のチャネルが削減される。

**BatchNorm**
ミニバッチ単位でデータを平均が0、分散が1となるように正規化する手法。Batch Sizeが小さい条件下では、学習が収束しないことがあり、代わりにLayer Normalizationなどの正規化手法が使われることが多い。また、ミニバッチのサイズに依存する手法であるが、ミニバッチのサイズは学習を行うHWリソースに依存して変えざるを得ないため、実行環境が変わった場合、効果も変動してしまう。

**Layer正規化/Instance正規化**
■ Layer正規化
それぞれのsampleの全てのpixelsが同一分布に従うよう正規化する手法。ミニバッチの数に依存しない。

■ Instance正規化
さらにchannelも同一分布に従うよう正規化する手法。ミニバッチの数に依存しない。

**Wavenet**
畳み込みを用いた音声の生成モデルの一つ。時刻ごとのデータを飛ばしながら利用することで、1時刻に行う計算量を保ちながら、広い時間幅の情報を考慮することができる（Dilated causal convolution）。

# 5. Transeformer
## 5-A. 講義内容
**従来法の課題**
従来のニューラル機械翻訳は、Encoder・Decoder間で翻訳元の文の内容を固定長のベクトルに保存するため、長い文章に対応できないという問題があった。そこで、翻訳先の各単語を選択する際に、翻訳元の文中の各単語の隠れ状態を利用するAttentionという機構が、Encoder-Decoderモデルに組み合わせて利用され始めた。Attentionの動作は、query(検索クエリ)に一致するkeyを索引し、対応するvalueを取り出す操作であると見做すことができ、これは辞書オブジェクトの機能と同じである。

**Transeformer**
2017年6月に発表されたAttentionを利用したネットワークで、従来のEncoder-Decoderモデルと異なりRNNを一切利用していない。当時のSOTAをはるかに少ない計算量で実現した。

**Attention**
AttentionはQuery、Key、Valueの3要素からなるが、これらの由来によって2種類に分類される。
■ Source Target Attention：Queryはターゲット由来。Key、Valueはソース由来。
■ Self-Attention：Query、Key、Valueすべてがソース由来。

**Transformer-Encoder**
TransformerのEncoderでは、自己注意機構（Self-Attention）により文脈を考慮して各単語をエンコードしている。
■ Position-Wise Feed-Forward Networks
位置情報を保持したまま順伝播を行う仕組みで、線形変換　→　ReLu　→　線形変換の2層の全結合NNの構造をしており、各Attention層の出力を決定している。

■ Scaled dot product attention
全単語に関するAttentionをまとめて計算する仕組み。

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

**Transformer-Decoder**
Encoderと同じく6層構造で、各層でSelf-AttentionとEncoder-Decoder attentionの2種類の注意機構を実装している。
■ Add & Norm
Add & NormはDecoderの各層に3つ、Encoderの各層にも2つずつ存在する。
・Add (Residual Connection)
　入出力の差分を学習させる手法であるが、実装上は出力に入力をそのまま加算させる機構である。学習・テストエラーを低減させる効果がある。
・Norm (Layer Normalization)
　各層においてバイアスを除く活性化関数への入力を平均０、分散１に正規化する手法で、学習を高速化させる効果がある。

■ Position Encoding
TransformerではRNNを用いないため、単語列の語順情報を記憶できない。そのため別途、単語の位置情報の分散表現に加算してエンコードする仕組みがPosition Encodingである。Position EncodingはEncoder/Decoderの先頭に付加されている。

## 5-B. 実装演習結果
Transformaerのサンプルコードを実行しました。
学習の様子がこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/6aba36a9-675f-69c8-949b-baa68c1aea45.png)

英文サンプルを翻訳させてみると、下記のようになりました。「show」を「見せる」の意味で直訳的にとらえているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/e7e1b1f3-718e-f48b-229e-69104929296b.png)

Bleuスコアは下記となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/abd6c00f-dda1-3803-b238-4bd57d281197.png)

# 6. 物体検知・セグメンテーション
## 6-A. 講義内容
**物体認識タスク**
物体認識タスクは下記に分類される。
■ 分類：（画像に対し単一または複数の）クラスラベルを出力する。画像中の対象物体の位置は問わない。
■ 物体検知：Bounding Boxを出力するを出力する。対象物体の位置は特定するが、個体の区別は問わない。
■ 意味領域分割：（各ピクセルに対し単一の）クラスラベルを出力する。対象物体の位置は特定するが、個体の区別は問わない。
■ 個体領域分割：（各ピクセルに対し単一の）クラスラベルを個体ごとに出力する。対象物体の位置特定、個体の区別を行う。

**代表的データセット**
下記は、いずれも物体検出コンペティションで用いられた深層学習の分野では代表的なデータセットである。クラス数・Box/画像の大小を比較し、目的に応じた適切なデータセットの選択が必要となる。
■ VOC12
　・VOCはVisual Object Classesの略
　・主要貢献者が2012年に亡くなったことに伴いコンペも終了
　クラス：20
　Train+Val：11,540
　Box/画像：2.4

■ ILSVRC17
　・ILSVRCはImageNet Scale Visual Recognition Challengeの略
　・コンペは2017年に終了しているが、後継はOpen Images Challenge
　・ImageNet（21,841クラス/1400万枚以上）のサブセット
　クラス：200
　Train+Val：476,668
　Box/画像：1.1

■ MS COCO18
　・COCOはCommon Object in Contextの略
　・物体位置推定に対する新たな評価指標mAP<sub>COCO</sub>を提案
　クラス：80
　Train+Val：123,287
　Box/画像：7.3

■ OICOD18
　・ILSVRCやMS COCOとは異なるannotation process
　・Open Images V4（6000クラス以上/900万枚以上）のサブセット
　クラス：500
　Train+Val：1,743,042
　Box/画像：7.0

**評価指標**
■ IoU：物体検出において物体位置の予測精度を評価する指標（Intersection over Union）。Area of Overlap / Area of Unionにて計算する。Confusion Matrixの要素で表現すると、TP / (TP + FP + FN)となる。Jaccard係数とも呼ばれる。

■ AP：判定のconfidenceの閾値を変化させると、一般的にPrecisionもRecallも変化していくが、これら2つの指標はトレードオフの関係にある場合がある。そこでPrecision・Recallを加味したAP（Average Precision）という指標が用いられる。APは、PrecisionをRecallの関数（P=f(R)）と見たときに、この関数が描く曲線の下側の面積となる。厳密には各Recallのレベルに対して最大のPrecisionにスムージングして計算される。また。積分はInterpolated APとして有限点（e.g., 11点）で計算される。クラスラベルごとに計算されます。

```math
AP = \int^{1}_{0} P(R) \, dR
```

■ mAP：APがクラスラベルごと別々に計算される指標であるのに対し、mAPはクラスラベルごとに平均して計算される。クラス数がCの時、下記となる。

```math
mAP = \frac{1}{C} \sum^{C}_{i=1} AP_{i}
```

■ FPS:Flames per Secondの略で、検出精度に加え検出速度を考慮した指標。

**物体検知の大枠**
代表的なネットワーク
・2012
　　AlexNet
・2014
　　VGGNet、GoogLeNet(Inception-v1)
・2015
　　ResNet
・2016
　　DenseNet、Inception-ResNet(Inception-v4)
・2017
　　MobileNet
・2018
　　AmoebaNet

代表的な物体検知のフレームワーク
・2012
　　DCNN
・2013
　　DetectorNet、RCNN
・2014
　　SPPNet
・2015
　　Fast RCNN、Faster RCNN、YOLO、SSD
・2016
　　RFCN、YOLO9000、FPN
・2017
　　RetinaNet、Mask RCNN
・2018
　　CornerNet

物体検知のフレームワークは大きく２つに分類できる。
■ ２段階検出器（Two-stage detector）
・候補領域の検出とクラス推定を別々に行う
・相対的に精度が高い傾向
・相対的に計算量が大きく推論も遅い傾向

■ １段階検出器（One-stage detector）
・候補領域の検出とクラス推定を同時に行う
・相対的に精度が低い傾向
・相対的に計算量が小さく推論も早い傾向

**SSD：Single Shot Detector**
SSDでは、物体を検知する際デフォルトボックスと呼ばれるbounding boxをネットワーク全体としては8,732個ランダムに配置する。学習を進めていくと、SSDはデフォルトボックスを適切な形に変形し、クラスラベル、confidenceとともに出力するようになる。このように多数の、デフォルトボックスを配置するための問題とその対処方法が下記である。
■ Non-Maximum Suppression
画像上の1つの検出対象に対して複数のbounding boxが配置されてしまうため、bounding box同士でIoUを計算し、数値が大きく変わらない（＝大体同じ位置にある）のであれば、confidenceの大きいほうのみを残し、他は削除するという手法。

■ Hard Negative Mining
VGG12をベースとしたSSDの検出対象クラスは21個あり、中にはネガティブクラスとして「背景」のクラスが存在する。一般的に物体検出を行う画像では、検出対象の物体が占める面積よりも背景部分が占める面積のほうが大きいため、クラス間でbounding boxの数に大きな偏りが生じる。そこで、背景クラス（ネガティブクラス）とそれ以外のクラス（ポジティブクラス）の比が3：1以下となるように条件を設けている。

**Semantic Segmentationの概略**
CNNでは、受容野を広げるためにプーリング層を実装しているが、その結果、画像データが層を進むごとに解像度が落ちていく。一方、セマンティックセグメンテーションは元画像のピクセルレベルでのクラス分類を出力するため、層を進んできた画像データ解像度を回復する必要がある。

■ Deconvolution/Transposed convolution
解像度を回復する（Up-sampling）ための手法。通常の畳み込み層のようにkernel size、padding、strideの設定が必要となる。逆畳み込みと呼ばれることも多いが、畳み込みの逆演算ではなく、poolingによって失われた情報が復元されるわけではない。

■ U-Net
U-Netは、低レイヤーの画像情報（特にリーカルな輪郭情報）をSkip-connectionを介してpooling後の特徴量に伝達し、セグメンテーションの精度を向上している代表的なネットワークである。

■ Unpooling
Up-samplingの手法で、max-poolingで最大の値を持っていたピクセル位置を記憶しておき、その位置情報を加味してUp-samplingを行う。

■ Dilated Convolution
Convolutionの段階で受容野を広げる手法。ピクセルを飛ばして畳み込みを行うことで、大きなフィルターを用いた時の受容野を少ない演算量で得ようとする工夫。