Open7

(自分用メモ) 回帰問題と勾配降下法まわりの理解

wanuiwanui

正しさは保証しません。用語は標準的なものではありません。

重回帰

図形によらず、重回帰とはなんぞやというのを理解してみたい。

n個の説明変数 x_1,x_2,...,x_n によって目的変数 y の予測をしたいとする。
予測モデルとして、x_i の重み付き線形和を採用してみる。

\hat{y} = w_0+w_1x_1+w_2x_2 + ... + w_nx_n

( \hat{y} は目的変数 y の予測値。w_0 は説明変数に関わらず一定値のバイアス。)
このとき、適切な重み w_0,w_1,w_2,...,w_n を教師データから推定したい。

xw のどちらが変数なのか混乱しがちなので注意。

  • 推論の文脈では w を固定して x が変わる
    • 推論フェーズではモデルの重みは学習済みのものを使いまわすのが一般的
  • 学習の文脈では x を固定して w が変わる
    • xは 教師データ内の値であるため不変である

という感じで認識しておく。

教師データは目的変数と説明変数セットの組を複数個集めたものである。D個の教師サンプルからなる教師データがあるとする。

(y_{(1)}, (x_{1(1)}, x_{2(1)}, ..., x_{n(1)}))
(y_{(2)}, (x_{1(2)}, x_{2(2)}, ..., x_{n(2)}))
...
(y_{(D)}, (x_{1(D)}, x_{2(D)}, ..., x_{n(D)}))

例えば説明変数が2個で、下記のように教師データとして4個の教師サンプルからなるデータがあるとする。

サンプル1: (y=-10,\, (x_1,x_2)=(2,5))
サンプル2: (y=-2,\, (x_1,x_2)=(3,3))
サンプル3: (y=12,\, (x_1,x_2)=(4,-1))
サンプル4: (y=-13,\, (x_1,x_2)=(-2,3))

ここで適当な2種類の重みを設定し、それぞれ予測値を出してみる。

重みA: w_0=2,w_1=1,w_2=-2
重みB: w_0=0.5,w_1=2,w_2=-3

サンプル名 サンプルy サンプルx 重みAによる予測値 重みBによる予測値
サンプル1 10 (2, 5) \hat{y} = 2 + 1*2 + (-2)*5 = -6 \hat{y} = 0.5 + 2*2 + (-3)*5 = -10.5
サンプル2 -2 (3, 3) \hat{y} = -1 \hat{y} = -2.5
サンプル3 12 (4, -1) \hat{y} = 8 \hat{y} = 11.5
サンプル4 -13 (-2, 3) \hat{y} = -6 \hat{y} = -12.5

教師サンプルの y の値と、重みA・重みBでの予測値を抜粋すると以下のようになる。

教師サンプルy 10 -1 12 -13
重みAでの予測値 -6 -1 8 -6
重みBでの予測値 -10.5 -2.5 11.5 -12.5

パッと見たところ、重みBの予測値のほうが教師データの y に近く、重みBの方が良さそうに思える。

実際に重みBの方が良いことを示すため、「良さ」の評価指標が欲しい。
直感的には、教師データでの y と推定値 \hat{y} の差が小さくなる重みが良いと思われる。
そこで誤差関数 E(w_1,w_2,...,w_n) というものを以下のように定義する。

E(w_0,w_2,...,w_n)
= \Sigma_{d=1}^{D} (\hat{y}_{(d)} - y_{(d)})^2
= \Sigma_{d=1}^{D} (w_0+w_1x_{1(d)}+w_2x_{2(d)} + ... + w_nx_{n(d)} - y_{(d)})^2

この誤差関数の値が小さいほど良い重みであるとみなす。
(なお、誤差関数の選び方には恣意性がある。差の絶対値の和など、二乗和以外のものもありうる。)

実際に先ほどの教師サンプルyと重みの表から、それぞれの重みで誤差関数の値を求めてみる。

教師サンプルy 10 -1 12 -13
重みAでの予測値 -6 -1 8 -6
重みBでの予測値 -10.5 -2.5 11.5 -12.5

重みAでの誤差関数の値: E=(-6-(-10))^2+(-1-(-2))^2+(8-12)^2+(-6-(-13))^2=82
重みBでの誤差関数の値: E=(-10.5-(-10))^2+(-2.5-(-2))^2+(11.5-12)^2+(-12.5-(-13))^2=1.0

重みBの方が誤差関数の値が小くなった。この誤差関数のもとでは、重みBの方が「良い」といえる。

誤差関数を定義すれば、ありとあらゆる w の組み合わせの中で最も誤差関数の値が小さくなる w を「最適な」 w として定義できる。
先ほどのデータでは、最適な w の値はおおよそ w_0=0.22,w_1=2.2,w_2=-2.9 である。
この重みでのyの予測値は(-9.88, -1.88, 11.92, -12.88)となり、誤差関数の値は

E=(-9.88-(-10))^2+(-1.88-(-2))^2+(11.92-12)^2+(-12.88-(-13))^2=0.496

として求められる。

現状の理解としては、回帰問題を構成するためには以下が必要となる。

  • モデル定義(重回帰の場合 \hat{y} = w_0+w_1x_1+w_2x_2 + ... + w_nx_n )
  • 教師データ
  • 誤差関数の定義(差の二乗和 E(w_0,w_2,...,w_n) = \Sigma_{d=1}^{D} (\hat{y} - y)^2 など)

これらを最適化ブラックボックスに入力すれば、誤差関数を最小化するいい感じの重み w を出力してくれる。

wanuiwanui

重回帰の勾配降下法

最適化ブラックボックスの中身をちょっと覗いてみる。

ここからはベクトルを導入していくことにする。重みwとサンプルの説明変数xを以下のようにベクトル化する。

\mathbf{w}=(w_0, w_1, w_2, ..., w_n)
\mathbf{x}=(1, x_1, x_2, ..., x_n)

予測値 \hat{y} は内積を用いて以下のように書ける。

\hat{y} = w_0+w_1x_1+w_2x_2 + ... + w_nx_n
\hat{y} = \mathbf{w} \cdot \mathbf{x}

誤差関数もベクトルを入力にできる。

E(\mathbf{w})

最適化ブラックボックスでやりたいことは、

  • モデル定義(ここでは \hat{y} = \mathbf{w} \cdot \mathbf{x})
  • 教師データ
  • 誤差関数の定義(ここでは差の二乗和 E(\mathbf{w}) = \Sigma_{d=1}^{D} (\hat{y} - y)^2)

が与えられたとき、誤差関数を最小化する \mathbf{w} を求めることである。

\mathbf{w} を繰り返し計算で少しずつ改善してく方針で考える。
十分小さいn+1次元ベクトル \mathbf{v} を用いて

\mathbf{w}_{new} \leftarrow \mathbf{w} + \mathbf{v}
\mathbf{w}_{newnew} \leftarrow \mathbf{w}_{new} + \mathbf{v}_{new}

のように \mathbf{w}\mathbf{v} を足す操作を繰り返して改善をする。

このとき、誤差関数が小さくなるように、 E(\mathbf{w}_{new}) < E(\mathbf{w}) を満たすようにする。

一回の更新において、誤差関数を最も小さくする \mathbf{v} の向きは、誤差関数の勾配 \mathrm{grad}_{\mathbf{w}}(E(\mathbf{w})) の逆向き( -\mathrm{grad}_{\mathbf{w}}(E(\mathbf{w})) と同じ向き)であることが知られている [1]
ただし、 \mathrm{grad}_{\mathbf{w}}(E(\mathbf{w})) はn+1次元のベクトルで、

\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})

である。

重回帰での誤差関数の勾配を求めてみる。まずは3次元、データ2個で考える

E(\mathbf{w}) = (w_0+w_1x_{1(1)}+w_2x_{2(1)} + w_3x_{3(1)} - y_{(1)})^2

+ (w_0+w_1x_{1(2)}+w_2x_{2(2)} + w_3x_{3(2)} - y_{(2)})^2

w_1 で偏微分するとき、関係があるのはw_1を含む項だけで、その値は

(x_{1(1)}^2w_{1}^2+2(w_0+w_2x_{2(1)}+w_3x_{3(1)}-y_{(1)})x_{1(1)}w_1)

+ (x_{1(2)}^2w_{1}^2+2(w_0+w_2x_{2(2)}+w_3x_{3(2)}-y_{(2)})x_{1(2)}w_1)

となる。よって、

\frac{\partial E(\mathbf{w})}{\partial w_1}=2x_{1(1)}^2w_{1}+2(w_0+w_2x_{2(1)}+w_3x_{3(1)}-y_{(1)})x_{1(1)}

+2x_{1(2)}^2w_{1}+2(w_0+w_2x_{2(2)}+w_3x_{3(2)}-y_{(2)})x_{1(2)}

=2(w_0+w_1x_{1(1)}+w_2x_{2(1)}+w_3x_{3(1)}-y_{(1)})x_{1(1)}

+2(w_0+w_1x_{1(2)}+w_2x_{2(2)}+w_3x_{3(2)}-y_{(2)})x_{1(2)}

=2x_{1(1)}(\mathbf{w} \cdot \mathbf{x}_{(1)}-y_{(1)})+2x_{1(2)}(\mathbf{w} \cdot \mathbf{x}_{(2)}-y_{(2)})

一般に、D個のデータがあるとき、重みw_iでの誤差関数の偏微分は以下のようになる。(x_{0(d)} = 1とする)

\frac{\partial E(\mathbf{w})}{\partial w_i} = 2 \Sigma_{d=1}^{D} x_{i(d)} (\mathbf{w} \cdot \mathbf{x}_{(d)}-y_{(d)})

これで勾配が求められる。

\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})

あとはこの勾配に適当な縮小の係数αをかけて、(0<α<<1)

\mathbf{w}_{new} \leftarrow \mathbf{w} - \alpha \mathrm{grad}_{\mathbf{w}}(E(\mathbf{w}))

とwを少しずつ更新していけば、誤差関数の値が小さいwが得られる。

脚注
  1. この性質が成り立たない関数もあると思う。詳しくは知らない ↩︎

wanuiwanui

勾配の向きって何?

誤差関数を最も小さくする \mathbf{v} の向きが -\mathrm{grad}_{\mathbf{w}}(E(\mathbf{w})) と同じ向きであることを軽く検証する。
ひとまず重回帰の二乗誤差のみを対象にする。一回の更新において \mathbf{v} の大きさは一定で、向きは自由に変更できるとする。

ざっくりとしたアイデア:更新量が小さいときには \mathbf{w} 周辺で E(\mathbf{w}) を線形近似できるので、線形近似した超平面上で更新に適した向きを探すことにする。

多変数関数のテーラー展開によると
http://eman-physics.net/math/taylor_multi.html

E(w_0+v_0, w_1+v_1, ...,w_n+v_n)=
E(w_0, w_1, ...,w_n)
+ (v_0(\frac{\partial}{\partial w_0})+v_1(\frac{\partial}{\partial w_1})+...+v_n(\frac{\partial}{\partial w_n}))E(w_0, w_1,...,w_n)
+ (1/2)(v_0(\frac{\partial}{\partial w_0})+v_1(\frac{\partial}{\partial w_1})+...+v_n(\frac{\partial}{\partial w_n}))^2E(w_0+\theta v_0, w_1+\theta v_1,...,w_n+\theta v_n)

となるらしい。(0<\theta<1)

多変数関数の引数をベクトルとして扱うと、

E(w_0+v_0, w_1+v_1, ...,w_n+v_n)=E(\mathbf{w}_{new})
E(w_0, w_1, ...,w_n)=E(\mathbf{w})

であることから、

E(\mathbf{w}_{new}) - E(\mathbf{w}) =
(v_0(\frac{\partial}{\partial w_0})+v_1(\frac{\partial}{\partial w_1})+...+v_n(\frac{\partial}{\partial w_n}))E(\mathbf{w})
+ (1/2)(v_0(\frac{\partial}{\partial w_0})+v_1(\frac{\partial}{\partial w_1})+...+v_n(\frac{\partial}{\partial w_n}))^2E(w_0+\theta v_0, w_1+\theta v_1,...,w_n+\theta v_n)

ここで \mathbf{v} は十分小さいとしているので、 \mathbf{v} の要素同士の掛け算を含む二次の項は無視してよい。よって、

E(\mathbf{w}_{new}) - E(\mathbf{w})

\simeq (v_0(\frac{\partial}{\partial w_0})+v_1(\frac{\partial}{\partial w_1})+...+v_n(\frac{\partial}{\partial w_n}))E(\mathbf{w})

=(v_0(\frac{\partial E(\mathbf{w}) }{\partial w_0})+v_1(\frac{\partial E(\mathbf{w})}{\partial w_1})+...+v_n(\frac{\partial E(\mathbf{w})}{\partial w_n}))

=\mathbf{v} \cdot (\frac{\partial E(\mathbf{w})}{\partial w_0}, \frac{\partial E(\mathbf{w})}{\partial w_1}, ..., \frac{\partial E(\mathbf{w})}{\partial w_n})

=\mathbf{v} \cdot \mathrm{grad}_{\mathbf{w}}(E(\mathbf{w}))

\mathbf{v} を適切な向きにすることで E(\mathbf{w}_{new}) - E(\mathbf{w}) を最小にしたい。(絶対値が最大である負の値にする)。
\mathbf{v} \cdot \mathrm{grad}_{\mathbf{w}}(E(\mathbf{w})) の内積を最小化するような \mathbf{v} の向きを求める。
ここで、\mathbf{v}の大きさは一定だと仮定しており、\mathrm{grad}_{\mathbf{w}}(E(\mathbf{w}))\mathbf{v}に依存しない。
2つのベクトルの大きさが一定であるとき、内積が最も小さくなるのはそれらのベクトルが逆向きのときである。
なので、\mathbf{v}-\mathrm{grad}_{\mathbf{w}}(E(\mathbf{w}))と同じ向きにすればよい。
そのときコサインが-1で、内積の値は-|\mathbf{v}||\mathrm{grad}_{\mathbf{w}}(E(\mathbf{w}))|である。

wanuiwanui

確率的勾配降下法

勾配降下法では、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}))

全教師データを見て勾配を計算していたのが、1サンプルのみから勾配計算するようになったのが分かる。

ここでの勾配の逆向きは誤差関数E(w_0,w_2,...,w_n) = \Sigma_{d=1}^{D} (\hat{y}_{(d)} - y_{(d)})^2を最小化する向きであるとは限らない。
ただ、実用上これでもうまくらしい。ミニバッチがいいとも聞く。よく知らんけど。
以下では確率的勾配降下法を基本的に用いる。

wanuiwanui

ロジスティック回帰

二値分類問題を回帰として解いてみる。

二値分類問題では、教師データにおいて目的変数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に近づく


(Wikipediaより https://en.wikipedia.org/wiki/Logistic_function)

このモデルで適切な重み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}の値を一意に定めることは難しい。

ロジスティック回帰では誤差関数は以下の交差エントロピー関数を使うことが多い。[1]

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

が導ける。

脚注
  1. 誤差関数の適切な選び方は「一般化線形モデル」を学べば分かるかもしれない。知らんけど。 ↩︎

wanuiwanui

単純なニューラルネット回帰モデル

重回帰やロジスティック回帰でもうまくいかない回帰問題がある。
例えば説明変数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を除去すると、x,wと \hat{y} の関係は以下のように表現できる。

\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)}) ]

wanuiwanui

誤差逆伝播法

回帰に必要な

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

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

説明の都合上、先ほどのものよりもう一段増やしたニューラルネットを扱う。

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_3, u_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になる)