2016/10/11

線形モデル − 二乗誤差最小化

複数のデータから何らかの数値を予測したいときに、データの重み付きの足し合わせで予測する方法があります。 これを数式で表すと、$M$ 次元の入力データ $x_m, (m=1, \dots, M)$ に対して、重み $w_m$ を用いて、出力は \[ y = w_0 + \sum_{m=1}^{M} w_m x_m \] となります。 $\boldsymbol{x} = \left[1, x_1, x_2, \dots, x_m \right]^{\top}$、$\boldsymbol{w} = \left[ w_0, w_1, \dots, w_M \right]^{\top}$とベクトル表記をすると、 \[ y = \boldsymbol{w}^{\top} \boldsymbol{x} \] と表すことができます。 予測値 $y$ が身長や体重のような連続値の場合、これは回帰問題と呼ばれ、上の重み付き線形和によるモデルは線形回帰(linear regression)として知られています。 予測値が性別や購入する商品のようにカテゴリである場合は、識別問題(あるいは分類問題)と呼ばれます。

はじめに、回帰問題について考えます。 線形回帰では、重み $w_m$ を決定するのに実際の観測値 $t$ と出力値 $y$ との平均二乗誤差(Mean Square Erorr, MSE)を評価して決定する方法がよく用いられています。誤差として単なる差を使うと、あるサンプルでは誤差+3、あるサンプルでは誤差-3、平均すると誤差0のようなことが起こり得るので、2乗しています。 データを $N$ 回測定したとき、入力用観測値は $\boldsymbol{x}_n, (n=1,\dots, N)$ 、予測用観測値は $\boldsymbol{t}_n$ とかけます。 このとき、平均二乗誤差の最小化は \[ \min_{\boldsymbol{w}} \frac{1}{N} \sum_{n=1}^{N} ( t_n - y_n )^2 = \frac{1}{N} \sum_{n=1}^{N} ( t_n - \boldsymbol{w}^{\top} \boldsymbol{x}_n )^2 \] と書けます。 観測データは $N$ 行 $M$ 列の行列、$\boldsymbol{X} = [ \boldsymbol{x}_1, \dots, \boldsymbol{x}_n ]^\top$、対応する観測値と出力値は $\boldsymbol{t} = [t_1, \dots, t_N]^\top , \boldsymbol{y} = [y_1, \dots, y_N ]^\top$ と書くことができます。 これを用いると、平均二乗誤差の最小化は \[ \min_{\boldsymbol{w}}  \frac{1}{2} || \boldsymbol{t} - \boldsymbol{y} ||^2 = \frac{1}{2} || \boldsymbol{t} - \boldsymbol{X} \boldsymbol{w}||^2 \] と書けます。定数倍しても $\boldsymbol{w}$ の決定には関係ないため、$1/2$をつけています。 最小化するには $\boldsymbol{w}$ について偏微分を行い、$\boldsymbol{0}$となる値を求めれば良いです。 \[ \frac{\partial}{\partial{\boldsymbol{w}}} \left( \frac{1}{2} || \boldsymbol{t} - \boldsymbol{X} \boldsymbol{w}||^2 \right) = - \boldsymbol{X}^\top \left( \boldsymbol{t} - \boldsymbol{X} \boldsymbol{w} \right) = \boldsymbol{0} \] $\boldsymbol{w}$ について解くと、最小二乗解 \[ \boldsymbol{w_\text{MSE}} = (\boldsymbol{X}^\top \boldsymbol{X})^{-1} \boldsymbol{X}^\top \boldsymbol{t} \] を得ます。

次に識別問題について考えます。 識別問題では、$K$ クラス($C_1, \dots, C_K$ )の予測を行うとします。線形回帰と同じように出力を1次元変数、スカラを用いるのには問題があります。 例えば、3クラスを $C_1=1, C_1=2, C_3 =3$ として予測する場合、$C_1$ と $C_2$ は近く、$C_1$ と $C_3$ は遠くなってしまいます。それぞれのクラスはただのラベルで、順序や距離は考えていないので、望ましくないです。 そこでクラスラベルを $K$ 次元のベクトル $\boldsymbol{t} = [0, \dots, 0, 1, 0, \dots, 0]$ で表すようにします。 このベクトルはクラスが $C_k$ のとき、$k$ 番目の要素のみ 1 を持つようなベクトルです。 このようにベクトルを作ることは、One hot encodingと呼ばれます。 $N$ サンプルの観測データに対して、入力は回帰と同じ $\boldsymbol{X}$、ラベルは $\boldsymbol{T} = [\boldsymbol{t}_1, \dots, \boldsymbol{t}_N]^\top $ 、重みを $\boldsymbol{W} = [\boldsymbol{w}_1, \dots, \boldsymbol{w}_K] $ とします。 平均二乗誤差の最小化は以下のように書けます。 \[ \min_{\boldsymbol{W}} \frac{1}{2}  ||\boldsymbol{T} - \boldsymbol{X} \boldsymbol{W} ||_F^2 \] $|| \cdot ||_F$ はフロベニウスノルムで、$ ||X^\top X||_F^2 = Tr(X^\top X) = \sum_i \sum_j  X_{ij}^2$ が成り立ちます。つまり、$K$ クラス分の二乗誤差の期待値を小さくするように重み $\boldsymbol{W}$ を決定しています。 $\boldsymbol{W}$ について偏微分を行います。 \[ \frac{\partial}{\partial{\boldsymbol{W}}} \left( \frac{1}{2}  ||\boldsymbol{T} - \boldsymbol{X} \boldsymbol{W} ||_F^2 \right)  = -\boldsymbol{X}^\top (\boldsymbol{T} - \boldsymbol{XW}) = \boldsymbol{O} \] よって、 \[ \boldsymbol{W_{\text{MSE}} = (\boldsymbol{X}^\top \boldsymbol{X})^{-1} \boldsymbol{X}^\top \boldsymbol{T} }\] を得ます。 $k$クラスの予測結果は $\boldsymbol{W}_{\text{MSE}} = [\boldsymbol{w}_1, \dots, \boldsymbol{w}_K] $ より、 $k$ 列目のベクトル $\boldsymbol{w}_k$ を用いると \[ y_k = \boldsymbol{w}_k^\top \boldsymbol{x} \] となります。 識別規則として、出力が最大となる $k$ を識別の結果とするようにします。 \[ \argmax_{k} y_k = \bm{w}_k^\top \bm{x} \]

2クラスの識別をPythonで実験を行いました。 プログラム作成時の注意点として、逆行列の計算 np.linalg.inv ではなく、線形方程式を解く np.linalg.solve を使う方が良いです。線形方程式を解く方が高速で安定しているためです。

識別境界

線形モデルの二乗誤差最小化はシンプルでわかりやすいですが、外れ値に弱いなど実際のデータには適していないことが多いです。

参考