プログラミング初心者の勉強日記

情報科学専攻です. 機械学習と競技プログラミングについて日々勉強しています.

MENU

パターン認識と機械学習 : 多項式曲線フィッティング

多項式フィッティング

ビショップ本で最初に取り扱っている多項式曲線フィッティングについての備忘録です. (ビショップ本では、この単純な回帰から多くの重要な概念を説明したいらしい.)

多項式フィッテイングとは

まず、実数値の入力変数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交差検定などを行なって決定すると良いです. (交差検定についての記事を書いたのでそちらも是非)

http://linearml.hatenablog.com/entry/2017/09/23/040549linearml.hatenablog.com

多項式曲線フィッテイングの実装例

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