雑記 in hibernation

頭の整理と備忘録

正則化をなるべく丁寧に理解する - 実践編 -

機械学習における正則化の原理と挙動を理解するため、手法の概要をまとめると共に、正則化を用いた最適化をシミュレートして挙動を確認します。

この記事では -実践編- と題して、簡単な損失関数を例に正則化を実装し、効果をシミュレートしてみます。具体的な手法(L1,L2正規化)の原理の解説については、 -理屈編- として前回の記事で行っていますのでそちらをご参照ください。

なお、この記事は個人的な備忘録として作成しています。

 

1. はじめに

正則化は着想自体は単純であり、数式が苦手な人(=我)でも原理を理解することは十分可能かと思います。しかし、いくら数式で理屈をこねたところで実際の挙動のイメージが掴めず、それ故に実使用上の学習における動作についても今ひとつ理解が深まらない、というのが正直なところではないでしょうか。そこで本記事では簡単な損失関数に対して正則化を適用して最適化するプログラムを実装し、その挙動を確認することで理解の一助としたいと思います。

なお、本記事は「正則化をなるべく丁寧に理解する - 理屈編 -」の続きであり、これに記載の内容を前提に本記事を作成しています。「いきなり正則化項の等高線とか出てきて意味わからんぞ」って方はぜひ前回の記事から読んでみてください。

正則化をなるべく丁寧に理解する - 理屈編 - - 雑記 in hibernation

 

 

2. おさらい

前回の記事の内容をざっくりおさらいしておきます。

正則化とは、過学習を抑える手法の一つです。損失関数に正則化項を加えるると、正則化項がパラメータの大きさに対するペナルティとして働き、最適解の値が大きくなりすぎることを防ぐ手法です。

正則化を用いた最適化を数式で表すと、以下のようになります。

 \newcommand{\argmin}{\mathop{\rm arg~min}\limits} \displaystyle \argmin_{\boldsymbol{w}} \{ L(\boldsymbol{w}) +\lambda R(\boldsymbol{w}) \}

ただし、

   \boldsymbol{w} = ( w_{0}, w_{1}, ... , w_{n} )^T : モデルパラメータ(学習により獲得したい値)

  L(\boldsymbol{w}) : 損失関数 (Loss Function)

  R(\boldsymbol{w}) : 正則化項 (Regularizer)

 \lambda : 正則化パラメータ これにより正則化項の影響力を調整する

 

そして、正則化 R(\boldsymbol{w}) をL1ノルムで定義する手法をL1正則化(Lasso)1, L2ノルムで定義する手法をL2正則化(Ridge) と呼びます。それぞれを数式に表すと、以下のようになります。

 

L1正則化(lasso)

 \newcommand{\argmin}{\mathop{\rm arg~min}\limits} \displaystyle \argmin_{\boldsymbol{w}}  \{ L(\boldsymbol{w}) + \lambda \sum_{i=0}^n |w_i| \}

ただし、 

    \boldsymbol{w} = ( w_{0}, w_{1}, ... , w_{n} )^T : モデルパラメータ(学習により獲得したい値)

   L(\boldsymbol{w}) : 損失関数

  \lambda : 正則化パラメータ

 

L2正則化(ridge)

 \newcommand{\argmin}{\mathop{\rm arg~min}\limits} \displaystyle \argmin_{\boldsymbol{w}}  \{ L(\boldsymbol{w}) + \frac{\lambda}{2} \sum_{i=0}^n w_i^2 \}

ただし、

    \boldsymbol{w} = ( w_{0}, w_{1}, ... , w_{n} )^T : モデルパラメータ

   L(\boldsymbol{w}) : 損失関数

  \lambda : 正則化パラメータ 

 

L2正則化ではパラメータ  \boldsymbol{w}の全ての要素に対して原点方向に抑制がかかる傾向があるのに対し、L1正則化では最適解の一部の要素が0になりやすい(特徴量削減効果がある)傾向があります。

 

3. 実装&シミュレーション

さて、ここからが本題です。実際にプログラムを動かして正則化の挙動を見てみます。今回のシミュレーションでは、Pythonにて損失関数、正則化項、最適化を実装します。損失関数に正則化項を加えたものを目的関数として最適化を実行し、最適解として得られる結果を比較してみます。

3.1. 実装条件

実装は以下のような条件で行いました。

・最適解で求めるパラメータ:  \boldsymbol{w} = ( w_{1}, w_{2} )^T 

解釈・可視化を簡単にするため、求めるパラメータは2次元としました。

・損失関数: L(\boldsymbol{w}) = 0.1(w_{1}-0.9)^2 + 0.1(w_{2}-0.4)^2 

こちらも解釈・可視化を簡単にするため、2次関数としました。また、式の形から最適解が   \boldsymbol{w} = ( 0.9, 0.4 )^T であることもすぐにわかりますね。なお、0.1や0.4,0.9などの値は、可視化の都合や正則化の効果がわかりやすいことを鑑みて恣意的に決めました。 

・最適化手法:最急降下法

実装が楽だったからです。

正則化項:L1正則化とL2正則化の2種
正則化パラメータ:L1正則化では \lambda = 0.07、L2正則化では \lambda = 0.1

正則化の効果がわかりやすい値を恣意的に選んで決めました。ちなみに、最適解の各要素が1より大きい場合では、同じ正則化パラメータに対してはL2正則化の方が強くかかる傾向があります(この辺りはL1ノルムとL2ノルムの違いを踏まえて考えるとイメージつくかと思います)。

 

実装したコードはこちらにもあげておきました。

 

3.2. 結果

3.2.1. 正則化項がない場合

手始めに、正則化項がない場合の最適化の結果を、実装したプログラムで確認してみます。

最適解は  \boldsymbol{w} = ( w_{1}, w_{2} ) = (0.9,0.4) となりました。当然といえば当然の結果ですね(などとスカしたことを言っていますが、当然の結果が得られたことで、自前で実装した最適化がちゃんと動作していそうなことがわかって安心しました)。

この結果を可視化したのが以下の画像です。青のグラデーションがかった等高線は損失関数を表しています。"norm opt w" で示される位置が最適解です。これも当然ながら、損失関数が最小になる点である等高線の中心が最適解となっています。

f:id:toeming:20200405183915j:plain

では、正則化項を追加することで、最適解がどのように移動していくのか確認していきたいと思います。

 

3.2.2. L2正則化

まずはL2正則化から確認します。 

最適解は  \boldsymbol{w} = ( w_{1}, w_{2} ) = (0.6,0.27)  となりました。正則化項がない場合と比較して、2つの要素の絶対値が小さくなっていることがわかります。

この結果を可視化したのが以下の画像です。マゼンタ〜オレンジ色の線は正則化項の高等線を表しています。"L2 opt w" で示される位置が目的関数の最適解です。正則化のない場合と比較して、最適解が原点に引っ張られるように移動していることがわかります。ここから、前回記事の内容と一致する挙動であることが確認できます。

f:id:toeming:20200405183948j:plain

 

3.2.3. L1正則化

最後にL1正則化です。 

最適解は  \boldsymbol{w} = ( w_{1}, w_{2} ) = (0.55,0.05)  となりました。こちらも正則化項がない場合と比較して最適解が小さくなっていますが、特筆すべきは   w_{2}  が0に近い値となっている点です。最適解が軸上に近い位置で得られることによる特徴量削減効果が現れています。

この結果を可視化したのが以下の画像です。"L1 opt w" で示される位置が最適解です。最適解が正方形の高等線の角の付近に落ち着いていることがわかると思います。こちらも前回の記事の内容と概ね一致する挙動です。

f:id:toeming:20200405184033j:plain

ということで、正則化の挙動を確認することができました。概ね前回の記事で解説した理屈の通りの挙動であることが確認できます。
 

4. まとめ

正則化を実装し、その挙動を確認してみました。前回の理屈編と合わせて、正則化の基礎的な内容は掴めたのではないでしょうか。さて、ここまでくれば、あとは実使用あるのみです。scikit-learnでも当然のごとくサポートされていて、線形回帰ならインスタンスを作って学習・推定を行うまで数行で書けてしまいます。お試しあれ。

本題には入りきらなかったおまけ的な内容もあるので、それはまたどこかでメモ書き程度に残そうかと思います。