深層学習における、各種関数の位置づけについて整理

# はじめに
深層学習についてはいろんな用語があって
特に関数の種類が多い。
そこで各種関数の位置づけとどんな関数があるのかをさっくりと整理
深層学習の定義は４層以上のニューラルネットワークなので
今回はわかりやすさ重視で全て「ニューラルネットワーク」で通す。

# まずは深層学習の全体像
参考：https://www.renom.jp/ja/notebooks/tutorial/basic_algorithm/lossfunction/notebook.html

これが一番参考になったので使わせてもらう。
ニューラルネットワークのモデルは大きく３種。
　1. ２値分類
　2. 他クラス分類
　3. 回帰
![LossFunction_ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/89c95ff3-6bea-70fe-821d-5e4c51c7c140.png)
このモデルを構成するのは
　①層（入力層/隠れ層/出力層
　②activate（活性化関数）
　③error（損失関数）
　④update（最適化関数）←上図にはないけど、存在する
になる。
そして、番外編として学習したモデルを評価するための⑤評価関数　が存在する。

これを踏まえて、、、
例えば２値分類モデルでは
　入力データは、入力層（①）から隠れ層(①)を経由して、
　活性化関数（②）の実行結果を出力層（①）で受け取る
　その結果がどれくらい正しいかは損失関数（③）で評価し
　その結果に基づいて最適化関数（④）にかけてパラメータ（重み＆バイアス）を更新する
この更新の過程が「学習」となり、
「学習」の結果、最適な重みづけされたニューラルネットワークが「学習済みモデル」となり

実際の問題で与えられたデータを入力データとして「予想結果」を返す。

こんなところか。
改めて②～④についての位置づけとそこで使用する関数をリストアップする

# 活性化関数の役割
　参考：https://qiita.com/namitop/items/d3d5091c7d0ab669195f

　活性化関数は、入力信号の総和を次の層へ渡す際に任意の形に変換する。
　例えば回帰問題であれば、活性化関数を使わずに素のままの値で使うけど
　クラス１に分類される確率計算であったり、２値分類みたいに、どっちがどっち？みたいなときは
　活性化関数を使ってクラス１である確率は〇％とか、０か１かと言われたら１。
　みたいな分類が可能になる。
　画像分類などでは、多層構造になるので次の層へ行くたびにRelu関数を挟むなどしているようだ。
　
　…と色々書いたが大体の種類と使用ケースはお決まりがあるようなので
　そこまで悩む必要はなさそうだ。

## 活性化関数の種類
　ステップ
　シグモイド
　ReLU
　ソフトマックス
　恒等関数

# 損失関数
　参考：https://qiita.com/mine820/items/f8a8c03ef1a7b390e372

　参考URLとはちょっと解釈が違うが
　入力に対しての予想値と実測値とでどれくらい差（＝ギャップ）が開いているのか？を測るための関数。
　で、この数値化されたギャップが、この後のどれくらいパラメータ調整をすればよいかの指標となる。
　なので言い換えると、この損失関数で算出される量が大きいほど、誤差が広いのでパラメータを大幅に調整する必要があるし、
　量が小さいほど、誤差が小さいのでパラメータを小さく調整することになる。

　なので究極的には損失関数＝０になると学習不要、すなわち学習完了、ということになる。
　ただ、実際にはそんなに単純ではなく、損失関数が０になるということは学習が適切に進まなくなった時でも
　起こりうるのでいつでも損失関数＝０がベスト、というとようでもなさそうだ。
　
## 損失関数の種類
種類だけでいうといろんなバリエーションがあるけど
大きく２種類で考えるとスッと入ってくる。
ここでは浅く広く眺めたいため深追いは避ける。

①交差エントロピー誤差
　分類問題を扱う際にはこの交差エントロピーが頻繁に使われるそうです。

②二乗誤差
　参考：https://mathwords.net/rmsemae

　線形回帰問題で活躍するっぽい。
　数式の詳細は参考URLに任せるとして、リストアップだけしておく。
　Kaggleとかのお題でみかけるのは大体上３つくらいのような気がする。
　・平均平方二乗誤差（RMSE（Root Mean Square Error））
　・平均絶対誤差（MAE（Mean Absolute Error））
　・平均二乗誤差（MSE（Mean Squared Error））
　・平均平方二乗誤差率（RMSPE（Root Mean Square Percentage Error））
　・平均絶対誤差率（MAPE（Mean Absolute Percentage Error））

# 最適化関数
　参考：https://qiita.com/ZoneTsuyoshi/items/8ef6fa1e154d176e25b8

　勾配の性質を利用することが多いので勾配法と呼ぶところもあるようだ。
　自分の理解では損失関数で表した誤差をもとにパラメータ調整を行うための
　計算式、もしくは計算式と更新手順を含めたアルゴリズム全体を指すように理解した。

　参考URLを見た印象では、確率的勾配降下法（SGD）から始まり、改善を加えられ続け今に至る。ようだった。
　なので、ライブラリで実装されているものもあれば実装されていないので
　最適化を効率的に行うために自ら実装する必要があったりするように感じた。

　で、どんなのがあるかというと…↓↓な感じ。びっくりするほどバリエーションあった。。。
　1. 確率的勾配降下法（SGD）
　2. MomentumSGD
　3. ネステロフの加速法（NAG） (1983)
　4. AdaGrad (2011)
　5. RMSprop (2012)
　6. AdaDelta (2012)
　7. Adam (2014)
　8. RMSpropGraves (2014)
　9. SMORMS3 (2015)
　10. AdaMax (2015)
　11. Nadam (2016)
　12. Eve (2016)
　13. Santa （2016）
　14. GD by GD (2016)
　15. AdaSecant (2017)

# 評価関数
参考：https://support-se.com/deep-learning-mnist-losses-metrics/

参考URLに書いてある↓↓がすべてなように感じた。
~~~~~
「評価関数」はモデルの性能をはかるための関数で、学習結果の’acc’で表示される数字です。
前述の損失関数と同様に出力を評価したものですが、評価関数は値が高いほど高スコアです。
また、評価関数はモデルへのフィードバックは行われず、学習には使用されません。
~~~~~

## 評価関数の種類
参考：https://data.gunosy.io/entry/2016/08/05/115345

一つ一つ追いかけるのがつらくなってきたので
見かけたことのある指標を軽くメモ。詳細は↑↑のサイトをチェックして確認する
損失関数でみかける数式も出たけど、もともと近しい目的なので似たような数式がでる気持ちもわかる気がする
・正解率 (Accuracy)
・適合率 (Precision)
・RMSE (Root Mean Squared Error)
・RMSLE (Root Mean Squared Logarithmic Error)
などなど。