深層学習(Deep Learning)の手法を簡単にまとめてみた

## はじめに
深層学習(Deep Learning)とは、機械学習の1種である「ニューラルネットワーク（Neural Network）」の階層を深めたアルゴリズムです。
今回は深層学習にどんな種類の手法があるのかを紹介します。
筆者も勉強中で、「こんな手法があるんだ〜」くらいで、細かな処理を理解しているわけではありません。
したがって、誤りがあるかもしれませんが、アウトプットとして書きます。


参考書籍、参考文献は以下です。
https://www.amazon.co.jp/dp/4873117585/
https://ainow.ai/2019/08/06/174245/
http://gagbot.net/machine-learning/ml4
https://qiita.com/icoxfog417/items/5fd55fad152231d706c2
https://www.atmarkit.co.jp/ait/articles/1804/25/news143.html

## 深層学習(Deep Learning)とは
深層学習(Deep Learning)とは、冒頭でも記した通り、機械学習の1種である「ニューラルネットワーク（Neural Network）」の階層を深めたアルゴリズムです。
![image](https://e2o37xwryh5.exactdn.com/wp-content/uploads/2019/07/Screen-Shot-2019-07-23-at-5.05.44-PM.png)
[画像:AINOW編集部](https://e2o37xwryh5.exactdn.com/wp-content/uploads/2019/07/Screen-Shot-2019-07-23-at-5.05.44-PM.png)
人間の神経細胞の図を比較してよく説明されている例のやつで、脳神経の構造を模倣した作りになっていることから、「ニューラル（神経系）ネットワーク」と呼ばれています。
ニューラルネットワークは、「入力層」、「隠れ層」、「出力層」と各層を持ち、各層は複数の「ノード（もしくはユニット）」が「エッジ」で結ばれる構造となっています。この隠れ層は複数の層を持つことができ、層を増やしたものをディープニューラルネットワーク(Deep Neural Network: DNN)と言います。
また、各層は「活性化関数」と呼ばれる関数を持ち、エッジは「重み」を持つことができます。そして各ノードの値は、そのノードと接続する前の層のノードの値から計算します。前の層のノードの値、接続エッジの重みの値、そして層が持つ活性化関数から計算します。この計算方法には様々な種類があります。

## 各手法の特徴
各手法の特徴をまとめた図が以下になります。この図から、ニューラルネットワークの隠れ層を多数化したものがディープニューラルネットワーク(Deep Neural Network: DNN)であり、代表的4手法に応用されることがわかります。
![image](https://e2o37xwryh5.exactdn.com/wp-content/uploads/2019/08/NN.jpg)
[画像:AINOW編集部](https://e2o37xwryh5.exactdn.com/wp-content/uploads/2019/08/NN.jpg)

## CNN（Convolutional Neural Network）
畳み込みネットワーク (Convolutional Neural Network：CNN)は画像認識に適した手法です。
![image](https://i2.wp.com/gagbot.net/gagbot.net/wp-content/uploads/2016/08/%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E5%85%A5%E9%96%80%EF%BC%88HP%E7%94%A8%EF%BC%893.jpg?fit=900%2C675)
[画像: 深層学習入門](http://gagbot.net/machine-learning/ml4/%e6%b7%b1%e5%b1%a4%e5%ad%a6%e7%bf%92%e5%85%a5%e9%96%80%ef%bc%88hp%e7%94%a8%ef%bc%893)
CNNでは、隠れ層は「畳み込み層」と「プーリング層」で構成されます。畳み込み層は、前の層で近くにあるノードにフィルタ処理して「特徴マップ」を得ます。プーリング層は、畳み込み層から出力された特徴マップを、さらに縮小して新たな特徴マップとします。この際に着目する領域のどの値を用いるかですが、上図のように最大値を得ることで、画像の多少のずれも吸収されます。したがって、この処理により画像の位置移動に対応できます。

詳しくは、[Convolutional Neural Networkとは何なのか](https://qiita.com/icoxfog417/items/5fd55fad152231d706c2) がまとまってそうでした（私もまだ全て読んでいないので読んだら何かしらアウトプット予定）。

## RNN （Recurrent Neural Network)
再帰型(リカレント)ニューラルネットワーク(Recurrent Neural Network：RNN)は時系列の情報に適した手法です。
例えば電車の乗車率は朝6-9時と夕方6-9時が最も多かったり、SNSの使用は昼休みや帰宅時間帯に多くなるなど、時間軸に沿って何かパターンを持っている情報は意外と多いです。
CNNやこれまでのニューラルネットワークでは時系列の情報の喪失が多いですが、RNNは時系列データをそのまま利用できるようになっています。

時系列データの予測においては、入力もおのおのが独立した入力ではなく「一連の入力データ」として扱われ、それぞれに対する一連の出力データが必要となります。単純なニューラルネットワークでは、出力は最後の層からのみ発生するため、一連の入力のそれぞれに対して出力を生成することはできません。なぜなら、通常のニューラルネットワークでは、ある層の出力は、次の層の入力に利用されるのみだからです。
![image](https://image.itmedia.co.jp/ait/articles/1804/25/di-04-01.gif)
[画像: RNNの概要を理解しよう](https://image.itmedia.co.jp/ait/articles/1804/25/di-04-01.gif)
そこでRNNでは、上図のように、ある層の出力は、次の層の入力として利用し、一般的なニューラルネットワークの最後の層のような（中間データではないユーザーが利用可能な）出力としても利用されるようになっています。また、各層の入力として、前の層の入力のみではなく、時系列のデータポイントも入力とします。
RNNは音声認識や自然言語処理などにも使用され、Google翻訳などにも活用されているようです。


## オートエンコーダ（Autoencoder）
オートエンコーダとは、入力されたデータを、後で復元できる状態に圧縮する処理を指します。通常、データを圧縮すると情報の一部が欠落します。しかし、欠損部がなくても再現できるよう、重要度の高い情報を残しておかなければなりません。そこで、オートエンコーダでは、重要度の高い情報を洗い出し、それ以外の部分を削ぎ落します。意味を維持したままより少ない次元に落とし込むことを「次元削減」または「特徴抽出」と呼びます。
###オートエンコーダの必要性
オートエンコーダの必要性については以下の2つが挙げられます。
* 勾配消失を解決するため
* 過学習を防ぐため
それぞれについて軽く説明します。
####勾配消失を解決するため
まずは、勾配消失についてです。
繰り返しますが、ニューラルネットワークは、入力値と出力値の間に「隠れ層」と呼ばれる圧縮状態を挟むのが特徴です。
このようにすることで、従来では不可能だった複雑な処理も可能になりました。そこで、さらに多くの隠れ層を挟むことで、より高度な処理能力が実現するのではないかと考えられるようになりました。
しかし、主に採用されている計算方法である誤差逆伝播法においては、予測と正解の誤差を利用して学習していくのですが、その誤差は層を重ねるとともに消えていってしまい、最終的に精度が落ちてしまいます。これを勾配消失と言います。
そこで、オートエンコーダは勾配消失を解決する方法として期待されました。ニューラルネットワークの初期値に、オートエンコーダで学習させたものを用います。事前学習を行うことで、勾配消失による学習速度低下を防止します。

####過学習を防ぐため
過学習とは、学習の訓練データに適合しすぎて、評価データに対応できなくなることです。過学習になると、学習データだけに最適してしまい、汎用性が失われ、実際に使うことができません。
この解決策として、ちょうど良いタイミングで学習をストップさせる方法や、学習データ数を増やして解決する方法もありますが、オートエンコーダを用いることでも解決できます。
オートエンコーダは次元を圧縮し、その分データが荒くなるので、過学習を防ぐことができます。

## GAN（Generative adversarial networks）
GAN(Generative Adversarial Network)は現在、主に画像分野において好成績を残している手法です。GANは2つのネットワークで構成されており、一つは生成器(ジェネレータ)でもう一つは識別器(ディスクリミネータ)と言います。
* ジェネレータ：ある値を入力値として受け取り、画像データを出力する。
* ディスクリミネータ：ジェネレータが出力した画像データを受け取り、本物か偽物かを予測して出力する。
ジェネレータはディスクリミネータが間違えるような画像を作るように学習していき、ディスクリミネータは偽物をきちんと見抜けるように学習していきます。この2つがイタチごっこをすることで、お互いの精度をどんどん上げていきます。

###メリット
*データの増幅が可能であること。
画像データの色や角度を変えて枚数を擬似的に増やす従来の方法ではなく、サンプルデータの特徴を含んだ新しいデータを生成できます。
* 画像版word2vec演算ができるなど他の技術との合わせ技が可能であること。
word2vecの技術と組み合わせることにより、画像のラベルから演算を行えるようになりました。例えば「メガネをつけた男性 – 男性 + 女性＝メガネをつけた女性」という演算から、メガネをつけた女性の画像が生成可能です。
* 従来の方法より高品質な画像を生成できる。
GANと類似した技術のオートエンコーダやVAE（変分オートエンコーダ、Variartrial AutoEncoder）に比べ、GANのアーキテクチャではよりリアルで高画質な画像を生成できる。
###デメリット
*生成データの評価が難しい。
コンピューターが生み出した画像データなどに対して、どのような基準にしたがって「類似している」と判断するのかが不透明です。
*オリジナルGANは動作が不安定になりやすい。
勾配消失問題：初めは簡単に判別ができるため学習が十分に行われない。また、モード崩壊と呼ばれる、だませるようになった場合その特徴を持つ画像しか生成しなくなるということが挙げられます。

## まとめ
ニューラルネットワークから始まり、深層学習(Deep Learning)の4つの手法について簡単に紹介しました。今後は、その手法をもう少し詳しく学習する予定。