ディープラーニングの仕組み・手法

# ディープラーニング
ディープニューラルネットワークを使って予測、学習を行う手法
2010年代に入って脚光を浴びたが、アルゴリズム自体は1960年代には考案されていた
**DNNをベースに次のようなものが改良されている**

- 畳み込みニューラルネットワーク (CNN)
- 再帰型ニューラルネットワーク (RNN)
- オートエンコーダ
- GAN (敵対的生成ネットワーク)

## 畳み込みニューラルネットワーク (CNN)
- 画像認識に応用するために改良されたディープニューラルネットワークの一種である
- 順伝播型のニューラルネットワーク
- 畳み込み層
    - フィルタを用いて積和演算と活性化関数の作用を行う (特徴マップになる)
- プーリング層 
    - 平均値、最大値を用いてサブサンプリングを行う 
- 全結合層
    - 出力層であり、画像の2次データを1次元に変換する

## 再帰型ニューラルネットワーク (RNN)
- 内部に閉路(再帰構造、行って戻ってくる経路)を持つニューラルネットワークの総称
- 過去を保持できるため、過去の入力を参考に「時系列データの次の時点での値」を予測することができる (時系列データの解析に適するように改良されたDNN)
- LSTMは遠い過去の入力を現在の出力に反映するための1つの手段

## オートエンコーダ
- 入力側から半分をエンコーダ出力側から半分をデコーダと呼ぶ
- 入力層と出力層のノード数が同じ
- 中間層のノード数が入出力層よりも少ない
- **入力と全く同じものが出力として出てくることを目指す**
    - 正解ラベルとして入力自身を用いる
- 情報を圧縮した後に入力と全く同じものが出力として出せれば「情報を失わないように圧縮した」すなわち、**次元削減できた**ということになる
- これは主成分分析よりも**非線形な次元削減**を得られる
- 教師なし学習と考えることができる

## GAN (敵対的生成ネットワーク)
- イアン・グッドフェローらによって考案された
- 生成ネットワーク
    - 訓練データと同じようなデータを生成しようとする
- 識別ネットワーク
    - そのデータが訓練データから来たものか、生成ネットワークから来たものかを識別する
- ヤン・ルカンが「機械学習において、この10年間で最もおもしろいアイデア」であると形容した有名なエピソードがある
- 画像生成によく応用される 
    - pix2pix(ある画像を何かしらの加工を施した画像に変換する)

# ディープニューラルネットワークの学習の流れ
- 教師データを用いて予測計算を行い、その予測値と正解ラベルを比較して誤差を計算する
- いくつかの教師データについて繰り返し、その都度誤差を足し合わせる
- 累計された誤差が小さくなるように、勾配降下法を用いて各枝の重みを更新する
- 枝の重みは右から左へ誤差逆伝播する (予測値は順伝播する)
- これを繰り返して少しずつ重みを更新して誤差を小さくしていく

# 勾配降下法
- 学習のゴールは誤差を最小化することである。
- 誤差の最小化は「重みで誤差を微分した値が0に近づくような値を求める」
- DNNは重みが多次元であるため、計算が難しい
- 重みを少しづつ更新して勾配(傾き)が最小になる点を探索する (**勾配降下法**)
- **局所最適解** : 誤差E(w)において、その周辺では誤差の値が小さいが最小値ではない
- 大域的最適解 : 誤差E(w)において、誤差の値を最も小さくする解
- **停留点** : 局所最適解、大域的最適解ではないが、勾配(傾き)が0になる点
- 本当に求めたいのは大域的最適解だが、勾配降下法では求められる重みが局所最適解か大域的最適解かは判断できない。DNNの学習は**「局所最適解で妥協しよう」**というスタンスに立つ。

# 重みの更新タイミング
- **エポック** : 訓練データを何度学習に用いたか
- **イテレーション** : 重みを何度更新したか
- **逐次学習**
    - 訓練データ1つに対して、重みを一回更新する
    - データ1つごとにイテレーションが増える
    - これを**確率的勾配降下法**という
- **ミニバッチ学習** 
    - ミニバッチとはいくつかの訓練データからランダムにサンプリングした小さなデータの集まり
    - ミニバッチに含まれるデータ全てについて誤差の総和を求め、この総和が小さくなるように重みを1回更新する
    - これをミニバッチ勾配降下法という
- **バッチ学習**
    - 訓練データ全ての誤差を計算し、重みを一回更新する
    - イテレーションとエポックが等しい
    - これを勾配降下法、あるいはバッチ勾配降下法という


# 活性化関数
- **ステップ関数**
    - 単純パーセプトロンと同じ
    - if u>=0:1 else:0
    - u=0で微分できないという理由でNNの学習では使用できない
- **シグモイド関数**
    - if u>閾値:1 elif u<=閾値:0
    - ステップ関数と形が似ているが滑らかなので微分できる
    - 入力を0~1の間の値に変換する
    - NNの研究初期に用いられていたが勾配消失問題が起きやすいため現在はあまり使わない
- **ReLU (Rectified Linear Unit, レル)**
    - 勾配消失が起きにくい
    - if u>0:f(u) else:0
- **ソフトマックス関数**
    - 出力を正規化(0~1にスケーリング)して確率として解釈する際に用いられる活性化関数
    - 分類問題で出力層付近で用いられることが一般的である。

# ディープラーニングの欠点
- 過学習を起こしやすい
- 調整するパラメータが多い
- 勾配消失問題が起こる

## 過学習を起こしやすい
過学習とは**訓練誤差**は小さいにも関わらず**汎化誤差**が小さくならない状態のこと

- **訓練誤差**
    - 訓練データに対する誤差であり、訓練データに対して正確な予測が行えるかが分かる
- **汎化誤差** 
    - 訓練に用いていない未知の母集団に対する誤差の期待値であり、未知のデータに対して正確な予測が行えるかが分かる
- **過学習を抑制する手法**
    - **正則化**
        - 誤差関数にパラメータのノルムによる正則化項を付け加える (LASSOなど)
            - LASSO : 不要と判断された特徴量が自動的に消去される性質
            - Ridge正則化 : そのような性質はないがパラメータが全体として大きくなりすぎないように制御を行う
    - **ドロップアウト**
        - 重み更新時に一定の割合でランダムに枝を無効化する手法

## 勾配消失問題が起こる
- 勾配消失問題とは誤差の勾配を逆伝播する過程において、勾配の値が消失してしまい、入力付近での学習が進まなくなってしまうこと
- 層が深いほど起こりやすい
- 原因は活性化関数が何度も作用することにより勾配が小さくなりすぎてしまうから
- ReLUのように正規化機能を持たない活性化関数を中間層で用いると回避できる
    - 微分値が1だから

# 機械学習に関する定理
- **バーニーおじさんのルール**
    - 学習には調整が必要なパラメータの約10倍のデータが必要という経験則
- **ノーフリーランチ定理**
    - あらゆる問題に対して万能なアルゴリズムは存在しないという定理
- **みにくいアヒルの子定理**
    - 機械学習における定式化によって「普通のアヒル」と「醜いアヒル」の区別ができない
- **モラベックのパラドックス**
    - 機械には、高度な推論よりも1歳児レベルの知恵や運動スキルを身に付けるほうが難しい