様々なディープラーニングの手法について、簡単にまとめ

# 概要
ディープラーニングの様々な手法について、ざっくり理解してまとめてみました。

# MLP（多層パーセプトロン）
入力層と隠れ層と出力層が全結合である、もっとも単純なディープラーニング。

<img width="350" alt="multilayer-perceptron.png" src="https://qiita-image-store.s3.amazonaws.com/0/105335/3c3c7a56-3c58-b87d-9d8d-293ea4a652a4.png">

https://www.vaetas.cz/blog/introduction-artificial-neural-networks/

# CNN（畳み込みニューラルネット）
畳み込み層とプーリング層をもつディープラーニング。
局所的なデータの位置のずれを吸収してくれる。

## イメージ
畳み込み層(Convolutional layer)ではフィルターと呼ばれる$H×H$の正方データを対象画像上をスライドさせて、重なる部分のデータとフィルターの積和を特徴量として圧縮して、新たなmapと呼ばれるデータを生成する。

<img width="300" alt="convolve_1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/105335/7dbc5109-610a-a188-6122-a46ca7d87945.jpeg">

プーリング層(Max-pooling layer)では、$K×K$内の最大値を抽出しデータを圧縮する。

<img width="300" alt="pool.png" src="https://qiita-image-store.s3.amazonaws.com/0/105335/515c1289-39c1-70df-2b82-d6235e1b39be.png">

https://cambridgespark.com/content/tutorials/convolutional-neural-networks-with-keras/index.html

それを何層か重ねて最後は全結合によって出力層にデータを渡す。

<img width="500" alt="CNN.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/105335/3de743c9-8841-1f3e-19db-d2640ce0dfee.jpeg">


http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.646.8205&rep=rep1&type=pdf

# RNN（再帰型ニューラルネット）
時系列データ、前後のデータに意味のあるデータに対して、その特徴を学習できるディープラーニング。
中間層に出力を自らの入力とする帰還路をもつ。
ただし、長期的な特徴を学習することは困難。

## イメージ
"I have a pen"という前後に意味をもつデータを学習する場合、$x1$に "I"、$x2$に "have"・・・というようにデータが入力され、$W$ 重みを学習する。

<img width="500" alt="CNN.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/105335/6bf73921-4ff8-17e9-07e1-d8d221dbcd14.png">

http://peterroelants.github.io/posts/rnn_implementation_part01/

# LSTM（長短期記憶）
時系列データにおいて、RNNより長期のデータの特徴を学習できるディープラーニング。
RNNの中間層をLSTM-Blockと呼ばれる、状態を記憶するメモリセルと、記憶を制御する忘却ゲートをもったものに置き換えられたもの。

## イメージ
Blockへの入力データは（四角の外から矢印がBlockに向いている部分）、入力層からのデータと中間層からの帰還データを合わせたもの。

各ゲートは活性関数を適用してデータを$g_{j}\in[0,1]$とする。
入力ゲート(Input Gate)と出力ゲート(Output Gate)は0に近ければデータがブロックされ、1に近ければ伝播させる。

忘却ゲート(Foget Gate)は0の場合に忘却（リセット）される仕組み。

<img width="300" alt="CNN.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/105335/3fba6a55-5d6d-0305-f8ff-fa024c79d5cc.jpeg">

# ResNet
学習対象（レイヤーごとの仮説関数）に入力の差（残差）を使うことで、勾配消失問題（層が深くなるにつれて、勾配が0に収束してしまう問題）を解消するディープラーニング。

## イメージ

あるレイヤーの仮説関数$H(x)$は入力が$x$なので、残差は$F(x)=H(x)-x$となり、仮説関数は$H(x)=F(x)+x$と書き換えられ、これを学習する。

ショートカット接続という道を作り、何層か前の情報を使う。
これにより、層をかなり深くしても勾配消失が起こりにくくなることが確認されている。

<img width="300" alt="ResNet.png" src="https://qiita-image-store.s3.amazonaws.com/0/105335/223a5fe9-7bf7-e92c-9275-a6142ed9e789.png">


<img width="400" alt="ResNet2.png" src="https://qiita-image-store.s3.amazonaws.com/0/105335/fceea7df-0e7c-190d-93de-5c57ec4ff0d1.png">



https://arxiv.org/abs/1512.03385

# VAE
データの潜在変数 $z$ を確率分布とした、生成モデル。
入力データをニューラルネットで潜在変数に変換し（Encode）、潜在変数からまたニューラルネットで入力データと同じ空間に変換（Decode）して新たなデータを生成する。

## イメージ
<img width="400" alt="vae.4.png" src="https://qiita-image-store.s3.amazonaws.com/0/105335/1983fde6-8499-a67e-6a3f-22ef2c47ced5.png">

http://blog.fastforwardlabs.com/2016/08/22/under-the-hood-of-the-variational-autoencoder-in.html

# GAN（敵対的生成ネットワーク）
データを生成するニューラルネット（generator）と、データが本物データかgeneratorによって生成されたデータかを識別するニューラルネット（discriminator）を使った、生成モデル。
discriminatorによって正しく判別できないような、より本物データに近いデータをgeneratorが生成するよう学習を進める。

## イメージ

GANは価値関数$V(G,D)$のMin-Max法として定義できる

```math
\min_{G}\max_{D}V(D,G)=E_{x \sim p_{data}(x)}[\log D(x)]+E_{x \sim p_{z}(x)}[\log (D(1-G(z)))] 
```

前半の　$E_{x \sim p_{data}(x)}[\log D(x)]$　はDiscriminatorが本物データを本物と識別する確率変数
後半の　$E_{x \sim p_{z}(x)}[\log (D(1-G(z)))]$　がDiscriminatorが生成データを偽物と識別する確率変数

これを、GeneratorはDiscriminatorに識別を誤らせようとし、最小化させ、Discriminatorは正しく識別しようと最大化する。

<img width="550" alt="GAN.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/105335/2e53c043-33a0-65bd-27c6-b90d9b318fbe.png">


https://sthalles.github.io/intro-to-gans/

論文(arxiv): [Generative Adversarial Networks](https://arxiv.org/abs/1406.2661)

# Transfer learning（転移学習）
あるデータで学習させたモデルや重みを、別のドメインに転移して利用するディープラーニング。
1から学習するするよりも、少ない訓練データで精度の高い予測が可能。

## イメージ
1.　ImageNetで学習
2.　データが少ない場合は、最後の全結合と出力層だけを再度学習
3.　ある程度データがある場合は、もう少し前の中間層の途中から再学習

<img width="550" alt="transfer_learning.png" src="https://qiita-image-store.s3.amazonaws.com/0/105335/dec3decb-f487-59c5-cfff-f11721545f86.png">


http://cs231n.stanford.edu/syllabus.html

# DQN（Deep Q-Network）
強化学習において、行動価値関数$Q(s,a)$（sの状態の時にaという行動をとる価値を）の値が高くなる様に学習する方法をQ学習といい、Q学習をパラメータを追加した近似関数とて表し、ディープラーニングで求める手法。

行動価値関数

```math
Q^\pi(s,a)=E_{\pi}\{R_{t} | s_{t}=s, a_{t}=a \}
```


論文(arxiv): [Playing Atari with Deep Reinforcement Learning](https://arxiv.org/abs/1312.5602)


# CapsNet
ニューロンでの計算を入出力共にベクトルで行うことで、データの位相空間情報を保持したカプセルという単位で特徴を学習するディープラーニング。

CNNが相対的な位置関係の特徴を学習仕切れない問題に対する、新たな手法。

## イメージ

<img width="500" alt="capsnet.png" src="https://qiita-image-store.s3.amazonaws.com/0/105335/af2abb71-2844-59ba-7611-55460d33580e.png">

通常のニューロンとの違い。
バイアスがなく、活性関数がsquash関数というものを使っている。

<img width="500" alt="capsnet1.png" src="https://qiita-image-store.s3.amazonaws.com/0/105335/901d53ac-7fcf-eeea-ac0d-32f86545453d.png">



論文(arxiv): [Dynamic Routing Between Capsules](https://arxiv.org/abs/1710.09829)

# おわり
間違いがありましたら、ご指摘いただけたら嬉しいです。

この記事で、[Rossoアドベントカレンダー](https://qiita.com/advent-calendar/2017/rosso)の私の担当記事が終了しました。
企画してくれた[@yk0614](https://qiita.com/yk0614)に感謝！！