Contents
本コンテンツの利用方法
このページでは体験型学習ブログということで、機械学習/深層学習の内容を本や動画のみではなく、プログラムコードを動かしてもらいより体系的に学んでいただくために作成したものです。ブログ内で以下のようなPythonコードを実行できるエディターが備わっております。
プログラムコードは赤枠で囲まれている再生ボタンで実行可能です。また、青枠部分はコードが記述されている場所で自由に書き換えることが可能です。特定の値を試して実行する際にご利用下さい。エディターの使用方法についての説明は以上になります。まずはじめに動画でもあった正則化の等高線図を表示してみましょう。
このように、プログラムを実行してもらいながら学習することで、イメージが湧きにくい内容でもよりイメージを持って学習してもらおうと考えております。
はじめに
正則化とは、機械学習において「過学習」という問題に対する対策の一つです。でははじめに、過学習とは何かについて確認しておきます。
過学習とは
図1のように、xy平面にプロットした点を多項式の形で予測することを行いたいと思います。数式で記述すると、と表すことができ、一次元データの多項式回帰と呼ばれるものです。
上式のモデルにおいてM=1の時、プロットした点を一次近似することになります。(図の左から一番目に対応) 変えられるパラメータの数が少ないため、予測能力がない状態にあります。このような状態を未学習(underfitting)と呼んだりします。 Mの値を適切に大きくしていくと、真ん中の図のように、データの点の構造を全体的に捉えられているような状態になります。モデルがうまくデータに適合していることがわかります。更に、Mの値を見境なく大きくしてみましょう。つまり、モデルの自由度を大きくすることに対応します。すると、今度はデータ点に合わせようとしすぎるせいで、予測能力を失っていることがわかります。このように、パラメータが大きすぎて予測能力を失ってしまっている状況を過学習(overfitting)と呼びます。このような状況を防ぐために自由度の数を上手く減らしてあげる必要があります。その手法として用いられるのが今回扱う正則化です。
正則化とは
機械学習において、誤差関数を最小化するように重みの選択を行います。ただ、単に誤差関数を最小化するだけだと重みの値を自由に取ることができるため、先ほどのような過学習を起こしやすくなります。その対策として、重みの絶対値の値が大きくなると、誤差関数の値が大きくなるようなペナルティーのようなものを課します。
E'(w)を最小化するということは、重みの絶対値が大きくなると大きくなってしまう項をなるべく抑えながら誤差関数を小さくすることを意味します。ここで、Rは正則化の種類によって変わる項であり、L2正則化の時は 、L1正則化の時は となります。
そして、これらを回帰問題に用いると、L2正則化の方をRidge回帰、L1正則化の方をLasso回帰と呼んだりします。
では、L1/L2正則化に意味について考えていきましょう。
正則化の意味/最小化問題
改めて、L1/L2正則化の最小化問題は を最小化する重みを探す問題と等しいです。これは次のように言い換えることができます。
“”制約Rのもとで、E(w)を最小化する重みを探す””
このような制約付き最適化において、上の記述はKKT条件というものを用いることで求めることができます。KKT条件については、補足をご覧ください。では、次に正則化の意味について図を用いて説明したいと思います。
正則化(図的理解)
ここでは正則化で行っていることの意味について図を用いて説明したいと思います。L2/L1正則化をそれぞれ分けて説明し、両者の違い等についても触れたいと思います。
L2正則化について
今、簡単なために重みの個数を2つに絞って、w1、w2に対応する誤差関数の等高線を考えてみましょう。通常の等高線を青で表すことにします。何も制約がない場合は、誤差関数の最小は等高線の真ん中の☆に対応します。次に、制約を表す等高線を赤で表すことにします。制約の式の等高線は円に対応します。制約を課すと、重みは赤の領域上でのみで動くことができます。なので、その条件の下で誤差関数の値を最小化する場所は条件を満たす場所内で等高線のなるべく内側ということになります。図では、青と赤の等高線の接点になり、制約付きの最小解になります。
次に考えたいこととして、上のような等高線に時、、w1、w2のどちらが重要なパラメータであるかです。形を見れば、w1の方が寄与が小さいことがわかります。今、図中の青点に重みが存在しているとしましょう。そこからw1の値を少し動かしてみましょう。値を変えても誤差関数の値はほぼほぼ変わらないことがわかります。しかし、w2の値を少し動かした際には、別の等高線に乗ってしまっているため、誤差関数の値は大きく変わることがわかります。
L2正則化で行っていることは、重みの中でも寄与が小さい重みを選択的に小さくしています。その理由について以下説明します。
λの値を大きくして、正則化の影響を強くしてみましょう。これは図中では、赤円の半径を小さくすることに対応します。その時、最小となる解は図2のようにw1が小さくなる方向に移動していきます。つまり、w1のみを選択的に小さくしていることがわかります。まとめると、L2正則化は寄与の小さい重みを選択的に抑えることを行っています。
L1正則化について
次にL1正則化について考えていきます。制約を表す等高線はダイヤモンドのような形をしています。この制約下での最小となる解は、図3の青と赤の線の接点☆に位置します。L1正則化では、☆のような尖った場所で最小となる場合が非常に多いです。L2正則化では、w1の値をちょうどよいくらいの値に抑えましたが、L1正則化では思いっきり抑えているため、ほぼ0になっていることがわかります。このような0に近い解のことを疎(スパース)な解とよび、L1正則化ではスパース性の高い解が得られるのが特徴です。そうすることで、機械学習の学習スピードを早めたりすることができます。
正則化の実装
上の図はある特定の状態のみを仮定して説明したものになりますので、他の場合はどのような結果が得られるか気になった人もいるのではないでしょうか? ここでは、先ほどまで説明した内容をよりイメージを持って学習していただくために実際にコードを実行してもらいます。重みをxy軸に取った時の誤差関数の等高線図や3D図を表示させます。
等高線プロット
それでは、上で説明した例について実装を踏まえながら説明したいと思います。L2/L1正則化において、寄与の小さい重みの値を抑えている様子をグラフに可視化してみましょう。表示するグラフの個数、L2/L1正則化の切り替えを行うことができます。
## main script ##
####以下の値で表示内容を切り替えてください.####
#n_trialsは15以下の数字を入力してください
n_trials = 12
contour_levels=50
mode = "L1"
s = 0
##############################################
np.random.seed(s)
show_example(reg=mode,num_trials=n_trials)
上に実装コードを一部抜粋したものを示します。主に変更が可能なパラメータは3つであり、グラフの表示個数 n_trials、L2/L1正則化の切り替え mode、乱数のシード(任意) sです。
エディター内で表示されている図中の黒点が通常の誤差関数の最小解、ピンクの点が正則化を行った際の誤差関数の最小解を表しています。L1正則化の説明でも述べましたが、重みのどちらかがほぼゼロになるスパース性が高い解が得られていることがわかります。このように、入力パラメータを変えることでグラフの形態を変えることができます。表示するグラフの個数を変更したり、L2正則化のグラフを表示してみたりなど色々試してみてください。
3次元のプロット図
先程は、重みをx y軸に取った際の誤差関数の値を等高線にプロットしました。ここでは、正則化項によって誤差関数の値がどのように変動するのか、等高線図と3次元図の両方から確認できる図を表示したいと思います。
#### Main Script ####
####stepsizeを変えると、表示するグラフの個数が変わります.
#### modeを'L1'にするとL1正則化、modeを'L2'にするとL2正則化になります.
mode = 'L1'
last_lmbda = 10
stepsize = 1.0
lmbdas = list(np.arange(1, last_lmbda, step=stepsize))
実装コードを一部抜粋したものを上に示します。ここで、変更が可能なパラメータはmode、last_lambda、stepsizeの3つです。modeでは、L2/L1正則化の切り替えが可能です。実装コードでは、1から10までのλの値で正則化を行ったときの誤差関数の3次元プロットを表示しておりますが、last_lambdaの値を大きくしたり小さくしたりして試してみることをお勧めします。
λの値を増加させていくと、誤差関数の谷の位置が上昇していくことがわかると思います。もともとの誤差関数の最小解に落ちると過学習を起こすため、正則化を行うことで、最小解の位置をずらしています。
おまけ
正則化の実装で表示した図をマウスで動かして様々な方向から見れるようにしたプログラムもありますので、気になった人向けに紹介したいと思います。
###########################
#main script
#modeで切り替えを行ってください
mode = "L1"
###########################
plot_regularization(mode)
変更可能なパラメータはL1/L2正則化の切り替えを行うことができるmodeです。エディター内の図のように、3次元のプロット図と等高線図の両方が表示されていることがわかります。前の2つの実装では表示された図を別の角度から眺めたりすることはできませんでしたが、現在表示されている図はマウスで角度を変えることができますので、色々な角度から眺めてみてください。また、現在はL1正則化のグラフが表示されていますので、L2正則化でも試してみてください。また、凡例にある「loss、L1、Loss+L1」をクリックすることでグラフを非表示にすることができます。例えば、もともとの誤差関数のみを表示して、そのあと正則化後の誤差関数を表示することで正則化の効果を実感することができます。また、xy平面には等高線図を表示しており、等高線プロットで表示したプログラムと類似した図を可視化することができます。
補足(KTT条件)
今回学んだ正則化は数学的には「制約付き最適化問題」に分類することができます。ここでは、その中でもKKT条件と呼ばれる最も一般的な問題について簡単にまとめて説明したいと思います。詳細まできちんと知りたい方は下の動画を参考にされて下さい。
等式制約
動画では、等式制約と不等式制約の二種類解説していますが、ここでは制約付き最適化の中で最もシンプルな場合である等式制約のみ扱うことにします。正則化の問題は制約問題の中でも等式制約に当てはまります。
今、条件として制約 の下で、関数を最小化することを考えます。
制約がない場合は、最小化したい関数の勾配を取ってあげれば良いのですが、今回のように制約がある場合はその方法では正しく最小値を求めることはできません。このような時に以下の定理が成り立ちます。
定理(ラグランジュの未定乗数法)
が局所最小解であるとき、(特異点でない)ならば、が存在して以下が成立する。
(1)
(2)
(2)は制約の条件を表してます。(1)は見た限りわかりにくいので図で説明します。
今、fとgの等高線をxy平面に図示したものを上の図に示します。この時、制約gの下でfが局所最小になる点はどこでしょうか? 結論として、局所最小となる点はfとgが接する場所です。局所最小になるまでは、fの値は増加し続け、局所最小に達した後はfの値は減少を始めます。このように、fの値が増加する場所と減少する場所を挟んだ場所が局所最小解に成り得ます。では接するということから(1)の式の意味について考えていきたいと思います。
接するということは、共通な接線を持つということに対応します。このことを勾配ベクトルを用いて表すと、fの勾配ベクトルとgの勾配ベクトルの定数倍が等価であると記述できます。つまり(1)式を表します。
KKT条件
先程紹介した等式制約と不等式制約(今回は紹介はしませんでしたが)を含めて制約問題を一般化したものをKKT条件と呼びます。ここでは等式制約のみに焦点をしぼって説明しましたが、不等式制約も気になるという方は先程紹介した動画でぜひ勉強してみてください。
まとめ
今回はヨビノリ & zero to one コラボ企画第一弾ということで、正則化を学びました。正則化は過学習の対策として有効な方法の一つですので、知っておくと非常に便利です。
今回は正則化の概念の説明に重きを置きましたので、実際に正則化を機械学習モデルに作用させると言ったことは行いませんでした。なので、正則化の効果を知りたいという方は、あえて過学習を起こさせるような場面を作り、そこで今回学んだ正則化を行い、過学習が抑えられる様子を実際に観察してみると良いと思います。