E検定取得に向けた学習内容③ ~深層学習前編

E検定取得に向けた学習内容③ ~深層学習前編

先日の、応用数学編機械学習編の続きです。
学んだことを、メモの箇条書きで書いていきます。

深層学習Day1

<プロローグ>

・識別モデル(データ→クラス)と生成モデル(クラス→データ)
・生成モデルの例:隠れマルコフモデル•ベイジアンネットワーク•変分オートエンコーダー(VAE)•敵対的生成ネットワーク(GAN)
・識別器(Classifier)の開発アプローチ
→3種類ある(生成モデル、識別モデル、識別関数)
 ※識別モデルは識別結果の確率が得られる。識別関数では識別結果のみ。

<Section1: 入力層~中間層>

・入力モーダルの最小単位が、入力層における1つのノードとなる。例えば画像なら1pixelが1ノードになるイメージ。
・入力層の各ノードに対して、重みWをかけて足すことで、次の中間層への出力とする。それ以外に新たな項としてバイアスbを足す。
・u(総入力) = W(重み)x(各入力)+b(バイアス)

forwardの中で、入力層・中間層を定義している。上はrelu活性化関数による回帰問題の例。

【確認テスト】
・行列同士の掛け算は、np.dot(x, W1)のように書ける。
・二値分類、多クラス分類、回帰のいずれでも、中間層への入力としては上のように計算できる。

<Section2: 活性化関数>

・sigmoid関数は、信号の強弱を伝えられるようになり、予想ニューラルネットワーク普及のきっかけとなったが、大きな値では出力の変化が微小なため、勾配消失問題を引き起こす事があった。
・現在最も使われている活性化関数はReLU。シンプルだが、勾配消失問題の回避とスパース化に貢献することで良い成果をもたらしている。

活性化関数の種類はほかにも多数存在する。
活性化関数一覧 (2020)

主な活性化関数の定義

【確認テスト】
・活性化関数は、z1 = functions.sigmoid(u)のようにかける。例えばsigmoid関数なら、上のキャプチャのように定義されている。

<Section3: 出力層>

・誤差関数(loss)を最小化するように学習を行う。lossの設定が、モデリングの上で肝の部分で、ここをミスると大抵うまく学習が進まない。
・出力層の活性化関数は解きたい問題によって適したものが異なる(出力の特性のため。線形、2値の合計1、複数値の合計1と、問題によって適した出力が異なる。)
 ・回帰の場合→ReLuなど
 ・二値分類の場合→Sigmoidなど
 ・マルチクラス分類の場合→Softmaxなど

loss関数の定義

【確認テスト】
・cross_entropy_errorに関する実装の確認
・平均二乗誤差も押さえておく(その名の通り、二乗の差を平均したもの)

<Section4: 勾配降下法>

•勾配降下法→全サンプルの平均誤差
•確率的勾配降下法(SGD)→ランダムに抽出したサンプルの誤差
 メリット
 •データが冗⻑な場合の計算コストの軽減
 •望まない局所極小解に収束するリスクの軽減
 •オンライン学習ができる
•ミニバッチ勾配降下法→ランダムに分割したミニバッチに属するサンプルの平均誤差
 •確率的勾配降下法のメリットを損なわず、計算機の計算資源を有効利用できる
 →CPUを利用したスレッド並列化やGPUを利用したSIMD並列化

・勾配降下法の手法としては、有名どころ
 •Momentum
 •AdaGrad
 •Adadelta
 •Adam(今最も使われている)

勾配降下法では全データを使って最適化を行う

【テスト対策】
・Adam/AdaGrad/Momentumあたり、最適化関数の中身は押さえておく必要あり。
・この辺りもゼロから作るDeep Learningに詳しい(第6章の各関数のイメージ図が分かりやすい)
 →深層学習/ゼロから作るDeep Learning 第6章メモ

<Section5: 誤差逆伝搬法>

・微分連鎖律。局所的な微分をチェーンルールで掛け合わせて伝搬する。
・計算結果(=誤差)から微分を逆算することで、不要な再帰的計算を避けて微分を算出できる

誤差逆伝搬の例。backwardに記載されている。

【テスト対策】
・四則演算の誤差逆伝搬、Sigmoid関数やソフトマックス関数など活性化関数の誤差逆伝搬は押さえる必要あり。
・この辺りもゼロから作るDeep Learningに詳しい(第5章の各誤差逆伝搬のイメージ図が分かりやすい)
 →【学習メモ】ゼロから作るDeep Learning【5章】

深層学習Day2

<Section1: 勾配消失問題>

・勾配消失問題:勾配降下法による、更新では下位層のパラメータはほとんど変わらず、訓練は最適値に収束しなくなる。
・勾配消失の解決方法としては以下
 ・活性化関数の選択
  ・sigmoidは、値が大きくなるとほとんど出力が変わらない。
  ・ReLuは、勾配消失問題の回避とスパース化に貢献したことで、今日最も使われている
 ・重みの初期値設定
  ・Xavierの初期値(重みの要素を、前の層のノード数の平方根で除算した値)
   →ReLU関数、シグモイド(ロジスティック)関数、双曲線正接関数
  ・Heの初期値(重みの要素を、前の層のノード数の平方根で除算した値に対し√2をかけ合わせた値)
   →ReLU関数
 ・バッチ正規化
  ・ミニバッチ単位で、入力値のデータの偏りを抑制する手法。活性化関数に値を渡す前後に、バッチ正規化の処理を孕んだ層を加える。

Batch Normalizationの例

【テスト対策】
・ReLUがなぜ有効に効くのか、理論を押さえる。ReLUが画像系でよく使われるのは、マイナスの特徴量が結果に寄与しないから?
・Xavierの初期値やHeの初期値の違い、なぜ効くのかを押さえる。バッチ正規化は、初期値を設定せずともレイヤーの途中(最適化関数の前)で無理やり値の幅を良い感じに変えてしまえば、勾配消失を防げるはず、との考え方。
・この辺りもゼロから作るDeep Learningに詳しい(第6章のp.177~)
 →深層学習/ゼロから作るDeep Learning 第6章メモ

<Section2: 学習率最適化手法>

・最適化手法→momentum、AdaGrad、RMSProp、Adam
・momentum:誤差をパラメータで微分したものと学習率の積を減算した後、現在の重みに前回の重みを減算した値と慣性の積を加算する
・RMSProp:誤差をパラメータで微分したものと再定義した学習率の積を減算する
・Adam:momentumとRMSPropのいいとこどり

最適化手法(Adam)でmnistを学習させた例。バッチ正規化なしだが学習がうまく進んでいる。

【テスト対策】
・Adam/AdaGrad/Momentumあたり、最適化関数の中身は押さえておく必要あり。
・この辺りもゼロから作るDeep Learningに詳しい(第6章の各関数のイメージ図が分かりやすい)
 →深層学習/ゼロから作るDeep Learning 第6章メモ

<Section3: 過学習>

・L1正規化、L2正規化
→重みが大きい値をとることで、過学習が発生することがある(重みが大きい値は、学習において重要な値であり、重みが大きいと過学習が起こる)ため、Weight decayを行う。
・ドロップアウト
→ノードの数が多いことが問題になるため、ランダムにノードを削除して学習させること。データ量を変化させずに、異なるモデルを学習させているとも解釈できる。

過学習を起こしている様子。上記サンプルコードではデータ数を少なくして疑似的に過学習の状態を起こしている。

【テスト対策】
・L1正規化、L2正規化におけるパラメータが0になりえるか
・L1正規化、L2正規化の図の理解

<Section4: 畳み込みニューラルネットワークの概念>

・CNNにおける畳み込み層の考え方
→バイアス、パディング、ストライド、チャンネル
・プーリング層
→max_pooling、average_poolingなど

ConvolutionおよびPoolingの実装

【テスト対策】
・畳み込みを行うとチャネル数を増やすべき理由
なぜCNNでは畳み込​み層のフィルタ数を倍​ずつにしていくのか
・pointwise convolution(1×1の畳み込み)の目的、原理の理解
【CNN】1×1 convolutionって何してんの?

<Section5: 最新のCNN>

最近のCNNだと、以下が周りで話題。押さえておきたい。
・YOLOv5
・EfficientNet
・ViT(Vision Transformer)

サンプルプログラムにあった、Deepな手法。高度手法は層が深くなる。

【テスト対策】
・最新手法で論文をベースに実装されているコードがgithub上に公開されているので、気になるものは自分でも触ってみる。
→例:Paperswithcode(Image Classification on CIFAR-10)
・画像系データセットは種類が豊富。内容、データ形式、目的など押さえておきたい。