(自分用メモ) 回帰問題と勾配降下法まわりの理解
正しさは保証しません。用語は標準的なものではありません。
重回帰
図形によらず、重回帰とはなんぞやというのを理解してみたい。
n個の説明変数
予測モデルとして、
(
このとき、適切な重み
- 推論の文脈では
を固定してw が変わるx - 推論フェーズではモデルの重みは学習済みのものを使いまわすのが一般的
- 学習の文脈では
を固定してx が変わるw -
は 教師データ内の値であるため不変であるx
-
という感じで認識しておく。
教師データは目的変数と説明変数セットの組を複数個集めたものである。D個の教師サンプルからなる教師データがあるとする。
例えば説明変数が2個で、下記のように教師データとして4個の教師サンプルからなるデータがあるとする。
ここで適当な2種類の重みを設定し、それぞれ予測値を出してみる。
重みA:
重みB:
サンプル名 | サンプルy | サンプルx | 重みAによる予測値 | 重みBによる予測値 |
---|---|---|---|---|
サンプル1 | 10 | (2, 5) | ||
サンプル2 | -2 | (3, 3) | ||
サンプル3 | 12 | (4, -1) | ||
サンプル4 | -13 | (-2, 3) |
教師サンプルの
教師サンプルy | 10 | -1 | 12 | -13 |
重みAでの予測値 | -6 | -1 | 8 | -6 |
重みBでの予測値 | -10.5 | -2.5 | 11.5 | -12.5 |
パッと見たところ、重みBの予測値のほうが教師データの
実際に重みBの方が良いことを示すため、「良さ」の評価指標が欲しい。
直感的には、教師データでの
そこで誤差関数
この誤差関数の値が小さいほど良い重みであるとみなす。
(なお、誤差関数の選び方には恣意性がある。差の絶対値の和など、二乗和以外のものもありうる。)
実際に先ほどの教師サンプルyと重みの表から、それぞれの重みで誤差関数の値を求めてみる。
教師サンプルy | 10 | -1 | 12 | -13 |
重みAでの予測値 | -6 | -1 | 8 | -6 |
重みBでの予測値 | -10.5 | -2.5 | 11.5 | -12.5 |
重みAでの誤差関数の値:
重みBでの誤差関数の値:
重みBの方が誤差関数の値が小くなった。この誤差関数のもとでは、重みBの方が「良い」といえる。
誤差関数を定義すれば、ありとあらゆる
先ほどのデータでは、最適な
この重みでのyの予測値は(-9.88, -1.88, 11.92, -12.88)となり、誤差関数の値は
として求められる。
現状の理解としては、回帰問題を構成するためには以下が必要となる。
- モデル定義(重回帰の場合
)\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とサンプルの説明変数xを以下のようにベクトル化する。
予測値
誤差関数もベクトルを入力にできる。
最適化ブラックボックスでやりたいことは、
- モデル定義(ここでは
)\hat{y} = \mathbf{w} \cdot \mathbf{x} - 教師データ
- 誤差関数の定義(ここでは差の二乗和
)E(\mathbf{w}) = \Sigma_{d=1}^{D} (\hat{y} - y)^2
が与えられたとき、誤差関数を最小化する
十分小さいn+1次元ベクトル
のように
このとき、誤差関数が小さくなるように、
一回の更新において、誤差関数を最も小さくする
ただし、
である。
重回帰での誤差関数の勾配を求めてみる。まずは3次元、データ2個で考える
となる。よって、
一般に、D個のデータがあるとき、重み
これで勾配が求められる。
あとはこの勾配に適当な縮小の係数αをかけて、(0<α<<1)
とwを少しずつ更新していけば、誤差関数の値が小さいwが得られる。
-
この性質が成り立たない関数もあると思う。詳しくは知らない ↩︎
勾配の向きって何?
誤差関数を最も小さくする
ひとまず重回帰の二乗誤差のみを対象にする。一回の更新において
ざっくりとしたアイデア:更新量が小さいときには
多変数関数のテーラー展開によると
となるらしい。(
多変数関数の引数をベクトルとして扱うと、
であることから、
ここで
ここで、
2つのベクトルの大きさが一定であるとき、内積が最も小さくなるのはそれらのベクトルが逆向きのときである。
なので、
そのときコサインが-1で、内積の値は
確率的勾配降下法
勾配降下法では、D個の教師データに対して誤差関数の勾配を求めて重み
勾配:
勾配の各次元(i):
重み更新:
D個のサンプルからなる教師データを全部読んで勾配を計算→重み更新
D個のサンプルからなる教師データを全部読んで勾配を計算→重み更新
...
と繰り返す。
確率的勾配降下法では、1個サンプル読むごとに勾配を計算して重みを更新する。
1番目の教師サンプルを読んで勾配を計算→重み更新→2番目の教師サンプル読んで勾配を計算→重み更新→...→D番目の教師サンプルを読んで勾配を計算→重み更新
1番目の教師サンプルを読んで勾配を計算→重み更新→2番目の教師サンプル読んで勾配を計算→重み更新→...→D番目の教師サンプルを読んで勾配を計算→重み更新
...
という繰り返しになる。
d番目の教師サンプルを読んだ時の勾配の各次元(i):
重み更新:
全教師データを見て勾配を計算していたのが、1サンプルのみから勾配計算するようになったのが分かる。
ここでの勾配の逆向きは誤差関数
ただ、実用上これでもうまくらしい。ミニバッチがいいとも聞く。よく知らんけど。
以下では確率的勾配降下法を基本的に用いる。
ロジスティック回帰
二値分類問題を回帰として解いてみる。
二値分類問題では、教師データにおいて目的変数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)で単調増加
- u=0のとき
\sigma(0) = 0.5 - u<0で急速に0に近づく
- u>0で急速に1に近づく
(Wikipediaより https://en.wikipedia.org/wiki/Logistic_function)
このモデルで適切な重みwを推定するのがロジスティック回帰である。
学習した重みを使って分類する場合、
このモデルで、例えば重み
サンプルy | サンプルx | 予測値 |
---|---|---|
1 | (7, -3) | |
1 | (-4, 15) | |
1 | (2, 2) | |
0 | (3, -1) | |
0 | (-6, 2) |
誤差がそれなりに小さくなったように思われる。4番目のデータも0に近くなった。
ちなみに、
この場合、最適な
ロジスティック回帰では誤差関数は以下の交差エントロピー関数を使うことが多い。[1]
直感的な意味づけとしては、各サンプルについて、
- 教師サンプルのy=1→
を加える。-log(\hat{y}) が0に近ければ大きく誤差が増えて、1に近ければほぼ増えない。\hat{y} - 教師サンプルのy=0→
を加える。-log(1-\hat{y}) が1に近ければ大きく誤差が増えて、0に近ければほぼ増えない。\hat{y}
回帰に必要な
- モデル定義
- 教師データ
- 誤差関数の定義
が用意できたので、確率的勾配降下法で最適化していく。
以下では確率的勾配降下法を使うことを前提に、1個のサンプルについて考える。
まず、シグモイド関数の微分について以下が成り立つ。
これを使うと
が導ける。
-
誤差関数の適切な選び方は「一般化線形モデル」を学べば分かるかもしれない。知らんけど。 ↩︎
単純なニューラルネット回帰モデル
重回帰やロジスティック回帰でもうまくいかない回帰問題がある。
例えば説明変数xが2次元として、以下のようにデータがあるとする。
これをロジスティック回帰で上手く回帰するには、少なくとも以下の(1)(2)(3)(4)を満たすことが望ましい。
しかし、(1)(2)(3)(4)を同時に満たすことはないため、ロジスティック回帰ではうまくいかない。
((1)+(2)より
そこで、天下り的に以下のような複雑なモデルを導入する。
uやzを除去すると、x,wと
この予測値
重みを天下り的に以下のように設定する。
ここから予測値を計算してみる。
データy | データx | 予測値 |
---|---|---|
1 | (1,1) | 0.98 |
1 | (-1,-1) | 0.98 |
0 | (-1,1) | 0.0067 |
0 | (1,-1) | 0.0067 |
ということで、いい感じに予測ができている。
このモデルはニューラルネットの非常に簡単な例となっており、図として表すとよく見る感じのものになる。
このニューラルネットの解釈は以下のようになる。
-
はz_1 が1.8以上ならおよそ1、そうでないならおよそ0x_1+x_2 -
はz_2 が-1.8以下ならおよそ1、そうでないならおよそ0x_1+x_2 -
は\hat{y} が0.5以上ならおよそ1、そうでないならおよそ0z_1+z_2 - (ここでは
とz_1 のどちらかが1に近いならおよそ1と解釈してもよい)z_2 - 以上より、
が1.8以上または-1.8以下なら予測値x_1+x_2 はおよそ1、そうでないならおよそ0\hat{y}
このように、前段の回帰モデルの出力を後段の回帰モデルの入力にするのがニューラルネットである。
多段になることにより、ただの重回帰やロジスティック回帰では対応できなかった分類が実現できていることが分かる。
誤差関数としてはロジスティック回帰と同様に交差エントロピー関数が使える。
誤差逆伝播法
回帰に必要な
- モデル定義
- 教師データ
- 誤差関数の定義
が用意できたので、いつもどおり確率的勾配降下法で最適化していく。
説明の都合上、先ほどのものよりもう一段増やしたニューラルネットを扱う。
勾配
その勾配の計算に誤差逆伝播法というテクニックを使う。
まずは出力段への重みである
また、
続いて、前の段への重みである
などとなる。
また、後で必要となるため
(上の
さらに前の段への重みである
ここで、
偏微分の連鎖公式( http://www.math.kobe-u.ac.jp/HOME/higuchi/h18kogi/sect4.pdf )によると、
のように和の形にする必要がある。
そして、その
などと計算する。
だいたい掴めてきたので、誤差逆伝播法の一般的な方法を述べる。
として計算できる。(
このように、入力層に近い側のデルタは出力層に近い側のデルタに依存する。そのため、デルタは出力層の側から入力層へ向けて順々に計算していく必要がある。これをもって「逆伝播」と呼んでいる。
最初に出力層でデルタを計算するときは、教師データのyの値を用いることができる。
そして重みで誤差関数を偏微分した値は
となる。(ただし入力層ではzはxになる)