ブログ名

補足記事:損失関数と最適化

本記事の目的

SSDのFine-tuningにおいて,最適化や損失関数などの話が出てきて,それぞれを記事内で説明するのは難しかったため,こちらの補足記事でまとめたいと思います.

ニューラルネットワーク

本シリーズでCNNの話は書いた気がするのですが,まだニューラルネットワーク(以降NN)の説明をしていなかったと思うので,まずはNNについて説明させていただきたいと思います.

ニューラルネットワークは,生物の脳の神経構造機械学習や深層学習で用いられる根本となる数理モデルになります.

生物の脳の神経細胞,すなわちニューロンは,何かしら入力(視覚情報,聴覚情報,etc...)が入った時に,その入力刺激が電気に変換され,電流となって伝送されます.その電流の電位がある閾値を超えた時にシナプスを通じて次のニューロンに伝搬,これを繰り返すことで情報伝搬が行われると言われています.

これを数理モデル(アルゴリズム)として表現したものがニューラルネットワークになります.

これに加え,パーセプトロンというものがあり,深層学習などではこれが使われていたりします.

パーセプトロンには単純パーセプトロンと多層パーセプトロンが存在しますが,まずは単純パーセプトロンについて説明します. (画像) 具体的に例えば x=[x_1,x_2,…x_n] が入力として与えられた時,入力それぞれに対して重みw=[w_1,w_2…w_n]が乗算されます.

出力yは,yに接続されている全ニューロンにおける入力xにwが乗算された値の合計を計算し,この値に対して活性化関数と呼ばれる関数を適用した結果になります.

活性化関数とは,生物の脳でいう「電流の電位がある閾値を超えるか超えないか判別する関数」で,ざっくり言うと次のニューロンに伝送するかしないかを決める関数.シグモイド関数やReLuなど様々なものがあります.

多層パーセプトロンは,この単純パーセプトロンを何層(主に3層)にもしたもので,これをもっと大きくしたものが深層学習というものになります.

重みwの決め方

重みwをどのようにするかによって,出力の結果が全く異なってきます.

パーセプトロンではこの重みwバックプロパゲーション(誤差逆伝播法)で決定します.

バックプロパゲーションとは,入力xに対する出力(予測)yがxの実際の値(正解)のyとの差分から重みwを修正していき,最適なwを探す方法のことです.

この最適なwを探す行為こそ「学習」と呼ばれる行為です.

yは線形式に活性化関数を適用されたもので表すことができるので,深層学習含むパーセプトロンではこのw(線形式に定数項bがつくようであればbも)を探すことが目的となるわけです.

損失関数

wを探すためには,入力xに対する出力(予測)yがxの実際の値(正解)のyとの差分を見ることが必要です.

そしてこの差分を最小化するようなw,それが最適なwとなるわけです.

そこでこの差分を測る関数が必要になるわけで,その関数のことを「損失関数」と呼びます.

主な損失関数には,最小二乗法(正解と予測の差の2乗の値を最小化する方法)で用いられる平均二乗誤差(全ての正解と予測の差の2乗の平均)や分類問題で用いられる交差エントロピー誤差などがあります.

精度が悪く,そもそものアルゴリズムの精度を見直したい場合は,ここを見ることも1つ重要になってきます.

最適化

上述した通り,損失関数を最小にする最適なwを見つけ出すことが重要になって重要になってきます.

この値を見つける方法というのはある程度定式化されている部分があり,その手法のことをOptimizer(最適化手法)と呼びます.

Optimizerにはラグランジュの未定乗数法やニュートン法などがありますが,今回は確率的勾配降下法について説明したいと思います.

確率的勾配降下法(Stochastic Gradient Descent: SGD)

確率的勾配降下法とは簡単に言うと,極小値となるwを探す方法です.

ってことは損失関数E(w)をw微分して0になるところと言いたいのですが,xwもベクトルなので使うことが難しいです.

そこでまず,適当なwを選択します.そのwに対して,損失関数E(w)をw微分したものに学習率ηを掛けたものを引き,それを新たなwとして更新します.具体的には

\bf{w_{t+1}}←\bf{w_t}- \eta \frac{dE(\bf{w})}{d\bf{w}}

これを更新前のwと更新後のwの差が一定の閾値以下に収束するまでorあらかじめ決めたある一定回数(epoch数)まで繰り返し,その結果出力されたwを最適解とする方法です.

しかし問題点が以下のように2つ存在します. * 極小値=最小値とは限らない * ηをどのようにして決めれば良いか?(大きすぎる→極小値を通り越して,振動(行ったり来たり)してしまう,小さすぎる→極小値にたどり着くまで遅くなる)

そこで様々なSGDが存在しますが,その一部を紹介します.

MomentumSGD

更新前のwにも更新していた方向にさらにwを変化させやすくするために減衰率γを加えたSGD

これを用いることによって一個前で振動が起きていても抑制することができ,比較的安定したアルゴリズムです.

\bf{w_{t+1}}←\gamma \bf{w_t}- \eta \frac{dE(\bf{w})}{d\bf{w}}

Adam(Adaptive moment estimation)

最もよく使われるOptimizerで,勾配の情報を指数的に減衰させている. 具体的には,勾配の1次モーメント(平均:m_t)と2次モーメント(分散:v_t)を推定して,それを元にパラメータ更新している. (εは発散抑制係数,^がついているvmはそれぞれvmの傾き)

\bf{w_{t+1}}←\gamma \bf{w_t}-\frac{\eta}{\sqrt{\hat{v_t}}+\epsilon}\hat{m_t}\\
\bf{m_t} = \rho_1\bf{m_{t-1}}+(1-\rho_1)\bf{m_{t-1}}\frac{dE(\bf{w})}{d\bf{w}}\\
\bf{v_t} = \rho_2\bf{v_{t-1}}+(1-\rho_2)\bf{v_{t-1}}(\frac{dE(\bf{w})}{d\bf{w}})^2\\
\bf{m_t} = \rho_1\bf{m_{t-1}}+(1-\rho_1)\bf{m_{t-1}}\frac{dE(\bf{w})}{d\bf{w}}\\
\bf{v_t} = \rho_2\bf{v_{t-1}}+(1-\rho_2)\bf{v_{t-1}}(\frac{dE(\bf{w})}{d\bf{w}})^2\\
\hat{v_t} = \frac{\mathbf{m}_t}{1-\rho_1^t}\\
\hat{m_t} =\frac{\mathbf{v}_t}{1-\rho_2^t}\\

まとめ

本記事ではニューラルネットワークとそこで基本となる損失関数,最適化について説明しました. 機械学習の中でも学習のフェイズでは特に基本となり,よく出てくる話だと思います.

参考文献


前の記事へ 目次に戻る