(自分用メモ) 回帰とニューラルネット
(自分用メモ) 重回帰と勾配降下法 - gneioagineの日記 の続き。正しさは保証しません。
確率的勾配降下法
勾配降下法では、D個の教師データに対して誤差関数の勾配を求めて重みを更新した。
勾配:
勾配の各次元(i):
重み更新:
D個の教師データを全部読んで勾配を計算→重み更新
D個の教師データを全部読んで勾配を計算→重み更新
...
と繰り返す。
確率的勾配降下法では、1個データ読むごとに勾配を計算して重みを更新する。
1番目の教師データを読んで勾配を計算→重み更新→2番目の教師データを読んで勾配を計算→重み更新→...→D番目の教師データを読んで勾配を計算→重み更新
1番目の教師データを読んで勾配を計算→重み更新→2番目の教師データを読んで勾配を計算→重み更新→...→D番目の教師データを読んで勾配を計算→重み更新
...
という繰り返しになる。
d番目の教師データを読んだ時の勾配の各次元(i):
重み更新:
ここでの勾配の逆向きは誤差関数を最小化する向きであるとは限らない。
とはいえ実用上ほぼ確実に誤差関数は減ってくれるし、非凸性にもある程度対処できるので、確率的勾配降下法はよく使われる。
以下では確率的勾配降下法を基本的に用いる。
ロジスティック回帰
二値分類問題では、教師データにおいて目的変数yが値が0または1をとる。
この場合、重回帰では都合が悪い。
例えば説明変数xが2次元として、以下のように教師データがあるとする。
これを重回帰で最適化してみる。
モデル:
最適な重み:
データy | データx | 予測値 | |
1 | (7, -3) | ||
1 | (-4, 15) | ||
1 | (2, 2) | ||
0 | (3, -1) | ||
0 | (-6, 2) |
-
誤差関数
誤差がそれなりに大きいように思えるし、4番目のデータではは0より1に近くなるのであまり望ましくない。
問題の形式と重回帰モデルの相性が悪く、できれば予測値は0〜1をとってほしい。
そこで、以下のようなモデルを導入する。
ただしはロジスティックシグモイド関数で、以下のように定義される(シグモイド関数とも呼ぶ)。
シグモイド関数の性質は下記のようなもので、二値分類と相性が良い。
- 定義域が(-∞,∞)、値域が(0,1)で単調増加
- u=0のとき
- 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を推定するのがロジスティック回帰である。
学習した重みを使って分類する場合、 (⇒)ならラベル1, そうでないならラベル0として分類する。
このモデルで、例えば重み: として先ほどのデータで予測値を出してみる。
データy | データx | 予測値 | |
1 | (7, -3) | ||
1 | (-4, 15) | ||
1 | (2, 2) | ||
0 | (3, -1) | ||
0 | (-6, 2) |
-
誤差がそれなりに小さくなったように思われる。4番目のデータも0に近くなった。
ちなみに、、との要素の比を一定に保ったまま絶対値を大きくしていけば、各データでとyの差を限りなく0に近づけることができる。
この場合、最適なの値を一意に定めることは難しい。
ロジスティック回帰では誤差関数は以下の交差エントロピー関数を使うことが多い。
(誤差関数の適切な選び方は「一般化線形モデル」を学べば分かるかもしれない)
各データについて、
- 教師データのy=1→を加える。が0に近ければ大きく増えて、1に近ければほぼ増えない。
- 教師データのy=0→を加える。が1に近ければ大きく増えて、0に近ければほぼ増えない。
回帰に必要な
- モデル定義
- 教師データ
- 誤差関数の定義
が用意できたので、確率的勾配降下法で最適化していく。
以下では確率的勾配降下法を使うことを前提に、1個のデータについて考える。
まず、シグモイド関数の微分について以下が成り立つ。
これを使うと
が導ける。
ニューラルネット
重回帰やロジスティック回帰でもうまくいかない回帰問題がある。
例えば説明変数xが2次元として、以下のようにデータがあるとする。
これをロジスティック回帰で上手く回帰するには、少なくとも以下の(1)(2)(3)(4)を満たすことが望ましい。
... (1)
... (2)
... (3)
... (4)
しかし、(1)(2)(3)(4)を同時に満たすことはないため、ロジスティック回帰ではうまくいかない。
((1)+(2)より, (3)+(4)よりでなければならない)
そこで、天下り的に以下のモデルを導入する。
,
,
,
uやzを除去すると、以下のように表現できる。
この予測値も、重回帰やロジスティック回帰と同様重みwと説明変数xの関数である。
重みを天下り的に以下のように設定する。
- -
- -
予測値を計算する。
データy | データx | 予測値 |
1 | (1,1) | 0.98 |
1 | (-1,-1) | 0.98 |
0 | (-1,1) | 0.0067 |
0 | (1,-1) | 0.0067 |
ということで、いい感じに予測ができる。
このモデルはニューラルネットの非常に簡単な例となっており、図として表すとよく見る感じのものになる。
このニューラルネットの解釈は以下のようになる。
- はが1.8以上ならおよそ1、そうでないならおよそ0
- はが-1.8以下ならおよそ1、そうでないならおよそ0
- はが0.5以上ならおよそ1、そうでないならおよそ0
- (ここではとのどちらかが1に近いならおよそ1と解釈してもよい)
- 以上より、が1.8以上または-1.8以下なら予測値はおよそ1、そうでないならおよそ0
このように、前段の回帰モデルの出力を後段の回帰モデルの入力にするのがニューラルネットである。
誤差関数としてはロジスティック回帰と同様に交差エントロピー関数が使える。
誤差逆伝播法
回帰に必要な
- モデル定義
- 教師データ
- 誤差関数の定義
が用意できたので、いつもどおり確率的勾配降下法で最適化していく。
説明の都合上、先ほどのものよりもう一段増やしたニューラルネットを扱う。
,
,
,
,
,
勾配の計算は力づくでやることも可能ではあるが、直感的には非常に大変そうである。
その勾配の計算に誤差逆伝播法というテクニックを使う。
まずは出力段への重みであるで計算すると、ロジスティック回帰と同様になどとできる。
また、も後で利用するために求める。
であることから、
続いて、前の段への重みである〜の勾配を求めてみる。
などとなる。
また、後で必要となるため、も求めておく。
(上のと似たような計算をする)
さらに前の段への重みである〜の勾配を求めてみる。
ここで、が変化するとが変化することに注意する必要がある。
偏微分の連鎖公式( http://www.math.kobe-u.ac.jp/HOME/higuchi/h18kogi/sect4.pdf )によると、
のように和の形にする必要がある。
そして、そのは、と同様に後段の情報を用いて計算ができる。
は、
などと計算する。
誤差逆伝播法の一般的な方法を述べる。
をとして定義すると、
として計算できる。(はのノードとのノードを接続する重み)
このように、入力層に近い側のデルタは出力層に近い側のデルタに依存する。そのため、デルタは出力層の側から入力層へ向けて順々に計算していく必要がある。これをもって「逆伝播」と呼んでいる。
最初に出力層でデルタを計算するときは、教師データのyの値を用いることができる。
そして重みで誤差関数を偏微分した値は
となる。(ただし入力層ではzはxになる)