(自分用メモ) 回帰とニューラルネット

(自分用メモ) 重回帰と勾配降下法 - gneioagineの日記 の続き。正しさは保証しません。

確率的勾配降下法

勾配降下法では、D個の教師データに対して誤差関数の勾配を求めて重み\mathbf{w}を更新した。
勾配:
\mathrm{grad}_{\mathbf{w}}(E(\mathbf{w})) = (\frac{\partial E(\mathbf{w})}{\partial w_0},\,\frac{\partial E(\mathbf{w})}{\partial w_1},\,...,\,\frac{\partial E(\mathbf{w})}{\partial w_n})
勾配の各次元(i):
\frac{\partial E(\mathbf{w})}{\partial w_i} = 2 \Sigma_{d=1}^{D} x_{i(d)} (\mathbf{w} \cdot \mathbf{x}_{(d)}-y_{(d)})
重み更新:
\mathbf{w}_{new} \leftarrow \mathbf{w} - \alpha \mathrm{grad}_{\mathbf{w}}(E(\mathbf{w}))

D個の教師データを全部読んで勾配を計算→重み更新
D個の教師データを全部読んで勾配を計算→重み更新
...
と繰り返す。

確率的勾配降下法では、1個データ読むごとに勾配を計算して重みを更新する。
1番目の教師データを読んで勾配を計算→重み更新→2番目の教師データを読んで勾配を計算→重み更新→...→D番目の教師データを読んで勾配を計算→重み更新
1番目の教師データを読んで勾配を計算→重み更新→2番目の教師データを読んで勾配を計算→重み更新→...→D番目の教師データを読んで勾配を計算→重み更新
...
という繰り返しになる。
d番目の教師データを読んだ時の勾配の各次元(i):
\frac{\partial E(\mathbf{w})}{\partial w_i} = 2 (\mathbf{w} \cdot \mathbf{x}_{(d)}-y_{(d)})
重み更新:
\mathbf{w}_{new} \leftarrow \mathbf{w} - \alpha \mathrm{grad}_{\mathbf{w}}(E(\mathbf{w}))

ここでの勾配の逆向きは誤差関数E(w_0,w_2,...,w_n) = \Sigma_{d=1}^{D} (\hat{y}_{(d)} - y_{(d)})^2を最小化する向きであるとは限らない。
とはいえ実用上ほぼ確実に誤差関数は減ってくれるし、非凸性にもある程度対処できるので、確率的勾配降下法はよく使われる。
以下では確率的勾配降下法を基本的に用いる。

ロジスティック回帰

二値分類問題では、教師データにおいて目的変数yが値が0または1をとる。
この場合、重回帰では都合が悪い。

例えば説明変数xが2次元として、以下のように教師データがあるとする。
(y=1,\, (x_1,x_2)=(7,-3))
(y=1,\, (x_1,x_2)=(-4,15))
(y=1,\, (x_1,x_2)=(2,2))
(y=0,\, (x_1,x_2)=(2,0))
(y=0,\, (x_1,x_2)=(-6,2))
これを重回帰で最適化してみる。
モデル: \hat{y} = w_0+w_1x_1+w_2x_2

最適な重み: w_0=0.34,w_1=0.097,w_2=0.073

データy データx 予測値\hat{y}
1 (7, -3) \hat{y} = 0.34+0.097*7+0.073*(-3)=0.8
1 (-4, 15) \hat{y} = 1.047
1 (2, 2) \hat{y} = 0.68
0 (3, -1) \hat{y} = 0.558
0 (-6, 2) \hat{y} = -0.096

-

誤差関数E(\mathbf{w}) = 0.4652
誤差がそれなりに大きいように思えるし、4番目のデータでは\hat{y}は0より1に近くなるのであまり望ましくない。


問題の形式と重回帰モデルの相性が悪く、できれば予測値\hat{y}は0〜1をとってほしい。
そこで、以下のようなモデルを導入する。
\hat{y} = \sigma (w_0+w_1x_1+w_2x_2 + ... + w_nx_n) = \sigma (\mathbf{w} \cdot \mathbf{x})
ただし\sigmaはロジスティックシグモイド関数で、以下のように定義される(シグモイド関数とも呼ぶ)。
\sigma(u) = \frac{1}{1+exp(-u)} = \frac{exp(u)}{exp(u)+1}

シグモイド関数の性質は下記のようなもので、二値分類と相性が良い。

  • 定義域が(-∞,∞)、値域が(0,1)で単調増加
  • u=0のとき\sigma(0) = 0.5
  • u<0で急速に0に近づく
  • u>0で急速に1に近づく


By Chrislb (created by Chrislb) [GFDL (http://www.gnu.org/copyleft/fdl.html) or CC-BY-SA-3.0 (http://creativecommons.org/licenses/by-sa/3.0/)], via Wikimedia Commons

このモデルで適切な重みwを推定するのがロジスティック回帰である。
学習した重みを使って分類する場合、\sigma (\mathbf{w} \cdot \mathbf{x}) > 0.5 (⇒(\mathbf{w} \cdot \mathbf{x}) > 0)ならラベル1, そうでないならラベル0として分類する。

このモデルで、例えば重み: w_0=-6,w_1=2,w_2=2として先ほどのデータで予測値を出してみる。

データy データx 予測値\hat{y}
1 (7, -3) \hat{y} = \sigma (-6+2*7+2*(-3))=\frac{1}{1+exp(-2)}=0.88
1 (-4, 15) \hat{y} = 0.99999989
1 (2, 2) \hat{y} = 0.88
0 (3, -1) \hat{y} = 0.12
0 (-6, 2) \hat{y} = 0.00000083

-
誤差がそれなりに小さくなったように思われる。4番目のデータも0に近くなった。
ちなみに、w_0=-12,w_1=4,w_2=4w_0=-18,w_1=6,w_2=6\mathbf{w}の要素の比を一定に保ったまま絶対値を大きくしていけば、各データで\hat{y}とyの差を限りなく0に近づけることができる。
この場合、最適な\mathbf{w}の値を一意に定めることは難しい。


ロジスティック回帰では誤差関数は以下の交差エントロピー関数を使うことが多い。
(誤差関数の適切な選び方は「一般化線形モデル」を学べば分かるかもしれない)
E(\mathbf{w}) = \Sigma_{d=1}^{D} [ -y_{(d)}log(\hat{y}_{(d)}) - (1-y_{(d)})log(1-\hat{y}_{(d)}) ]
各データについて、

  • 教師データのy=1→-log(\hat{y})を加える。\hat{y}が0に近ければ大きく増えて、1に近ければほぼ増えない。
  • 教師データのy=0→-log(1-\hat{y})を加える。\hat{y}が1に近ければ大きく増えて、0に近ければほぼ増えない。

回帰に必要な

  • モデル定義
  • 教師データ
  • 誤差関数の定義

が用意できたので、確率的勾配降下法で最適化していく。

以下では確率的勾配降下法を使うことを前提に、1個のデータについて考える。
E(\mathbf{w}) = -ylog(\hat{y}) - (1-y)log(1-\hat{y}) = -ylog(\sigma(\mathbf{w} \cdot \mathbf{x})) - (1-y)log(1-\sigma(\mathbf{w} \cdot \mathbf{x}))
まず、シグモイド関数微分について以下が成り立つ。
\frac{\partial \sigma(u)}{\partial u} = \frac{\partial}{\partial u} \frac{1}{1+exp(-u)} = \frac{exp(-u)}{(1+exp(-u))^2} = \sigma(u)(1-\sigma(u))
これを使うと
\frac{\partial E(\mathbf{w})}{\partial w_i} = (\hat{y}-y)x_i
が導ける。

ニューラルネット

重回帰やロジスティック回帰でもうまくいかない回帰問題がある。
例えば説明変数xが2次元として、以下のようにデータがあるとする。
(y=1,\, (x_1,x_2)=(1,1))
(y=1,\, (x_1,x_2)=(-1,-1))
(y=0,\, (x_1,x_2)=(-1,1))
(y=0,\, (x_1,x_2)=(1,-1))

これをロジスティック回帰で上手く回帰するには、少なくとも以下の(1)(2)(3)(4)を満たすことが望ましい。
w_0+w_1+w_2>0 ... (1)
w_0-w_1-w_2>0 ... (2)
w_0+w_1-w_2<0 ... (3)
w_0-w_1+w_2<0 ... (4)
しかし、(1)(2)(3)(4)を同時に満たすことはないため、ロジスティック回帰ではうまくいかない。
((1)+(2)よりw_0>0, (3)+(4)よりw_0<0でなければならない)

そこで、天下り的に以下のモデルを導入する。
u_1=w_0+w_1x_1+w_2x_2, z_1=\sigma(u_1)
u_2=w_3+w_4x_1+w_5x_2, z_2=\sigma(u_2)
u_3=w_6+w_7z_1+w_8z_2, \hat{y}=\sigma(u_3)
uやzを除去すると、以下のように表現できる。
\hat{y} = \sigma( w_6 + w_7 \sigma(w_0+w_1x_1+w_2x_2) + w_8 \sigma(w_3+w_4x_1+w_5x_2) )
この予測値\hat{y}も、重回帰やロジスティック回帰と同様重みwと説明変数xの関数である。

重みを天下り的に以下のように設定する。
w_0=-18
w_1=10
w_2=10

  • -

w_3=-18
w_4=-10
w_5=-10

  • -

w_6=-5
w_7=10
w_8=10
予測値を計算する。

データy データx 予測値\hat{y}
1 (1,1) 0.98
1 (-1,-1) 0.98
0 (-1,1) 0.0067
0 (1,-1) 0.0067

ということで、いい感じに予測ができる。

このモデルはニューラルネットの非常に簡単な例となっており、図として表すとよく見る感じのものになる。

このニューラルネットの解釈は以下のようになる。

  • z_1x_1+x_2が1.8以上ならおよそ1、そうでないならおよそ0
  • z_2x_1+x_2が-1.8以下ならおよそ1、そうでないならおよそ0
  • \hat{y}z_1+z_2が0.5以上ならおよそ1、そうでないならおよそ0
  • (ここではz_1z_2のどちらかが1に近いならおよそ1と解釈してもよい)
  • 以上より、x_1+x_2が1.8以上または-1.8以下なら予測値\hat{y}はおよそ1、そうでないならおよそ0

このように、前段の回帰モデルの出力を後段の回帰モデルの入力にするのがニューラルネットである。

誤差関数としてはロジスティック回帰と同様に交差エントロピー関数が使える。
E(\mathbf{w}) = \Sigma_{d=1}^{D} [ -y_{(d)}log(\hat{y}_{(d)}) - (1-y_{(d)})log(1-\hat{y}_{(d)}) ]

誤差逆伝播

回帰に必要な

  • モデル定義
  • 教師データ
  • 誤差関数の定義

が用意できたので、いつもどおり確率的勾配降下法で最適化していく。

説明の都合上、先ほどのものよりもう一段増やしたニューラルネットを扱う。
u_1=w_0+w_1x_1+w_2x_2, z_1=\sigma(u_1)
u_2=w_3+w_4x_1+w_5x_2, z_2=\sigma(u_2)
u_3=w_6+w_7z_1+w_8z_2, z_3=\sigma(u_3)
u_4=w_9+w_{10}z_1+w_{11}z_2, z_4=\sigma(u_4)
u_5=w_{12}+w_{13}z_3+w_{14}z_4, \hat{y}=\sigma(u_5)
E(\mathbf{w}) = -y_{(d)}log(\hat{y}_{(d)}) - (1-y_{(d)})log(1-\hat{y}_{(d)})

勾配\mathrm{grad}_{\mathbf{w}}(E(\mathbf{w}))の計算は力づくでやることも可能ではあるが、直感的には非常に大変そうである。
その勾配の計算に誤差逆伝播法というテクニックを使う。

まずは出力段への重みであるw_{12}w_{13}w_{14}で計算すると、ロジスティック回帰と同様に\frac{\partial E(\mathbf{w})}{\partial w_{14}} = (y-\hat{y})z_{4}などとできる。

また、\frac{\partial E(\mathbf{w})}{\partial u_5}も後で利用するために求める。
E(\mathbf{w}) = -ylog(\sigma(u_5)) - (1-y)log(1-\sigma(u_5))であることから、
\frac{\partial E(\mathbf{w})}{\partial u_5} = y - \sigma(u_5)


続いて、前の段への重みであるw_6w_{11}の勾配を求めてみる。
\frac{\partial E(\mathbf{w})}{\partial w_{11}}
\,\,\,\, = \frac{\partial E(\mathbf{w})}{\partial u_5} \frac{\partial u_5}{\partial u_4} \frac{\partial u_4}{\partial w_{11}}
\,\,\,\, = (y-\sigma(u_5)) z_2 \frac{\partial u_5}{\partial u_4}
\,\,\,\, = (y-\sigma(u_5)) z_2 \frac{\partial u_5}{\partial z_4} \frac{\partial z_4}{\partial u_4}
\,\,\,\, = (y-\sigma(u_5)) z_2 w_{14} \sigma(u_4)(1 - \sigma(u_4))
などとなる。

また、後で必要となるため\frac{\partial E(\mathbf{w})}{\partial u_3}\frac{\partial E(\mathbf{w})}{\partial u_4}も求めておく。
\frac{\partial E(\mathbf{w})}{\partial u_4} = \frac{\partial E(\mathbf{w})}{\partial u_5} \frac{\partial u_5}{\partial u_4} = (y-\sigma(u_5)) w_{14} \sigma(u_4)(1 - \sigma(u_4))
(上の\frac{\partial E(\mathbf{w})}{\partial w_{11}}と似たような計算をする)

さらに前の段への重みであるw_0w_5の勾配を求めてみる。
\frac{\partial E(\mathbf{w})}{\partial w_5} = \frac{\partial E(\mathbf{w})}{\partial u_2} \frac{\partial u_2}{\partial w_5} = x_2 \frac{\partial E(\mathbf{w})}{\partial u_2}
ここで、u_2が変化するとu_3u_4が変化することに注意する必要がある。
偏微分の連鎖公式( http://www.math.kobe-u.ac.jp/HOME/higuchi/h18kogi/sect4.pdf )によると、
\frac{\partial E(\mathbf{w})}{\partial u_2} = \frac{\partial E(\mathbf{w})}{\partial u_3} \frac{\partial u_3}{\partial u_2} +  \frac{\partial E(\mathbf{w})}{\partial u_4} \frac{\partial u_4}{\partial u_2}
のように和の形にする必要がある。
そして、その\frac{\partial E(\mathbf{w})}{\partial u_3}は、\frac{\partial E(\mathbf{w})}{\partial u_2}と同様に後段の情報を用いて計算ができる。
\frac{\partial u_3}{\partial u_2}は、
\frac{\partial u_3}{\partial u_2} = \frac{\partial u_3}{\partial z_2} \frac{\partial z_2}{\partial u_2} = w_8 \sigma(u_2)(1-\sigma(u_2))
などと計算する。


誤差逆伝播法の一般的な方法を述べる。
\delta_j\delta_j=\frac{\partial E(\mathbf{w})}{\partial u_j}として定義すると、
\delta_j = \Sigma_{k \in NextLayer} (\delta_k \frac{\partial u_k}{\partial u_j})
\,\,\,\, = \Sigma_{k \in NextLayer} (\delta_k w_{jk} \sigma(u_j)(1-\sigma(u_j))
として計算できる。(w_{jk}u_jのノードとu_kのノードを接続する重み)
このように、入力層に近い側のデルタは出力層に近い側のデルタに依存する。そのため、デルタは出力層の側から入力層へ向けて順々に計算していく必要がある。これをもって「逆伝播」と呼んでいる。
最初に出力層でデルタを計算するときは、教師データのyの値を用いることができる。

そして重みで誤差関数を偏微分した値は
\frac{\partial E(\mathbf{w})}{\partial w_{jk}} = \frac{\partial E(\mathbf{w})}{\partial u_k} \frac{\partial u_k}{\partial w_{jk}} = \delta_k z_j
となる。(ただし入力層ではzはxになる)