ニューラルネットの算数: 第2回
(勢いで第1回を書いたけど早速書くのが面倒になってきた….)
第1回の記事で書きましたが,入力とについて
を出力値とするのがニューラルネットワークでした.ニューラルネットワークの使い道はいろいろありますが,典型的なものでは,線形回帰などと同様に,説明変数と目的変数の組が与えられているとき
となるようなを探すことで,未知のについてのの予測値
を得る,というものがあります.第1回で紹介した表現定理は,この予測関数が(パラメータの次元を上げれば) 任意の連続関数を近似できるというものでした.なので,ニューラルネットは(パラメータ数さえ十分大きくとれば)との間にあるどんな関係性も表現することができるといえます.したがって,ニューラルネットワークを用いる際の問題はただ一つで,
どうやって,良いパラメータを見つけるか?
に尽きます.パラメータを推定するためには,良いパラメータの基準となる「損失関数」と,損失関数を最小化する「最適化アルゴリズム」の2つを適切に決定する必要があります.
損失関数は例えば2乗損失やCross-entropy などが使われます.どのような損失を使うかによって,推定されるNNの性質が変わるので,どのような損失を使うか真剣に検討する必要はありますが,この記事では一番簡単な2乗損失を使うことにしましょう.
最適化アルゴリズムは例えば勾配法やニュートン法といった,関数を最小にする解を探す手続きのことを指します.損失関数の選択は推定されるNNの性質に影響を与えましたが,アルゴリズムの選択は,どのくらいの時間をかければパラメータを推定できるか,という「計算の速度」に影響を与えます*1.最近のNNの学習では確率的勾配法を利用しますが*2,この記事では勾配法を利用することにします.
勾配法は,パラメータを逐次的に更新するアルゴリズムの一つで,適当な初期値を与えた後,
()によってパラメータを更新していきます.は学習率と呼ばれるパラメータで,小さすぎると学習が進まず,大きすぎると不安定になるので適切な値を設定する必要があります.理屈の上ではとか適当においておけば極小点の周りで勝手に勾配がに近づくなるはずですが,実際にはそんなにうまくいかないので,反復が進むに連れてを徐々に小さくする,などの戦法が取られます.なので結局のところ勾配だけ計算できればパラメータ更新ができて,の勾配は
となります.だんだん面倒になってきたので詳細は省きますが,NNモデルの勾配を計算するときには誤差逆伝播法(バックプロパゲーション法)というテクニックがよく用いられます.詳細は省くので気になる人はこの手のサイトを読んで下さい.
実際,NNの学習には勾配さえ求まれば良いので必ずしもバックプロパゲーションを理解する必要はありません.愚直に合成関数の微分を書き下していってもよいですし*3,その計算さえ面倒なら数値微分(今風に呼ぶと自動微分?)しても良いです.良しなにやってください.
追記: 数値微分と自動微分は違うというご指摘を受けて訂正記事を書きました・・・.
*1:というと実は語弊があって,NNの最適化は非凸問題でアルゴリズムが謎の挙動をしたりするので,アルゴリズムの選択もNNの性質に影響を与えることはあります.今後紹介することは有るかと思いますが,例えばKeskar, Nitish Shirish, et al. “On large-batch training for deep learning: Generalization gap and sharp minima.” ICLR (2017). などに書いてあります
*2:もっと最近は近似で計算量減らした2次の最適化を用いるのがジャスティスとか論文のイントロで書かれてましたけど,本当??
*3:バックプロパゲーションは,愚直な微分を上手くきれいに書き下したみたいな感じ