うごくものづくりのために

技術的な備忘録がメインです。

DeepLearningの勉強メモ

明けましておめでとうございます。
正月休み暇なので、「人工知能でなんとかなりませんか」おじさんに対抗できるよう理論武装しておきたいと思います。
なお、この記事は自分用のメモであるため、読んでもあまり参考にはならないかと思います。。。

書籍「ゼロから作るDeepLearning」をベースに進めていきます。

勉強は書籍を一通り嘗めてやる予定ですが、ブログには新しく学んだことや忘れそうなことだけ書いておくことにします。


3章 ニューラルネットワーク

パーセプトロンニューラルネットワークの違い

パーセプトロン:ステップ関数
ニューラルネットワーク:シグモイド関数

出力層の活性化関数

解決したい問題によって変更する
回帰問題は恒等関数(出力層への入力をそのまま出力する)
2クラス分類はシグモイド等
多クラス分類はソフトマックス

ソフトマックス関数


y_k = \frac{\exp (a_k)}{\sum_{i=1}^{n} \exp(a_i)}

出力の総和が1になるので、各出力を確率として扱うことができる

\exp(n)が、nの値によってすぐ巨大な数になるので、オーバーフロー対策が必要

学習ステップでは使うけど、推論ステップでは用いない
入力と出力の各要素の大小関係は変動しないので、使う意味がほぼ無い

4章 ニューラルネットワークの学習

勾配降下法


\boldsymbol{x_{n+1}} = \boldsymbol{x_n}  - \eta \frac{\partial f}{\boldsymbol{\partial x_n}}

あるサンプル点 \boldsymbol{x_n}偏微分を計算(数値微分)して、傾きを求める
その傾きに学習率  \eta を掛けて、次のサンプル点 \boldsymbol{x_{n+1}} とする

学習率 \etaはハイパーパラメータ
ハイパーパラメータのチューニングは人力が多いが、自動化の手法もある (グリッドサーチ、ベイズ最適化等)

損失関数が重みの関数として表されるので、損失関数の極小値を求めることで重みを最適化(?)できる

重みの初期値

正規分布で初期化するのが標準的みたい
重みの初期値は学習がうまくいくかどうかの重要なパラメータになるので、必ずしも正規分布で初期化するのが正しいとはいえない

5章 誤差逆伝播

計算グラフ

演算をノード、数値を矢印として表現し、グラフで計算を表す
ある値Aに対する値Bの偏微分は、矢印を逆順に辿り、各矢印の偏微分係数をかけ合わせていくだけで計算できる
矢印ごとの偏微分係数は、その矢印を通るすべての演算において再利用可能

出力層の活性化関数と損失関数の組み合わせ

正しい組み合わせを使うと、逆伝播される値が出力信号と教師信号の差分 \boldsymbol{y} - \boldsymbol{t}というシンプルな数式になる。
そうなるように、損失関数が設計されている。

多クラス分類:「ソフトマックス関数」と「交差エントロピー誤差」の組み合わせ
回帰    :「恒等関数」と「二乗和誤差」の組み合わせ

勾配確認

誤差逆伝播法による微分は実装ミスが起こりやすいため、数値微分の結果と比較することで実装の正しさを検証する

6章 学習に関するテクニック

最適化手法

  • SGD 普通の勾配降下法
    最適化対象の関数に等方性が無い場合、収束が遅くなる

  • Momentum 最適化の探索に慣性を導入するイメージ
    探索点の移動のさせ方について、SGDでは勾配 = 速度だが、Momentumでは勾配 = 加速度 になるイメージ

重みの初期値

重みの初期値は重要なハイパーパラメータ
重みの初期値によっては、学習が全く進まないことがある(勾配消失、表現力の制限など)

活性化関数の種類によって、適切な重みの初期値が変わる
ReLUの場合:Heの初期値
 stddiv. \sigma =\sqrt{ \frac{2}{n}} | n : 前層のノード数

sigmoid, tanhの場合:Xavierの初期値
 stddiv. \sigma =\sqrt{ \frac{1}{n}} | n : 前層のノード数

Batch Normalization

層の出力に対して、平均が0, 分散が1となるように正規化を施す

効果

  • 学習を早く進行させられる
  • 初期値にそれほど依存しない
  • 過学習を抑制する

過学習

訓練データのみに適応したネットワークになってしまうこと
ネットワークの表現力が高かったり、訓練データが少ない際に起こりやすい
大きすぎる重みによって、過学習が引き起こされることが多い

対策 - Weight decay 損失関数に重みの2乗ノルムを追加する
重みが大きいと損失関数が大きくなるので、重みが小さくなるように学習が進む

  • Dropout 学習時に隠れ層のニューロンを消去して学習する
    推論時は全ての層を使って計算するが、各ニューロンの出力に対して学習時に消去した割合を乗算する
    仮想的にアンサンブル学習を行っているものとみなせる

ハイパーパラメータの探索

ハイパーパラメータの探索用のパラメータとして、検証データを用意する

DeepLearningで用いるデータセットは - 訓練データ - 検証データ - テストデータ の3つになる

テストデータでハイパーパラメータの探索をしない理由…
テストデータに適したハイパーパラメータになってしまう… → 過学習的なことが起こる

ノウハウで行う部分が大きい
ベイズ最適化という手法で、かっこよくハイパーパラメータの最適化ができる(らしい)

実験計画法とか使えないのかな…?

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

 データの次元

普通のNNは入力データを1次元化してしまうので、2次元画像に含まれる特徴が失われる可能性がある
CNNはデータの形状を維持したまま入力できる