Ｅ資格　深層学習ＤＡＹ１

2021年2月実施の「E資格（2021 #1）」受験資格である
JDLA認定プログラム「３カ月で現場で潰しが効くディープラーニング講座」に挑戦中。

本記事では、JDLA認定プログラム「3カ月で現場で潰しが効くディープラーニング講座」の課題であり、
「深層学習：Day1」実装演習結果をまとめる。


◆DL0001深層学習　識別モデルと生成モデル

〇識別モデル
・データを目的のクラスに分類するモデル
・データからクラスを想定する
・p(Ck/x)
・x（入力値）のもとでCk（何かしらのクラス）が現れる確率は？
・決定木、サポートベクトルマシン。ロジスティック回帰等々
・高次元⇒低次元
・必要な学習データ量…少ない
・応用例は、画像認識、など

〇生成モデル
・特定のクラスのデータから生成する
・p(x/Ck)
・GAN、VAE、隠れマルコフモデル。ベイジアンネットワーク
・低次元⇒高次元
・必要な学習データ量…多い
・応用例は、画像の超解像（Zoomでの解像度が悪い時の画質の向上）


◆DL0002深層学習　識別器（クラシファイヤ）の開発アプローチ

〇識別器の開発には3つのアプローチが存在
・生成モデル
　…ベイズの定理
　…確率的な識別
　…データ量　大
・識別モデル
　…アウトプットとしては、確率を出してくれるだけ
　…自信があるかどうかまで、確率的に算出することが可能
　…確率的な識別
　…データ量　中
・識別関数
　…１か０かを判定するもの。確率的な識別はない。
　…決定的な識別
　…データ量　小


◆DL0003深層学習　識別機における生成モデルと識別モデル

〇識別モデルの限界
 

〇生成モデルで出来ること（識別モデルとの違い）
・データのクラス条件付密度、までを覚えておくことが出来る。

〇識別器における識別モデルと識別関数
 
◆DL000_4_万能近似定理と深さ

〇万能近似定理と深さ
・ニューラルネットワークのような活性化関数をもつ関数であれば、どんなものも数式化出来るんじゃないのか、という推定


◆DL001_ニューラルネットワークの全体像

〇ニューラルネットワークの全体像
・W：重み、B：バイアスを使って、数値の変換を行う作業。
・このWとBを適切な値にするのがNNの目標。
・NNは結局、何かしらの数値を入力して、何かしらの数値を出力する変換器でしかない。
・入力値の数：ノード数、中間の数：ノード数
・入力層：2ノード１層、中間層：3ノード２層、出力層：1ノード1層　など

〇NNの対象の種類
・回帰…結果予測、ランキング
・分類…画像判定、手書き文字認識、花の種類分類

〇回帰分析
・線形回帰、回帰気
・NN

〇分類分析
・ベイズ分類
・ロジスティック回帰
・NN
・決定木
・ランダムフォレスト

〇NNが回帰でも分類でも使用でいる理由
・NNが万能近似定理と呼ばれる所以
・何かしらの数値を入力して、何かしらの数値を出力する

〇深層学習の実用例
・トレードの自動売買
・チャットボット⇒文字列を数値として入力する
・音声解釈⇒音声データを数値と入力する
・囲碁、将棋⇒囲碁などの配置を数値化して入力する



◆DL002_入力層〜中間層

〇NNで使用される記号
・ｘ：入力値、ｗ：重み（＝傾きの度合い）、ｂ：バイアス（＝切片の値）、総入力：u、出力：z、活性化関数：ｆ
・入力層のインデックス：i
・u=Wx+b
・W=(w1, w2, w3・・・・・・,wi)
・x＝（x1, x2, x3・・・・・・・xi）

☆ディープラーニングはなにをしようとしているか。
・プログラムの代わりにニューラルネットワークを利用し、入力値から目的値を求めるモデルを作成する

☆のネットワークを紙にかけ
・入力層: 2ノード1層、中間層: 3ノード2層、出力層: 1ノード1層
・紙に記載のため省略

☆確認テスト(動物分類の図示)
・紙に記載したため割愛

☆確認テスト（総入力値のpythonでの表現）
・u1 = np.dot(x, W1) + b１
・np.dot関数は、ドット積を算出する関数

☆確認テスト（中間の出力を定義しているソースとは）
・u2 = np.dot(z1, W2) + b2


◆DL003_活性化関数

☆復習テスト（線形と非線形の図の違い）
・紙に記載したため割愛
・文字通り、まっすな関数とぐにゃっとした関数
・加法性（たしても同じ）、斉次性（かけても同じ）を満たすのが線形、そうでないのが非線形

〇活性化関数
・NNであれば、線形な関数に対して非線形な活性化関数を活用することで、より多様な表現を出すことが出来るようになっている。

〇中間層用の活性化関数
・ステップ関数（今はあまり使われていない過去のもの、線形の活性化関数）
　…def step_function(x):
        If x > 0:
            Return 1
        Else:
            Return o
　…１か０かのやつ。

・シグモイド関数（非線形の活性化関数）
　…def sigmoid(x):
        Return 1/(1 + np.exp(-X))
　…ｐHのデータみたいなやつ。滑らかな値。
  …勾配消失問題が発生することが判明してしまった。

・ReLU関数（線形関数）
　…def relu(x):
        Retrun  np.maximum(0, x)
　…xが0未満は０、それ以上はY=Xの線形関数
　…勾配消失問題を解決してくれる。
　…スパース化（課題をシンプル化）してくれる。

☆確認テスト（活性化関数を使用しているコードを捜索）
・z1 = functions.relu(u1)
・from common import functions　でfunctions を読み込んでいる


◆DL004_出力層_誤差関数

〇訓練データ
・入力データと出力データをセットにしたデータ

〇誤差関数＝どのくらいあっていたかを示すもの
・2乗和誤差、漸差関数などを用いる。
・各項目の差を二乗して2で割った値。
・誤差関数が小さいほど、正しい予想が出来ていたことを表すため、誤差関数を小さくするｗとｄを求めるのがNNの目的

☆確認テスト（なぜ平均二乗誤差では二乗するのか、２で割るのか）
・プラスとマイナスが相殺されるのを防ぐため
・実際にNNの学習をする際には微分の計算を行うため、計算が簡単になるため。

〇分類問題＝誤差関数として、クロスエントロピーを用いることが多い
　Loss = cross_entropy_error(d,y)

〇平均二乗誤差を求める際のコードは
　Loss = functions.mean_suared_error(d,y)


◆DL005_出力層_活性化関数

〇中間層の活性化関数と、出力層の活性化関数の違い
・中間層：入力値のデータをいい感じに出力するため、比率が変わらないように伝えるため
・出力層：我々のわかりやすい数値に変換するため
：０～１の範囲に比率を保ったまま変換し、全体を足したら１になるような関数

〇出力層の活性化関数
 

☆確認テスト（ソフトマックス関数のコードを書け）
 
Def softmax(x):
    Return np.exp(x) / np.sum(np.exp(x))
プログラムを安定させるためのコード等も含めることも。

☆確認テスト（交差（クロス）エントロピー）＝万能薬としてよく使う
Def cross_entropy_error(d, y):
	Retrun -np.sum(np.log(y[np.arange(batch_sie), d] + 1e-7)) / batch_size
・1e-7　は、logがマイナス無限大に行かないようにするために入れている。


◆DL006_勾配降下法

〇勾配降下法の式
・w(t+1) = w(t) – ε▽E
・ｗ：重み、ｔ：層の数、ε：誤差関数、E：誤差関数
〇学習率（ε）が大きすぎる場合
・最小値を通り過ぎて、発散してしまう。

〇学習率(ε)が小さすぎる場合
・局所極小解に収束してしまうことがある。（1次方程式ではないことが多いので、したに凸な箇所が多数あるため）

〇エポックとは…
・1回のサイクルを回すこと


◆DL007_確率的勾配降下法

〇確率的勾配降下法
・ランダムに抽出したサンプルの誤差から学習を進めること
・毎回異なるデータを使ってモデルが作れるので局所極小解に収束しにくい
・オンライン学習が出来る（最初に全てのデータを準備する必要がない）
　⇔バッチ学習（最初に全てのデータを集める必要があるもの９

☆確認テスト（オンライン学習とは何）
・学習データが入ってくる度に、バイアス値（重みｗ、バイアスｂ）を都度、更新しながら学習を実施すること。
・バッチ学習は、すべてのデータをまとめて使ってパラメーター更新を行う手法。
　…バッチ学習では、データ量が多くなるので、メモリーに保管できるデータの容量があふれてしまう。
・（参考）実際に機械学習で活用するデータ容量は、通常のスマホなどに保管されているデータよりも10倍～100倍に増加している。


◆DL008_ミニバッチ勾配降下法

〇ミニバッチ勾配降下法
・100万枚の画像を学習させたい場合に、それを小分けにすることを「ミニバッチ」という。
・分割した回数に応じて、誤差を割ってあげることで、平均をとる。
・Et = 1/Nt（∑En）

〇ミニバッチ勾配降下法のメリット
・確率的勾配降下法と比べて、同時に１エポックの学習を並行して実施することが出来る。
・同時に計算を並行して行うことを、SIMD並列化という（Single Instruction Multi Data）
・バイアス値は毎回更新は実施しない。
 

☆確認テスト（w(t+1) = w(t) – ε▽Etの表現する意味は？）
・1度学習した際の誤差を、次の学習の際に、重みに反映させることで、精度を向上させる取り組み。
・上記作業を何度も繰り替える作業。
・t -> t+1 -> t+2
重みが −ϵ∇En−ϵ∇Enずつ加えられていくイメージ


◆DL009_誤差勾配の計算

〇誤差関数の求め方
・数値微分を行うことで計算が可能となる。
・数値微分とは、プログラムで微小な数値を生成し、疑似的に微分を計算する一般的な手法。
・問題点としては、計算量が非常に大きくなってしまう点。


◆DL010_誤差逆伝播法_誤差勾配の計算

〇誤差順伝播よりも、誤差逆伝播の方が、データの処理が早い
・計算結果（誤差）から微分を逆算することで、不要な再帰的計算を避けることが出来る。

〇微分の連鎖率を使用
・たすき掛け、みたいな計算手法で、計算量自体を減らすことが可能となる。


☆確認テスト（不要な再帰的処理を避けることが出来るが、そのソースコードを探せ）
・delta2 ＝ functions.d_mean_squared_error(d, y)
・delta1 = np.dot(delta2, w2.t)* functions.d_sigmid(z1)

〇誤差逆伝播で最終的に求めたいものは
・誤差Eを重みｗで微分した時の、最小となるｗを求めたい。（Eの値自体が求めたい値ではない）
 

☆確認テスト（空欄に入るソースコードを探せ）
 
◆DL011_ディープラーニングの開発環境

〇CPU,GPU、FPGA、ASIC(有名なのがTPU)　右のほうが計算速度が速くなる
・CPU…どんなPCにもついている
・GPU…げーむPCなどに
・FPGA…自分でプログラムが出来る計算器
・ASIC…プログラムが出来ない計算器（オーダーで計算の手法が決められたもの）


◆DL012_入力層の設計

〇入力値として取りえるデータ
・連続する実数、確率、フラグ値（＝[0, 0, 1]フラグ立てなど、ワンホットラベルという）

〇使い物にならないデータ
・欠損値が多いデータ
・誤差の多いデータ
・連続性のないデータ
・出力そのもの、出力を加工した情報


◆DL013_過学習

〇パラメータ数が非常に多い、巨大なNNで発生しがち。

〇過学習を見分ける方法
・異なるデータセットを活用して、実際にテストを実施してみる


◆DL014_データ集合の拡張

〇データの水増し（data augmentation）
・学習データが十分に集まらない時に、データを水増ししてあげる手法。
・分類タスク（画像認識）の際によく使われる。数値のデータを増やしたい場合にはあまりあわない、つまり身長のデータを集計する際など。
・画像の明るさを変えたり、ノイズを入れたり、ドロップアウト（画像の一部を隠す）等々
〇データ拡張する際に注意すべき点
・数字のデータなどを回転させると、６と９が見分けがつかなくなる、などなど
・行ってはいけない変換も存在するため、その点は認識が必要

〇ノイズ注入によるデータ拡張
・NNの内部でデータにノイズを加える方法は？
・中間層が100層などの深いNNでは、入力層に近い部分では、細かいパーツなどデータの基本的な特徴が認識されており、出力層に近づくにつれて、全体的な（顔全体など）が認識されている。そこで、入力層に近い部分でノイズを入れると、基本的な特徴を、出力層に近い場所でじゃ、全体的な特徴に対するノイズを出来る。

〇データ拡張の効果と性能評価
・データ拡張により、劇的に汎用性能が高まることが多い。
・ランダムなデータ拡張を行う場合には、楽手データが毎度更新されるため、再現性がない場合も多い。
・求めたい条件に合った「ノイズ」を用いないと意味がないこともある。


◆DL015_CNNで扱えるデータの種類

〇CNNでは次元間でつながりのあるデータを扱える。
・次元間で連続性のあるデータ＝時系列、画像の場所ごとの次元など


◆DL016_特徴量の転移

〇転移学習
・入力層に近い側では、基本的な部分を学習する。特徴量の抽出については、最終的に実施したい目的が異なっていても、同じアルゴリズムを用いるため、そのまま転用することを言う。

〇学習済みの「重み」
・転移学習…初めの特徴量の抽出については、勉強させないのが
・ファインチューニング…特徴量の抽出についても元々のものを用いつつ、さらにPUさせる・
・特徴量の抽出には多くのコストがかかるため、金の削減になる。
![Something went wrong]()