機械学習を1ヵ月で実践レベルにする #10 (正規化)

  • 3
    いいね
  • 0
    コメント

10日目

Coursera でStanford が提供しているMachine Learning ですが、今日も順調にWEEK 9 を終えました。

過去記事一覧

正規化

昨日、オーバーフィッティングの問題の例を見ましたが、今日はオーバーフィッティングを是正する、正規化についての話です。

正規化についての僕の考え

僕は個人的に、この正規化ってやつは機械学習の肝のひとつだと思っています。例えば最急降下法は、式は難しくても内容としては「予測と実測の差を小さくする方法」というように直感的にわかりやすいです。しかし正規化はこれらに比べると直感的な理解が得にくいです。それにも関わらず、また、一見重要性も理解しにくい割に、実際にはとても重要であるからです。

あとのほうの講座でも正規化にはたびたび触れることになりますので、ここでしっかり理解しておかないと後がきつくなります。

考え方

もう一度、ジャストフィットした例と、オーバーフィッティングした例を見てみます。

overFitting2.pngoverFitting3.png

右のグラフを左のようなグラフの形状に近づけるのが目的で、それこそが正規化です。
いま、左のグラフは、その形状から類推すると、おそらく2次くらいの関数なので次のような式で表すことができるかと思います。

image

次に右のグラフですが、こちらは左に比べて複雑なのでおそらく高次の項があり、それは例えば4次くらいの関数であり、次のような式で表すことができます。

image

この2つの式を比べるとわかると思いますが、右(下)のグラフの式の高次の項の影響が少なくなれば、左(上)のグラフ(の式)に近づきます。これを踏まえた上で、もう一度、コスト関数を最小化することに立ち返ってみます。

image

技巧的ですが、ここに高次の項のペナルティを課してみます。

image

そうすると、最急降下法などで上記のコストを最小にするためのθを選ぼうとすると、必然的にθ3やθ4は0に近い小さい数字となります。その結果、右のグラフはより左のグラフに近づきます。いまのように掛ける数字を大きくすると、θ3やθ4は小さくなり、右のグラフに近づき、掛ける数字を小さくすると、右のオーバーフィットしたグラフになることがわかります。

これを一般化して正規化項を導入したコスト関数は以下のようになります。

image

追加された第2項が正規化のための項です。これで、λ を調整することで適合度を、オーバーフィッティングしないようにコントロールできるようになります。

  • オーバーフィットしている場合 -> λ を大きくしてグラフを滑らかにする
  • アンダーフィットしている場合 -> λ を小さくしてグラフをもう少し複雑にする

正規化項付きの最急降下法

コスト関数

image
(正規化は切片項のθ0には適用しないため、j = 1 からの和をとります)

最急降下法はやはり偏微分です。

Repeat {
image
image
(j=1, 2, 3, ..., n)
}

正規化あり線形回帰のoctave 実装

コスト関数

J = 1/(2*m) * sum((X * theta - y).^2) + lambda/(2*m) * sum(theta(2:end,:).^2);

最急降下法の偏微分項

grad = 1/m * (X' * (sigmoid(X * theta) - y)) + lambda / m * theta;
grad(1) = 1/m * (X' * (sigmoid(X * theta) - y))(1);

または

grad = 1/m * (X' * (sigmoid(X * theta) - y)) + lambda / m * [0 ; theta(2:size(theta), :)];

あとはこれを計算ライブラリに渡せばモデルを得られます。

正規化ありロジスティック回帰のoctave 実装

J = -1/m * sum(y .* log(sigmoid(X * theta)) + (1 - y) .* log(1 - sigmoid(X * theta))) + lambda / 2 /m * sum(theta(2:end,:).^2);

最急降下法の偏微分項

grad = 1/m * (X' * (sigmoid(X * theta) - y)) + lambda / m * [0 ; theta(2:size(theta), :)];;

以上。

最適なλやαを決定する話はまた機会があればします。