0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

本記事について

ラビットチャレンジの深層学習day2のレポートです。
ラビットチャレンジはStudy-AI開講のE資格受験資格を得られる認定プログラムとなっています。

深層モデルのための学習テクニック

勾配消失問題

誤差逆伝播法

  • 特徴

    • 計算結果(=誤差)から微分を逆算することで、不要な再帰的計算を避けて微分を算出できる
  • 確認テスト

    • 連鎖律の原理を使い、$ \frac{dz}{dx} $を求めよ。
      $$ z = t^2 $$
      $$ t = x + y $$
  • 確認テスト解答

image.png

勾配消失問題

  • 課題

    • 誤差逆伝播法が下位層に進んでいくに連れて、勾配がどんどん緩やかになっていく。
    • そのため、勾配降下法による更新では下位層のパラメータはほとんど変わらず、訓練は最適値に収束しなくなる。
  • なぜ発生するのか

    • 連鎖率を用いて勾配を求める際、各関数の微分値は0から1の値を取るため勾配が小さくなる。
  • 確認テスト

    • シグモイド関数を微分した時、入力値が0の時に最大値をとる。その値はいくつか。
  • 確認テスト解答

image.png

勾配消失の解決方

活性化関数の選択 → ReLU関数

  • 数式
\begin{equation} x(x)=\begin{cases} x & \text{($x>0$)} \\ 0 & \text{($x\leq0$)} \end{cases} \end{equation}
  • サンプルコード
def relu(x):
    return np.maximum(0, x)
  • グラフ

image.png

  • 特徴
    • 最も使われている活性化関数。
    • 勾配消失問題の回避とスパース化に貢献することで良い成果をもたらしている。

重みの初期値設定

Xavier
  • 特徴

    • 重みの要素を前の層のノード数の平方根で除算した値
  • Xavierの初期値を設定する際の活性化関数

    • ReLU関数
    • シグモイド(ロジスティック)関数
    • 双曲線正接関数
He
  • 特徴

    • ReLU関数のようなS字カーブでない関数に利用される
    • 重みの要素を前の層のノード数の平方根で除算した値に対し√2をかけ合わせた値
  • Heの初期値を設定する際の活性化関数

    • Relu関数
  • 参考

  • 確認テスト

    • 重みの初期値に0を設定するとどのような問題が発生するか簡潔に説明せよ。
  • 確認テスト解答

    • 重みが0の場合すべての重みの値が均一に更新されるため、正しい学習が行えない問題が発生する。

バッチ正規化

  • バッチ正規化とは

    • ミニバッチ単位で、入力値のデータの偏りを抑制する手法
  • バッチ正規化の使い所とは

    • 活性化関数に値を渡す前後に、バッチ正規化の処理を持つ層を加える
  • バッチ正規化層への入力値
    $$ u^{(l)} = w^{(l)}z^{(l-1)} + b または z $$

  • 確認テスト

    • 一般的に考えられるバッチ正規化の効果を2点挙げよ。
  • 確認テスト解答

    • 中間層の重みの更新が安定化され学習速度が上がる
    • 正規化により過学習を起きにくくする

Section1 実装演習

  • 勾配消失問題の解決実装

    • 付属のソースコード「2_2_2_vanishing_gradient_modified.ipynb」を利用する
  • 対策をせずに多層ネットワークの学習をした場合

  • 正答率が低いままであり、うまく学習を行えていないことがわかる

image.png

  • ReLUを用いた場合
    • 徐々に正答率が上がり、うまく学習できていることがわかる

image.png

  • sigmoid - Xavier
    • はじめから順調に学習できている

image.png

  • ReLU - He
    • 学習速度が速いことがわかる

image.png

学習率最適化手法

  • 最適化の目的

    • 学習率は大きすぎると発散し、小さすぎると学習の速度が遅くなってしまうため
  • 学習率の決め方

    • 初期の学習率を大きく設定し、徐々に学習率を小さくしていく
    • パラメータ毎に学習率を可変させる
  • 学習率最適化手法

    • モメンタム
    • AdaGrad
    • RMSProp
    • Adam

モメンタム

  • 特徴

    • 勾配降下法誤差をパラメータで微分したものと学習率の積を減算した後、現在の重みに前回の重みを減算した値と慣性の積を加算する
  • 数式
    $$ V_{t} = \mu V_{t-1} - \varepsilon \nabla E $$
    $$ w^{(t+1)} = w^{(t)} + V_{t} $$

  • ソースコード

self.v[key] = self.momentum* self.v[key] -self.learning_rate* grad[key]
params[key] += self.v[key]
  • メリット
    • 局所的最適解にはならず大域的最適解となる
    • 谷間についてから最も低い位置(最適値)にいくまでの時間が早い

AdaGrad

  • 特徴

    • 誤差をパラメータで微分したものと再定義した学習率の積を減算する
  • 数式
    $$ h_{0} = \theta $$
    $$ h_{t} = h_{t-1} - (\nabla E)^2 $$
    $$ w^{(t+1)} = w^{(t)} - \varepsilon \frac{1}{\sqrt{h_{t}} + \theta \nabla E } $$

  • ソースコード

self.h[key] = np.zeros_like(val)
self.h[key] += grad[key] * grad[key]
params[key] -= self.learning_rate* grad[key] / (np.sqrt(self.h[key]) + 1e-7)
  • メリット

    • 勾配の緩やかな斜面に対して最適値に近づける
  • 課題

    • 学習率が徐々に小さくなるので、鞍点問題を引き起こす事があった

RMSProp

  • 特徴

    • 誤差をパラメータで微分したものと再定義した学習率の積を減算する
  • 数式
    $$ h_{t} = \alpha h_{t-1} - (1 - \alpha)(\nabla E)^2 $$
    $$ w^{(t+1)} = w^{(t)} - \varepsilon \frac{1}{\sqrt{h_{t}} + \theta \nabla E } $$

  • ソースコード

self.h[key] *= self.decay_rate
self.h[key] += (1 -self.decay_rate) * grad[key] * grad[key]
params[key] -= self.learning_rate* grad[key] / (np.sqrt(self.h[key]) + 1e-7)
  • メリット
    • 局所的最適解にはならず、大域的最適解となる
    • ハイパーパラメータの調整が必要な場合が少ない

Adam

  • 特徴

    • モメンタムの過去の勾配の指数関数的減衰平均とRMSPropの過去の勾配の2乗の指数関数的減衰平均を含む
  • メリット

    • モメンタムおよびRMSPropの両方のメリットを持つアルゴリズムである

Section2 実装演習

  • 学習率最適化手法

    • 付属のソースコード「2_4_optimizer.ipynb」を利用する
  • 確率的勾配降下法の場合

    • うまく学習できていない

image.png

  • Momentum
    • Momentumでもうまくいかない

image.png

  • AdaGrad
    • うまくいかない…

image.png

  • RSMprop
    • うまく学習できた

image.png

  • Adam
    • Adamでもうまく学習できた

image.png

  • 問題に合わせて使い分けていくのが重要

過学習の抑制

正則化

  • 特徴

    • ネットワークの自由度(層数、ノード数、パラメータの値etc...)を制約すること
  • 正則化手法

    1. L1正則化、L2正則化
    2. ドロップアウト
L1正則化、L2正則化
  • 目的 → Weight decay(荷重減衰)

    • Weight decayとは
      • 誤差に対して、正則化項を加算することで、重みを抑制する
      • 過学習がおこりそうな重みの大きさ以下で重みをコントロールし、かつ重みの大きさにばらつきを出す必要がある
  • 数式

    • p=1のときL1正則化、p=2のときL2正則化という

$$ E_{n}(W) + \frac{1}{p} \lambda ||x||_{p} $$
$$ {| {\bf x} |_p = (\ |x_1|^p + |x_2|^p + \cdots + |x_n|^p )^{1/p}
} $$

  • コード
weight_decay+= weight_decay_lambda*np.sum(np.abs(network.params['W' + str(idx)]))
loss = network.loss(x_batch, d_batch) + weight_decay
np.sum(np.abs(network.params['W' + str(idx)]))
  • 確認テスト
    • 下図について、L1正則化を表しているグラフはどちらか答えよ。

image.png

  • 確認テスト解答
    • L1正則化のグラフは下記の通り

image.png

ドロップアウト
  • 目的

    • ノードの数を減らす
  • 方法

    • ランダムにノードを削除して学習させること
  • メリット

    • データ量を変化させずに異なるモデルを学習させていると解釈できる

Section3 実装演習

  • 過学習解決手法

    • 付属のソースコード「2_5_overfiting.ipynb」を利用する
  • 過学習が起こるようにトレーニング

    • 訓練データには100%正解しているがテストデータは70%程度の正解率になっている

image.png

  • weight decay(L2正則化)を行う
    • テストデータの正解率にはほとんど変化がないが、訓練データの正解率が92%程度になっている

image.png

  • weight decay(L1正則化)を行う
    • 一部の重みが0となる(スパース化)ため特徴的な動きとなる
    • 依然として訓練データの正解率は90%程度、テストデータの正解率は70%程度

image.png

  • ドロップアウト
    • 順調に学習できていることがわかる

image.png

畳み込みニューラルネットワーク

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

  • CNNの構造
    • 入力層の後に畳み込み層、プーリング層(CNN)が使われているのが特徴
    • 入力は下、出力は上になる

image.png

  • CNNで扱えるデータの種類

    • 次元間でつながりのあるデータを扱うことができる
    • 例)音声データ、CTスキャン画像、カラー画像、動画
  • LeNet

    • 特徴
      • 32×32の入力を扱う
      • 出力は10種類

image.png

  • 畳み込み層

    • 畳み込み層では、画像の場合、縦、横、チャンネルの3次元のデータをそのまま学習し、次に伝えることができる
    • 3次元の空間情報も学習できるような層が畳み込み層である
  • 畳み込み層の流れ

    • 入力値にフィルタ(重み)を適用し、出力する
    • 出力値にバイアスを足す
    • 活性化関数にかける
    • 出力される

image.png

  • 全結合層
    • CNNでは、入力層からプーリング層までは次元のつながりを保ったまま(画像のまま)出力される
    • 最後に出力を1次元の形にするのが全結合層

畳み込み層

バイアス
  • 畳み込み層の演算とバイアスの計算イメージ

IMG_3816.PNG

パディング
  • パディングとは
    • 出力画像の大きさを変更するため、入力画像の周りにデータを追加すること
    • 追加するデータは0や最も近い値などを取ることが多い
ストライド
  • ストライドとは
    • フィルタを動かす幅のこと
    • 出力画像のサイズを小さくできる
チャンネル
  • チャンネルとは
    • 入力値の数
    • 例)カラー画像はR、G、Bの3チャンネル

Section4 実装演習

  • 畳み込み層
    • 付属のソースコード「2_6_simple_convolution_network.ipynb」を利用する
    • 利用するデータセットはMNIST

di-01.gif

  • 演習結果
    • 徐々に正答率が上がっていることがわかる
    • 実行に10分程度かかった

image.png

プーリング層

  • 特徴

    • 畳み込み層とは異なり、フィルタや重みを利用しない
    • 入力画像を小さくするために利用される
    • 最大値や平均値をとって演算する
  • 確認テスト

    • サイズ6×6の入力画像を、サイズ2×2のフィルタで畳み込んだ時の出力画像のサイズを答えよ。なおストライドとパディングは1とする。
  • 確認テスト解答

IMG_3817.PNG

最新のCNN

AlexNet

  • 特徴
    • 過学習を防ぐ施策・サイズ4096の全結合層の出力にドロップアウトを使用している
    • 畳み込み層→プーリング層→畳み込み層→プーリング層→畳み込み層→畳み込み層→畳み込み層→プーリング層→全結合層(3層)という構造

image.png

GoogLeNet

  • 特徴
    • AlexNetよりもさらに深い
    • Inceptionモジュールというブロックを構成することで並列計算が可能

実装演習

  • 講義内になかったため割愛

参考

「ディープラーニングG検定公式テキスト」

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?