ちびのはてな

「ちび(猫)」と「キノコ」から生まれた「ちびキノコ」。ドラゴンボール最強!純粋なサイヤ人のように生きたいと思っているモノ作りを楽しむ人です。IT技術で少しでも多くの人が笑顔になってくれたらいいなと。

関数の最小化問題・勾配降下法・最適化アルゴリズムメモ

これは、G検定のための個人的なメモであり、公式テキストから引用しながら自分の言葉でまとめているものである。

関数の最小化問題

ニューラルネットワークやディープニューラルネットワークの「学習」のゴールは、
「予測値」と「実際の値」の差を誤差(損失)として定義し、その誤差を最小化することを目指す。
極端に言えば、損失(誤差)をゼロにすることが目的。

つまり、「予測値」と「実際の値」の差は誤差関数として定義して、得られる誤差を最小化することを目的とするため 関数の最小化問題 という

勾配降下法

上記の 関数の最小化問題 を解く手法として 勾配降下法 がある。
勾配降下法 とは、ニューラルネットワークの重み更新アルゴリズムです。
また、ゴールをなるべく効率よく到達してくれるものが 最適化アルゴリズム である。

勾配降下法 とは、「最小化したい関数がある場合にその関数の勾配を求め、その勾配を元に関数の最小値を探索する手法」
関数の勾配(傾き)を求めるには 微分 。ここで微分が登場する。

学習率

勾配を降下していく際に「どれくらい降下するか」を 学習率 として設定する。

学習率 メリット デメリット
小さい 少しずつ降下するため各所を超えにくい 1回の計算で少ししか降下しないため収束までに時間がかかり、局所最適解に陥る可能性がある
大きい 局所最適解を超えて大域最適解に辿り着く可能性がある 大域最適解を通り越してしまう可能性がある(= オーバーシュート)

勾配降下法の種類

勾配降下法の種類 学習方法 重みの更新タイミング 計算量 備考
バッチ勾配降下法 (最急降下法) バッチ学習 訓練データ全ての誤差を計算して重みを1回更新する(イテレーションとエポックが等しい) 多い 訓練データの量が増加するにつれて計算を行うのが難しくなるため、その場合は ミニバッチ勾配降下法確率的勾配降下法 を利用します
確率的勾配降下法(SGD)*1 逐次学習 訓練データ1つに対して重みを1回更新する (データ1つ毎にイテレーションが増える) 小さい 重みを毎回更新するため、外れ値などの影響を受けやすくなるため毎回のパラメータの更新が安定しないという問題がある
ミニバッチ勾配降下法 ミニバッチ学習 訓練データ複数に対して重みを1回更新する 普通 SGD の欠点である 逐次学習 を補うために、少しだけバッチ学習をするようにしたもの

勾配降下法の欠点

  • 大域最適解 を求めたいが、 局所最適解 にたどり着いてしまうこと
  • 鞍点 にハマること

一般的に勾配降下法で求められる重みが 局所最適解 なのか 大域最適解 なのかは判断することができない。DNN の学習においては 大域最適解 を求められるに越したことはないが、 局所最適解 でもそれなりに誤差は小さくなるだろうからそれで妥協しよう。というスタンスである。

最適化アルゴリズム

さて、なるべく効率よくゴール(損失を最小化)に辿り着くためには、パラメータ(重み、バイアス)やら学習率やらを調整していくわけですが、 この最適なパラメータをなるべく効率的に獲得してくれるもが 最適化アルゴリズム というわけです。

最適化アルゴリズムの種類

最適化アルゴリズム 説明 備考
モーメンタム SGDは収束が遅く、振動や鞍点に陥る問題が発生しやすい。この問題を解決するために生まれたのがモーメンタム。 パラメータが作り出す空間局面をボールが転がって凹みの極値にたどり着くイメージする。局面に摩擦があると速度が減衰する分、余計な振れ幅がなく早く極値に達するようなモデルになる。SGD移動平均 を適用して振動を抑制
NAG(Nesterov accelerated gradient) モーメンタムの改良版。さらに収束への加速を増したものである モーメンタムで損失が落ちるように保証
AdaGrad 学習率を調整していこうという手法の先駆け。モーメンタムやSGDは振動抑制・収束加速には効果がある
RMSprop AdaGrad の改良版
AdaDelta RMSprop の改良版
Adam RMSprop の改良版 モーメンタム + RMSprop

全然わからない!

参考リンク: https://qiita.com/ZoneTsuyoshi/items/8ef6fa1e154d176e25b8

*1:Stochastic Gradient Descentの略