ざっくりML

機械学習に興味ある大学院生によるブログです.

多項式曲線フィッティング

ビショップ本では多項式曲線フィッティングから始まっている. この単純な回帰から多くの重要な概念を説明したいらしい. まず、実数値の入力変数xから、実数値の目的変数tを予測することを考える. 今回は人工的に生成したデータを使って例で考え、後で実装を試みる. ここで訓練データとしてN個のxを並べた、\boldsymbol{x} = (x_1,\cdots,x_N)^{T}とそれぞれに対する観測値である\boldsymbol{t} = (t_1,\cdots,t_N)^{T}が与えられたとする. 例えば、N=10個のデータからなる訓練集合をプロットしたものを以下に載せる. f:id:linearml:20170919065043p:plain ただし、ここでは関数sin(2\pi x)にランダムなノイズを加えて生成したものをプロットしている. この訓練データを用いて、新たな入力変数\hat{x}に対する観測値\hat{t}を予測することが目標である. そのためのアプローチの一つに曲線フィッティングがある. ビショップ本ではあまり形式ばらない形で話を進めている. ここでは以下のような多項式を使ってフィッティングすることを考える.

\displaystyle y(x,\boldsymbol{w}) = \sum_{i=0}^{M}w_{i}x^{i} 

ただし、M多項式の次数である. \boldsymbol{w}に関して線形であることから、線形モデルと呼ばれている. (3章、4章で詳しく議論しているのでそこらへんはまたの機会に) フィッティングでは訓練データを多項式に当てはめて係数の値、つまり\boldsymbol{w}を求める. これは、\boldsymbol{w}をランダムに固定したときの多項式の値と、訓練データの目的変数の値との差を最小化することで達成することができる. 全ての訓練データの入力変数と目的変数との差が小さくなるように作られた曲線が求めるべき曲線ということになるので直感的にも理解しやすい. 誤差関数にも色々あるが、今回は単純で広く用いられている、二乗和誤差で考える.

\displaystyle E(\boldsymbol{w}) = \frac{1}{2}\sum_{n=1}^{N}\{y(x_{n},\boldsymbol{w}) - t_{n}\}^{2}

これを最小にする\boldsymbol{w}を求めるのが目標なので、\boldsymbol{w}偏微分して0と置き、方程式を解くことになる. その微分動作の時に降りてくる指数部の2と相殺させるために係数を1/2にしている. 誤差関数を\boldsymbol{w}偏微分すると次のようになる(演習問題となっている).

\displaystyle \sum_{j=0}^{M}A_{ij}w_{j} = T_{i}
\displaystyle A_{ij} = \sum_{n=1}^{N}(x_{n})^{i+j}
\displaystyle T_{i} = \sum_{n=1}^{N}(x_{n})^{i}t_{n}

この式を\boldsymbol{w}に関して解けば良い. 求まった係数を\boldsymbol{w}^{*}とすると、結果としてy(x,\boldsymbol{w}^{*})が求まった多項式として表される. あとは、次数Mを幾つに選択すれば良いかという問題が残っているが、この問題をモデル選択と呼ぶ. 例として、M = 0,1,3,9に対してフィッテイングした結果と実装したソースを以下に示す.

f:id:linearml:20170919063200p:plainf:id:linearml:20170919063204p:plainf:id:linearml:20170919063208p:plainf:id:linearml:20170919063218p:plain
M = 0,1,3,9に対してのフィッテイング結果

多項式曲線フィッティング

M=3のときが最もよく再現できているように見える. 次数をM=9にした場合、全ての点を通っているのでE(\boldsymbol{w}^{*})=0になっているが曲線は元の形からは程遠い. このような振る舞いを過学習と呼ばれている. 訓練データに対してはうまく表現できていても、新しいデータに対しては全く使い物にならない、汎用性がない. さて、この汎化性能とMの関係を定量的に評価したいときの指標として平均二乗平方根誤差(Root Mean Square error; RMS)というものがある.

\displaystyle E_{RMS} = \sqrt{2E(\boldsymbol{w}^{*})/N}

平均をとることで、サイズが異なるデータに対して比較ができる. 訓練データとテストデータのRMSをグラフ化したものを以下に載せる. f:id:linearml:20170919063356p:plain Mが小さい時は、誤差がかなり大きく、対応する多項式は柔軟性に欠け、元の関数をうまく表現できていない. Mが3から7の間では誤差が小さくうまく表現できているように見える. Mが8を超えると訓練データとの誤差は0に限りなく近くなるがテストデータとの誤差は極端に増える. よってMが大きければ良いわけではない. 今回の場合はM=3で十分であると言える. テイラー展開などの級数展開を思い浮かべると次数を増やすほど良い結果が得られると期待してしまうから困ってしまう. また、訓練データ数を増やしたときの結果を以下に示す.

f:id:linearml:20170919063419p:plainf:id:linearml:20170919063426p:plain

訓練データ数を増やしたとき
図の通り、訓練データ数が多いほど過学習が起きにくい. また、過学習を避けるためにベイズ的アプローチを採用すれば良いがこの話は3章の内容なのでまた今度. この章では、過学習を抑制するためのテクニックとして正則化を紹介している. 誤差関数に対し罰金項を付加することで、係数が大きな値になることを防ごうとしている. 罰金項のうち最も単純なものは係数の2乗和である.

\displaystyle \hat{E}(\boldsymbol{w}) = \frac{1}{2} \sum_{n=1}^{N}\{y(x_{n},\boldsymbol{w})-t_{n}\}^{2} + \frac{\lambda}{2} \boldsymbol{w}^{T}\boldsymbol{w}

で表される. 係数\lambdaは罰金項と二乗誤差の和の項との相対的な重要度を調節している. この場合も先ほどと同様に\boldsymbol{w}偏微分して0と置いて方程式を解けば\boldsymbol{w}^{*}が閉じた形で求まる. 統計学の分野では縮小推定、ニューラルネットワークでは荷重減衰と呼ばれている. \lambdaは交差検定などを行なって決定すると良い.