深層学習Day1 ラビットチャレンジ

プロローグ1 識別モデルと生成モデル
・ディープラーニングは大きく2つ、識別モデルと生成モデルに分かれる。
・識別はdiscriminative, backwardなモデルで、あるデータｘが与えられたもとで、クラスCである確率を算出する。決定機、ロジスティック回帰、SVM、NNなど。データが多いものから、低次元なデータを出力する。応用例として画像認識。
・生成はgenerative, forwardなモデルで、あるクラスに属する、という条件を与えることで、データCの分布を出力する。隠れマルコフモデル、ベイジアンネットワーク、変分オートエンコーダー、GANなど。学習データは多くなる。低次元な情報から高次元な情報を生成する。応用例として超解像、テキスト生成など。

プロローグ2 識別器の開発アプローチ
・生成モデル、識別モデル、識別関数の3種類。
・生成モデルはベイズの定理の応用である。データを人工的に生成できるが、学習コストは大きい。
・識別モデルはある入力データのあるクラスに属する確率を出す。
・識別関数は出力が0か1になり、確率は計算されず、クラスのみが出力される。

プロローグ３識別期における生成モデル、識別モデル、識別関数
・生成モデルは、そのデータの分布を推定する。分布自体を推定するために、計算コストは大きい。
・識別モデルは、データがそのクラスに属する確率を求める。分布自体までは推定しない、あくまでクラスのみ。
・識別モデルと識別関数。識別モデルは、確率を推定し、その確率から識別結果を求める。一方で、識別関数は入力データから直接的に識別結果を出す。そのため、識別モデルの確率のように間違いの程度を測ることはできない。

プロローグ４万能近似定理と深さ
ニューラルネットワークを用いることで、どのような関数も近似でき、応用がききやすい。

ニューラルネットワークの全体像
・入力層、中間層、出力層からなる。それぞれweightやbiasがかけられたりたされたりして中間層となる。学習していくのはweightとbias。
・ディープラーニングは明示的なプログラムの代わりに多数の中間層を持つニューラルネットワークを用いて、入力力目的とする出力値に変換する数学モデルを構築する。
・最適化の最終目的はweight Wとbias bである。
・NNは何かしらの入力にweightやbiasを累加することである出力yを出し、その本来の答えdとの誤差を学んでいき、wをfitしていく。
・NNでできること。大きく２つ、回帰問題、分類問題。
・４つ以上の層があるとDeep neural networkとし、自動売買、チャットボット、翻訳、音声解釈、将棋AIに用いられる。すべて入力を数字に直し、出力も数字にすることで行える。

Section1入力層、中間層
・数字を入れる1つ1つの入れ物をノード。そのノードをどれくらい用いるかのweightをかける。バイアス項を最後に足す。行列で表現すると、ドット席としてu = Wx + bと表現できる。
・wは傾き、bは切片であり、それを学習して求めていく。
・ベクトルでドット積でノードをまとめて表現可能。最終的な出力結果はスカラーとなる。

ハンズオン　順伝播
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/handson_1_1_forward_propagation.ipynb

確認テスト　NNに動物の入力をした場合の図、ドット積での重みと入力値の積＋バイアス項の表現、3層NNの中間層の表現
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/20210628NNDay1_nyuuryokusoutochuukansou_test.ipynb

Section2活性化関数
・NNにおいて、次の層への出力の大きさを決める非線形の関数。入力値の値によって、次の層への信号のon/oofや強弱を定める働きを持つ。
・線形な関数は、加法性、斉次性を満たし、足すこともできるし、実数倍の入力をしたら全体が実数倍される。非線形な関数は加法性、斉次性を満たさない。
・中間層に用いるのは：ReLU、シグモイド、ステップ関数。出力数はSoftmax、恒等関数、Sigmoid関数など。
・ステップ関数：しきい値を超えたら発火する。出力は０か１の２値。０と１の間は表現できない。
・Sigmoid関数：1/1+exp(-u) なだらかに上昇していくので、微分ができるが、大きな値では出力の変化が微小なため、勾配消失問題を引き起こすようになった。
・ReLU関数：0以上はその値を返す。勾配消失問題の回避とスパース化(モデルのシンプル化)に役立つ。

ハンズオン　順伝播after
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/handson_1_1_forward_propagation_after.ipynb

確認テスト活性化関数
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/20210628NNDay1%E6%B4%BB%E6%80%A7%E5%8C%96%E9%96%A2%E6%95%B0%E7%A2%BA%E8%AA%8D%E3%83%86%E3%82%B9%E3%83%88_ipynb_%E3%81%AE%E3%82%B3%E3%83%94%E3%83%BC.ipynb

Section3 出力層
・中間層は次の層の入力として適切なものを出力する。
・出力層は目的にそった数字(例えばクラス分けの確率など)を出力する。
・訓練データを用いて、出力数から出力結果と、実際の正解データを比較して、誤差関数によりどれくらいあっていたのかをみる。
・どのくらいあっていたかの表現方法が誤差関数。数値として表せる。
・誤差関数の例として二乗和誤差など。
・中間層と出力層で用いられる活性化関数は異なる。中間層は、あくまで値の強弱を表現するもの。出力数は、確率として出力したりするので、総和が１になるように、などと使いやすいようなものを選択する必要がある。
・出力層に用いる関数は、シグモイド関数、恒等写像、ソフトマックス関数がよく使われる。
・恒等写像は回帰、何もしないでそのまま返す。誤差関数はMSE。
・シグモイド関数は二値分類。誤差関数は交差エントロピー。1/(1+ exp(-x))
・ソフトマックス関数は多値分類、多クラス分類。誤差関数は交差エントロピー。

出力層ハンズオン（逆伝播）
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/handson_1_2_back_propagation.ipynb

出力層テスト
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/20210628NNDay1%E5%87%BA%E5%8A%9B%E9%96%A2%E6%95%B0%E7%A2%BA%E8%AA%8D%E3%83%86%E3%82%B9%E3%83%88.ipynb

Section4 勾配降下法
・勾配降下法は3つある。
★「勾配降下法」
・w(t+1) = 1(t) - 誤差関数＊学習率
・学習率を適切に設定しなくてはならない。
・学習率learning rateが大きすぎると発散してしまい収束しない。一方で小さすぎると収束するまで時間がかかり、また誤差が最も小さくなるところにたどり着かず、他の低いところ(極小値)で収まることもある。ハイパーパラメータとして調整が必要。
・エポック；重み更新の1サイクルのこと
★「確率的勾配降下法（SGD）」
・学習におけるデータの一部分を用いて学習を行う。それぞれのエポックで違うセットを用いて、計算量を減らし、局所極小解に収まるリスクの軽減。
・オンライン学習ができる。オンライン学習はすべてのデータを用意せず、徐々にリアルタイムに得られるデータなどを用いて行う。
・バッチ学習はオンライン学習の逆で、一気にデータを準備して学習していく方法。(勾配降下法はこちらにあたる)
・特に、機械学習に用いるメモリは64GB程度であり、大量のデータを全データを用いるのは難しい。そのためにオンラインが学習で小分けに学習する。
★「ミニバッチ勾配降下法」
・バッチ学習ではすべてのデータをメモリに保存するため、大量のデータは扱えない、オンライン学習はその都度学習するのでメモリの節約になる。このオンライン学習のメリットを用いるのがミニバッチ勾配降下法。
・小分けにする小分けのことをミニバッチという。今あるデータをバッチに分けて学習し、その都度パラメータを更新する。
・CPUを用いたスレッドの並列化で計算のスピードをあげることができる。
・GPUを利用したSIMD（Single Instruction Multiple Data）並列化で一つの命令を多数のデータセット(バッチ)に対して同時並行に行える。
・今現在CPUのスピードは限界に達しており、大事なのは平行して行うことで計算速度を向上させることが大切。

勾配降下法ハンズオン(確率的勾配降下法)
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/handson_1_3_stochastic_gradient_descent.ipynb

勾配降下法テスト
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/20210628NNDay1%E5%8B%BE%E9%85%8D%E9%99%8D%E4%B8%8B%E6%B3%95%E7%A2%BA%E8%AA%8D%E3%83%86%E3%82%B9%E3%83%88.ipynb

Section5 誤差逆伝播法　ビデオ9から
・⊿E検定の計算。誤差関数を重みで偏微分する。δE/δw
・数値微分を行うと計算量が非常に多くなる。そのため、誤差逆伝播法を用いる。
・誤差逆伝播法　算出された誤差を、出力層側から順番に微分し、前の層へと伝播。最小限の計算で、各パラメータでの微分値を解析的に計算する方法。
・式としては、連鎖律的な表現となる。
・計算結果（＝誤差）から微分を逆算することで、不要な再帰的計算を避けて微分を算出できる。

誤差逆伝播法ハンズオン（MNIST）
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/handson1_4_1_mnist_sample.ipynb

誤差逆伝播法確認テスト
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/20210629NNDay1%E8%AA%A4%E5%B7%AE%E9%80%86%E4%BC%9D%E6%92%AD%E7%A2%BA%E8%AA%8D%E3%83%86%E3%82%B9%E3%83%88.ipynb

Section Ex
ディープラーニングの開発環境
・ローカルは端末。クラウドはデータセンターにあるPCを借りて使用。
・CPU　どんなパソコンにも入っている。数千円。　GPU　ゲームPCなどのグラフィックのプロセッサ。数万円。　FPGA　自分でプログラムできる計算機。　ASIC(グーグル社のTPU)　プログラム不可能な計算機。最も速い。数億円。
・AWS　GCP

入力層の設計
・取りうるデータは連続実数、　確率、フラグ(名義変数、one-hotラベル)
・使い物にならないのは、欠損値が多いデータ、誤差の大きいデータ、出力そのものやそれを加工した情報、連続性のないデータ、無意味な数が当てられているデータ。　特にアンケートなどはワンホットベクトルの表現のほうが良い。なぜなら数値間の差に意味がないから。
・欠損値の扱い；ゼロで埋める。欠損値を含む集合を除外。入力として採用しない。
・数値の正規化、正則化。Mini-max normalizaion, z-normazationなど。

過学習
・巨大なNNで発生しやすい。
・過学習を見るときは、訓練誤差とテスト誤差が乖離しないかをチェックする。
・過学習を防ぐのにドロップアウトがある。

データの集合の拡張、水増し
・データが少ないときに増やす方法。Data augmentation。
・分類タスクには良い。逆に、密度推定するデータには水増しは不向き。
・画像のデータ拡張はいろいろな方法がある。
・データ拡張の注意点。9と6のように、回転させると混同するものがある。
・中間層へのノイズ注入を用いて、様々な抽象化レベルでのデータ拡張も可能である。その特徴レベルに応じたdata augmentationとなる。
・モデル自体をいじるよりも、データを増やすほうが良いので、データ拡張は役立つことは多い。そのため汎化性能高上に役立つ。
・不良品検知のように、全体像から見つけるようなタスクの場合は、クロップした画像などにしてしまわないように注意。実際にモデル内で処理されるものに似せたほうが良い。
・CNNで扱えるデータの種類。音声、CTでスキャン画像、カラー画像、動画など。入力が何種類かの要素に分かれていても、次元間で繋がりのあるデータを扱うことができる。

特徴量の転移、転移学習
・DNNは入力を出力とする変換器。入力層の最初は、特徴量抽出、その後タスク固有処理、と2つに分ける事ができる。
・そのため、①から作るのではなく、特徴量抽出の学習済みのモデル(ベースモデル)を用いて別のタスクに使う。
・特徴量抽出がもっとも学習が大変なので、転移学習を用いることで学習コストの削減ができる。
・プレトレーニングは教師なしデータを大量にもちいて行う。

問題解説
・逆伝播、赤い線をたどるとどうなるか。
dE/dx2 = 1, dx2/dw2=6000/20=30なので、dE/dw2=dE/dx2*dx2/dw2=1*30、さらにdE/dx1=dE/dx2*dx2/dx1=1*6000/300=20、dE/dw1=dE/dx2*dx2/dx1*/dx1/dw1=1*20*(300/3)=2000。さらに、dE/dx0=dEdx2*dx2/dx1*dx1/dx0=1*20*(300/100)=60 連鎖率を用いてかけていく。
・クラス分けのモデルでそれぞれの確率が出ている時、x1がC1に属する確率はベイズの定理からp(C1|x1)*p(C1)/p(x)=0.3*0.2/0.1*0.7+0.3*0.2+0.2*0.1=0.4
・条件付き確率　大きいたまのなかで、白い確率は12/16=0.75
・ミニバッチ学習について　k-fold cross validation、k=10, epoch 10のとき、評価の計算は10回ｘ10エポックなので100回。
・汎化性能をはかるにあたり、k-fold cross validationの利点は、データセットのサイズが小さいときに、精度を高めることができる手法。ただし、計算時間がかかる。
・ベイズの定理　縦棒を使う意味　p(A|B)は、Bの事象が起こる条件でのaが起きる確率。後ろがもと、分の、手前の確率。