2021年2月実施の「E資格(2021 #1)」受験資格である
JDLA認定プログラム「3カ月で現場で潰しが効くディープラーニング講座」に挑戦中。
本記事では、JDLA認定プログラム「3カ月で現場で潰しが効くディープラーニング講座」の課題であり、
「深層学習:Day1」実装演習結果をまとめる。
◆DL0001深層学習 識別モデルと生成モデル
〇識別モデル
・データを目的のクラスに分類するモデル
・データからクラスを想定する
・p(Ck/x)
・x(入力値)のもとでCk(何かしらのクラス)が現れる確率は?
・決定木、サポートベクトルマシン。ロジスティック回帰等々
・高次元⇒低次元
・必要な学習データ量…少ない
・応用例は、画像認識、など
〇生成モデル
・特定のクラスのデータから生成する
・p(x/Ck)
・GAN、VAE、隠れマルコフモデル。ベイジアンネットワーク
・低次元⇒高次元
・必要な学習データ量…多い
・応用例は、画像の超解像(Zoomでの解像度が悪い時の画質の向上)
◆DL0002深層学習 識別器(クラシファイヤ)の開発アプローチ
〇識別器の開発には3つのアプローチが存在
・生成モデル
…ベイズの定理
…確率的な識別
…データ量 大
・識別モデル
…アウトプットとしては、確率を出してくれるだけ
…自信があるかどうかまで、確率的に算出することが可能
…確率的な識別
…データ量 中
・識別関数
…1か0かを判定するもの。確率的な識別はない。
…決定的な識別
…データ量 小
◆DL0003深層学習 識別機における生成モデルと識別モデル
〇識別モデルの限界
〇生成モデルで出来ること(識別モデルとの違い)
・データのクラス条件付密度、までを覚えておくことが出来る。
〇識別器における識別モデルと識別関数
◆DL000_4_万能近似定理と深さ
〇万能近似定理と深さ
・ニューラルネットワークのような活性化関数をもつ関数であれば、どんなものも数式化出来るんじゃないのか、という推定
◆DL001_ニューラルネットワークの全体像
〇ニューラルネットワークの全体像
・W:重み、B:バイアスを使って、数値の変換を行う作業。
・このWとBを適切な値にするのがNNの目標。
・NNは結局、何かしらの数値を入力して、何かしらの数値を出力する変換器でしかない。
・入力値の数:ノード数、中間の数:ノード数
・入力層:2ノード1層、中間層:3ノード2層、出力層:1ノード1層 など
〇NNの対象の種類
・回帰…結果予測、ランキング
・分類…画像判定、手書き文字認識、花の種類分類
〇回帰分析
・線形回帰、回帰気
・NN
〇分類分析
・ベイズ分類
・ロジスティック回帰
・NN
・決定木
・ランダムフォレスト
〇NNが回帰でも分類でも使用でいる理由
・NNが万能近似定理と呼ばれる所以
・何かしらの数値を入力して、何かしらの数値を出力する
〇深層学習の実用例
・トレードの自動売買
・チャットボット⇒文字列を数値として入力する
・音声解釈⇒音声データを数値と入力する
・囲碁、将棋⇒囲碁などの配置を数値化して入力する
◆DL002_入力層〜中間層
〇NNで使用される記号
・x:入力値、w:重み(=傾きの度合い)、b:バイアス(=切片の値)、総入力:u、出力:z、活性化関数:f
・入力層のインデックス: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) + b1
・np.dot関数は、ドット積を算出する関数
☆確認テスト(中間の出力を定義しているソースとは)
・u2 = np.dot(z1, W2) + b2
◆DL003_活性化関数
☆復習テスト(線形と非線形の図の違い)
・紙に記載したため割愛
・文字通り、まっすな関数とぐにゃっとした関数
・加法性(たしても同じ)、斉次性(かけても同じ)を満たすのが線形、そうでないのが非線形
〇活性化関数
・NNであれば、線形な関数に対して非線形な活性化関数を活用することで、より多様な表現を出すことが出来るようになっている。
〇中間層用の活性化関数
・ステップ関数(今はあまり使われていない過去のもの、線形の活性化関数)
…def step_function(x):
If x > 0:
Return 1
Else:
Return o
…1か0かのやつ。
・シグモイド関数(非線形の活性化関数)
…def sigmoid(x):
Return 1/(1 + np.exp(-X))
…pHのデータみたいなやつ。滑らかな値。
…勾配消失問題が発生することが判明してしまった。
・ReLU関数(線形関数)
…def relu(x):
Retrun np.maximum(0, x)
…xが0未満は0、それ以上はY=Xの線形関数
…勾配消失問題を解決してくれる。
…スパース化(課題をシンプル化)してくれる。
☆確認テスト(活性化関数を使用しているコードを捜索)
・z1 = functions.relu(u1)
・from common import functions でfunctions を読み込んでいる
◆DL004_出力層_誤差関数
〇訓練データ
・入力データと出力データをセットにしたデータ
〇誤差関数=どのくらいあっていたかを示すもの
・2乗和誤差、漸差関数などを用いる。
・各項目の差を二乗して2で割った値。
・誤差関数が小さいほど、正しい予想が出来ていたことを表すため、誤差関数を小さくするwとdを求めるのがNNの目的
☆確認テスト(なぜ平均二乗誤差では二乗するのか、2で割るのか)
・プラスとマイナスが相殺されるのを防ぐため
・実際にNNの学習をする際には微分の計算を行うため、計算が簡単になるため。
〇分類問題=誤差関数として、クロスエントロピーを用いることが多い
Loss = cross_entropy_error(d,y)
〇平均二乗誤差を求める際のコードは
Loss = functions.mean_suared_error(d,y)
◆DL005_出力層_活性化関数
〇中間層の活性化関数と、出力層の活性化関数の違い
・中間層:入力値のデータをいい感じに出力するため、比率が変わらないように伝えるため
・出力層:我々のわかりやすい数値に変換するため
:0~1の範囲に比率を保ったまま変換し、全体を足したら1になるような関数
〇出力層の活性化関数
☆確認テスト(ソフトマックス関数のコードを書け)
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
・w:重み、t:層の数、ε:誤差関数、E:誤差関数
〇学習率(ε)が大きすぎる場合
・最小値を通り過ぎて、発散してしまう。
〇学習率(ε)が小さすぎる場合
・局所極小解に収束してしまうことがある。(1次方程式ではないことが多いので、したに凸な箇所が多数あるため)
〇エポックとは…
・1回のサイクルを回すこと
◆DL007_確率的勾配降下法
〇確率的勾配降下法
・ランダムに抽出したサンプルの誤差から学習を進めること
・毎回異なるデータを使ってモデルが作れるので局所極小解に収束しにくい
・オンライン学習が出来る(最初に全てのデータを準備する必要がない)
⇔バッチ学習(最初に全てのデータを集める必要があるもの9
☆確認テスト(オンライン学習とは何)
・学習データが入ってくる度に、バイアス値(重みw、バイアスb)を都度、更新しながら学習を実施すること。
・バッチ学習は、すべてのデータをまとめて使ってパラメーター更新を行う手法。
…バッチ学習では、データ量が多くなるので、メモリーに保管できるデータの容量があふれてしまう。
・(参考)実際に機械学習で活用するデータ容量は、通常のスマホなどに保管されているデータよりも10倍~100倍に増加している。
◆DL008_ミニバッチ勾配降下法
〇ミニバッチ勾配降下法
・100万枚の画像を学習させたい場合に、それを小分けにすることを「ミニバッチ」という。
・分割した回数に応じて、誤差を割ってあげることで、平均をとる。
・Et = 1/Nt(∑En)
〇ミニバッチ勾配降下法のメリット
・確率的勾配降下法と比べて、同時に1エポックの学習を並行して実施することが出来る。
・同時に計算を並行して行うことを、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を重みwで微分した時の、最小となるwを求めたい。(Eの値自体が求めたい値ではない)
☆確認テスト(空欄に入るソースコードを探せ)
◆DL011_ディープラーニングの開発環境
〇CPU,GPU、FPGA、ASIC(有名なのがTPU) 右のほうが計算速度が速くなる
・CPU…どんなPCにもついている
・GPU…げーむPCなどに
・FPGA…自分でプログラムが出来る計算器
・ASIC…プログラムが出来ない計算器(オーダーで計算の手法が決められたもの)
◆DL012_入力層の設計
〇入力値として取りえるデータ
・連続する実数、確率、フラグ値(=[0, 0, 1]フラグ立てなど、ワンホットラベルという)
〇使い物にならないデータ
・欠損値が多いデータ
・誤差の多いデータ
・連続性のないデータ
・出力そのもの、出力を加工した情報
◆DL013_過学習
〇パラメータ数が非常に多い、巨大なNNで発生しがち。
〇過学習を見分ける方法
・異なるデータセットを活用して、実際にテストを実施してみる
◆DL014_データ集合の拡張
〇データの水増し(data augmentation)
・学習データが十分に集まらない時に、データを水増ししてあげる手法。
・分類タスク(画像認識)の際によく使われる。数値のデータを増やしたい場合にはあまりあわない、つまり身長のデータを集計する際など。
・画像の明るさを変えたり、ノイズを入れたり、ドロップアウト(画像の一部を隠す)等々
〇データ拡張する際に注意すべき点
・数字のデータなどを回転させると、6と9が見分けがつかなくなる、などなど
・行ってはいけない変換も存在するため、その点は認識が必要
〇ノイズ注入によるデータ拡張
・NNの内部でデータにノイズを加える方法は?
・中間層が100層などの深いNNでは、入力層に近い部分では、細かいパーツなどデータの基本的な特徴が認識されており、出力層に近づくにつれて、全体的な(顔全体など)が認識されている。そこで、入力層に近い部分でノイズを入れると、基本的な特徴を、出力層に近い場所でじゃ、全体的な特徴に対するノイズを出来る。
〇データ拡張の効果と性能評価
・データ拡張により、劇的に汎用性能が高まることが多い。
・ランダムなデータ拡張を行う場合には、楽手データが毎度更新されるため、再現性がない場合も多い。
・求めたい条件に合った「ノイズ」を用いないと意味がないこともある。
◆DL015_CNNで扱えるデータの種類
〇CNNでは次元間でつながりのあるデータを扱える。
・次元間で連続性のあるデータ=時系列、画像の場所ごとの次元など
◆DL016_特徴量の転移
〇転移学習
・入力層に近い側では、基本的な部分を学習する。特徴量の抽出については、最終的に実施したい目的が異なっていても、同じアルゴリズムを用いるため、そのまま転用することを言う。
〇学習済みの「重み」
・転移学習…初めの特徴量の抽出については、勉強させないのが
・ファインチューニング…特徴量の抽出についても元々のものを用いつつ、さらにPUさせる・
・特徴量の抽出には多くのコストがかかるため、金の削減になる。