線形回帰モデルの学習
from 線形回帰モデル
直線による回帰(線形回帰モデル)
直線の式$ y = f(x) = w_0 x + w_1をデータに「あてはめる」ことを考える
たとえばこのような感じ
https://gyazo.com/b789411100a7f8b69fba9b8d4c9f7ea8
この場合、傾き$ w_0と切片$ w_1に適切な値を入れると、上のように「データとの誤差が小さい」直線を求めることができる
どうすれば「適切な」$ w_0, w_1を求めることができるか?
平均二乗誤差 MSE(Mean Squared Error)
データと予測値との誤差の平均的な値を考える
$ MSE = \frac{1}{N} \sum^N_{i=1}(y_i - \hat{y_i})^2
$ N:データ数
$ y_i:$ i番目のデータの出力$ yの値
$ \hat{y_i}:$ i番目のデータの予測値(直線の式の$ yの値)
回帰における評価指標で示したRMSEは、このMSEの正の平方根で、回帰における最も基本的な評価指標(スケールをあわせるために平方根をとっている)
ここで、$ \hat{y}_i = w_0 x_i + w_1であるので、MSEは$ w_0, w_1のペアごとに計算できる
MSEを$ w_0と$ w_1の関数と考え、最もMSEが小さくなる$ w_0, w_1の組合せを考える
以下のようなイメージ
https://gyazo.com/547e6aaf5265635ad27dfde4089b5cce
要するにこの「最も谷底」を探せばよい、ということになる
どうすればこの点を見つけられるか?
勾配法による学習
勾配法(最急降下法)
「より低いほう」を探すには、まず$ wの「候補点」を置き、その点での微分によって傾き(勾配)を考えればよい
https://gyazo.com/06e03fb3227d4e41d994d6e001827bdc
微分して正=傾きが正、となったら、$ wをマイナス方向に動かせばよい
傾きが負ならプラスに動かす
いま$ wは$ w_0, w_1の2次元なので、$ w_0方向、$ w_1方向それぞれについて偏微分したベクトルを求めればよい
MSEをいま$ Jとおくと、$ \nabla_w J = \lbrack \frac{\partial J}{\partial w_0} \; \frac{\partial J}{\partial w_1} \rbrack ^Tとなる(計算してみよう)
これを$ J(MSE)の勾配(グラディエント)とよぶ
この反対方向、$ -\nabla_w J方向に進めばよいことになる
https://gyazo.com/dd3c5dd962852dc616db12539372930c
図は『Pythonで動かして学ぶ!あたらしい機械学習の教科書 第3版』より引用
(記号の使い方がちょっと違うが、イメージは同じです)
上の図のように、勾配は丁寧に微分計算すれば、$ x_i, $ y_i, $ \hat{y}_iから四則演算で簡単に計算できる形になる
パラメータをまとめて$ w = \lbrack w_0 \; w_1 \rbrack ^Tとおくと、次のような更新ルール(学習則)によって、$ wを最適解(谷底となる$ w)に近づけることができる
$ w(t+1) = w(t) - \alpha \nabla_wJ|_{w(t)}
$ w(t)は現在(時刻$ t)の$ wの値、という意味(なので更新後が$ w(t+1)となる)
$ \nabla_wJ|_{w(t)}は、現在(時刻$ t)における勾配の値
$ \alphaは学習率とよぶパラメータ
大きいと「たくさん動く」が、収束しにくくなるので、「適度な小ささ」である必要がある
結果的に、$ w_0, w_1それぞれの学習則は次のようになる
$ w_0(t+1) = w_0(t) - \alpha \frac{2}{N} \sum^N_{i=1}(y_i - \hat{y_i})x_i
$ w_1(t+1) = w_1(t) - \alpha \frac{2}{N} \sum^N_{i=1}(y_i - \hat{y_i})
うまく更新が進むとこのように「谷底」に向かっていく
https://gyazo.com/46ff85113a3733c2d330dbdea5769394
解析解を求めることによる学習
解析的に求める場合
勾配法は、繰り返し計算によって近似的な最適解を求める方法(数値解という)
今回の場合は、うまく方程式をとくことで、厳密な最適解を求めることができる(解析解という)
繰り返しではなく、1回の計算で最適解が求まる
線形回帰モデルの場合は、誤差の関数$ Jが二次式になるので、これの勾配がゼロになる点を求めればよい
つまり、$ \frac{\partial J}{\partial w_0} = 0, \frac{\partial J}{\partial w_1}= 0を満たす点なので、この2つの式を連立方程式として解いた解を求めればよいことになる
一次元の線形回帰モデルの場合は、以下の(1)(2)の連立方程式を解けばよい
$ \frac{\partial J}{\partial w_0} = \frac{2}{N} \sum^N_{i=1}(y_i - (w_0 x_i + w_1))x_i = 0  …(1)
$ \frac{\partial J}{\partial w_1} = \frac{2}{N} \sum^N_{i=1}(y_i - (w_0 x_i + w_1)) = 0  …(2)
細かく式展開を見ていくと・・・
(1)の変形
各項に展開して-2で割って整理すると
$ \frac{1}{N}\sum w_0 x_i^2 + \frac{1}{N}\sum w_1 x_i - \frac{1}{N}\sum y_i x_i = 0
$ w_0, w_1は$ Nに無関係なので和記号の外に出すと
$ w_0 \frac{1}{N}\sum x_i^2 + w_1 \frac{1}{N}\sum x_i - \frac{1}{N}\sum y_i x_i = 0 ・・・(1)'
表記を簡単にするため、以下のように決める
$ \frac{1}{N}\sum x_i^2は$ xの平均なので、これを$ <x^2>と表す
$ \frac{1}{N}\sum x_i^2は$ xの2乗の平均なので、これを$ <x>と表す
$ \frac{1}{N}\sum y_i x_iは$ xと$ yの積の平均なので、これを$ <yx>と表す
すると(1)' 式は以下のようにすっきり表現できる
$ w_0 <x^2> + w_1 <x> - <yx>
(2)も同様に変形すると、2つの方程式ができるので、これを連立方程式として解くことで、$ w_0, w_1を求めることができる
(2)の変形は自分でやってみよう!!
ただし、$ <y> = \frac{1}{N} \sum y_iと置くことにする
最終的に、$ w_0, w_1は以下のようになる
$ w_0 = \frac{<yx> -<y><x>}{<x^2>-<x>^2}
$ w_1 = <y> - w_0 <x>
多次元の場合
多次元の線形回帰モデル
説明変数(入力)が多次元の場合の線形回帰
線形重回帰モデルともいう
まずは二次元の場合
データはこんな感じのイメージ
$ x_0-$ x_1平面に対して$ yが決定する真の関数があり、そこにノイズの乗った$ yが観測される
https://gyazo.com/1d60ab2cd797e316b0458b14f9c7b9d2
一次元の場合は直線で当てはめるのが線形回帰だったが、二次元の場合は、平面で当てはめることになる
平面の式は$ y = f(x) = w_0 x_0 + w_1 x_1 + w_2
詳しくは割愛するが、一次元での「解析的に求める場合」と全く同じように、誤算の関数(ここではMSE)を$ Jと置いた場合に、各パラメータ$ w_0, w_1, w_2でそれぞれ偏微分したものを0とした式の連立方程式を解けば、各パラメータが求められる
$ \frac{\partial J}{\partial w_0} = 0, \frac{\partial J}{\partial w_1} = 0, \frac{\partial J}{\partial w_2} = 0
下のような感じで、各点との平均二乗誤差(MSE)が最も小さくなるような平面が求められる
https://gyazo.com/a932a9fee96ad5ac94f4b836c4aa10c6
より多次元の場合
より一般に、$ D次元の場合の線形回帰モデルも同様に考えていける
$ y = f(x) = w_0 x_0 + w_1 x_1 + \dots + w_{D-1} x_{D-1} + w_D
以下のようにベクトルで表すと簡単に表記できる
$ y = f(x) = \bold w^T \bold x
ここで、$ \bold w = \lbrack w_0 \; \dots w_{D-1} \; w_{D} \rbrack ^T, $ \bold x = \lbrack x_0 \; \dots x_{D-1} \; 1 \rbrack ^T
根本的な考え方は一次元のときと同じで、各パラメータでMSEを微分して0と置いた式を連立して解けばよい
いろいろ省略するが、うまく整理していくと行列計算で一気に解析解を求めることができる(なぜこのような形になるかは、調べてみよう)
$ \bold w = (\bold X^T \bold X)^{-1} \bold X^T \bold y
ここで$ \bold X = \begin{pmatrix} x_{1,1} & x_{1,2} & \dots & x_{1,D} \\\ x_{2,1} & x_{2,2} & \dots & x_{2,D} \\\ \vdots & \vdots & \vdots & \vdots \\\ x_{N,1} & x_{N,2} & \dots & x_{N,D} \end{pmatrix}
いずれも、scikit-learnのlinear_model.LinearRegressionで簡単にモデルを作成できる
ただし原理は知っておこう!