機械学習ぼっち論文読み

一人ぼっちで論文の読み会をするブログ

ニューラルネットの算数: 第2回

(勢いで第1回を書いたけど早速書くのが面倒になってきた….)

第1回の記事で書きましたが,入力 \boldsymbol x_i \in \mathbb{R}^{p} \boldsymbol \theta \in \boldsymbol \Thetaについて

 f(\boldsymbol x;\boldsymbol \theta):=\sigma(\boldsymbol \theta_3 \boldsymbol \sigma( \boldsymbol \theta_2 \boldsymbol \sigma(\boldsymbol \theta_1 \boldsymbol x + \boldsymbol \theta_1') + \boldsymbol \theta_2' )+\theta_3') \in \mathbb{R}

を出力値とするのがニューラルネットワークでした.ニューラルネットワークの使い道はいろいろありますが,典型的なものでは,線形回帰などと同様に,説明変数\boldsymbol x_iと目的変数 y_i \in \mathbb{R}の組(\boldsymbol x_i,y_i)が与えられているとき

 y_i \approx  f(\boldsymbol x_i;\boldsymbol \theta)

となるような\boldsymbol \theta=\hat{\boldsymbol \theta}を探すことで,未知の\boldsymbol xについての yの予測値

 \hat{y}=f(\boldsymbol x;\hat{\boldsymbol \theta})

を得る,というものがあります.第1回で紹介した表現定理は,この予測関数 f(\boldsymbol x; \boldsymbol \theta)が(パラメータの次元を上げれば) 任意の連続関数g(\boldsymbol x) : \mathbb{R}^{p} \to \mathbb{R}を近似できるというものでした.なので,ニューラルネットは(パラメータ数さえ十分大きくとれば)\boldsymbol xyの間にあるどんな関係性も表現することができるといえます.したがって,ニューラルネットワークを用いる際の問題はただ一つで,

どうやって,良いパラメータ \hat{\boldsymbol \theta} \in \boldsymbol \Thetaを見つけるか?

に尽きます.パラメータを推定するためには,良いパラメータの基準となる「損失関数」と,損失関数を最小化する「最適化アルゴリズム」の2つを適切に決定する必要があります.

損失関数は例えば2乗損失 E(\boldsymbol \theta):=\sum_{i=1}^{n}(y_i-f(\boldsymbol x_i;\boldsymbol \theta))^2やCross-entropy \sum_{i=1}^{n} (y_i \log f(\boldsymbol x_i;\boldsymbol \theta) + (1-y_i)\log (1-f(\boldsymbol x_i;\boldsymbol \theta)))などが使われます.どのような損失を使うかによって,推定されるNNの性質が変わるので,どのような損失を使うか真剣に検討する必要はありますが,この記事では一番簡単な2乗損失E(\boldsymbol \theta)を使うことにしましょう.

最適化アルゴリズムは例えば勾配法ニュートン法といった,関数E(\boldsymbol \theta)を最小にする解\hat{\boldsymbol \theta}を探す手続きのことを指します.損失関数の選択は推定されるNNの性質に影響を与えましたが,アルゴリズムの選択は,どのくらいの時間をかければパラメータを推定できるか,という「計算の速度」に影響を与えます*1.最近のNNの学習では確率的勾配法を利用しますが*2,この記事では勾配法を利用することにします.

勾配法は,パラメータを逐次的に更新するアルゴリズムの一つで,適当な初期値\boldsymbol \theta^{(0)} \in \boldsymbol \Thetaを与えた後,

\boldsymbol \theta^{(t+1)} \leftarrow \boldsymbol \theta^{(t)}-\eta \frac{\partial E(\boldsymbol \theta)}{\partial \boldsymbol \theta} \bigg|_{\boldsymbol \theta^{(t)}}

(t=1,2,\ldots,)によってパラメータを更新していきます.\eta \geq 0は学習率と呼ばれるパラメータで,小さすぎると学習が進まず,大きすぎると不安定になるので適切な値を設定する必要があります.理屈の上では\eta=1とか適当においておけば極小点の周りで勝手に勾配\partial E(\boldsymbol \theta)/\partial \boldsymbol \theta\boldsymbol 0に近づくなるはずですが,実際にはそんなにうまくいかないので,反復が進むに連れて\etaを徐々に小さくする,などの戦法が取られます.なので結局のところ勾配\partial E(\boldsymbol \theta)/\partial \boldsymbol \thetaだけ計算できればパラメータ更新ができて,E(\boldsymbol \theta)の勾配は

 \frac{\partial E(\boldsymbol \theta)}{\partial \boldsymbol \theta} \bigg|_{\boldsymbol \theta^{(t)}} = -2\sum_{i=1}^{n}(y_i-f(\boldsymbol x_i;\boldsymbol \theta^{(t)}))\frac{\partial f(\boldsymbol x_i;\boldsymbol \theta)}{\partial \boldsymbol \theta} \bigg|_{\boldsymbol \theta^{(t)}}

となります.だんだん面倒になってきたので詳細は省きますが,NNモデルf(\boldsymbol x_i;\boldsymbol \theta)の勾配を計算するときには誤差逆伝播法(バックプロパゲーション法)というテクニックがよく用いられます.詳細は省くので気になる人はこの手のサイトを読んで下さい.

実際,NNの学習には勾配さえ求まれば良いので必ずしもバックプロパゲーションを理解する必要はありません.愚直に合成関数の微分を書き下していってもよいですし*3,その計算さえ面倒なら数値微分(今風に呼ぶと自動微分?)しても良いです.良しなにやってください.

追記: 数値微分と自動微分は違うというご指摘を受けて訂正記事を書きました・・・.

aokyotojp.hatenablog.jp

*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:バックプロパゲーションは,愚直な微分を上手くきれいに書き下したみたいな感じ