機械学習における正則化の原理と挙動を理解するため、手法の概要をまとめると共に、実際に正則化を用いた最適化をシミュレートして挙動を確認します。
今回の記事では -理屈編- と題して、正則化の着想から具体的な手法(L1,L2正規化)の解説までをまとめます。最適化のシミュレートは -実践編- と称した次回の記事で行います。
なお、この記事は個人的な備忘録として作成しています。
1. はじめに
1.1. 過学習と正則化
機械学習や統計学においてサンプルデータからモデルの学習を行う際、過学習(モデルの形状がサンプルデータへの適合に特化しすぎてしまい、真に推定したい分布からかけ離れてしまう現象)がしばしば問題になります。正則化は過学習を抑えるメジャーな手法の一つです。正則化の考え方はシンプルです。学習時に損失関数に正則化項を加え、これを目的関数として最適化を行います。これにより正則化項がパラメータの大きさに対するペナルティとして作用し、抑制がかかることで過学習を防ぐ効果が期待できます。たったこれだけです。
1.2. 正則化、わかるようでいまいちピンとこない問題
たったこれだけのことなのに、いまいち腑に落ちていないのは僕だけでしょうか。「正則化」で画像検索すると何やらわかりやすそうな図がいっぱい出てきますが、正直僕は全く理解できていません。この正方形とか円とかぐるぐるとか、一体なんなんだ。
ということで、この記事は正則化の理屈を自分なりにまとめて理解しようという試みです。実際に最適化のシミュレーションも試してみたのですが、思いのほか原理解説のパートの分量が増えてしまいました。今回の記事は -理屈編- として原理の解説に注力し、最適化の実装とシミュレーションについては -実装編- として別記事に掲載しました。
正則化をなるべく丁寧に理解する - 実践編 - - 雑記 in hibernation
※ちなみにこの記事を書くにあたり書籍や上記の検索でヒットしたページを参照したのですが、真面目に読んだら正直めちゃめちゃわかりやすかったです。これほどわかりやすい情報が溢れているならぶっちゃけこの記事は世の中的には全然意味ないなと思いつつ、自分の勉強のために書き進めていくことにします。
※最適化のトピックでは「目的関数」「損失関数」「コスト関数」等、似たような言葉が多く出てきます。用語の使い分けについてはこちらの記事にうまい具合にまとまっており、大変参考になりました。本記事での言葉遣いもこれに準拠します。
目的関数、コスト関数、誤差関数、損失関数いろいろあるけど、なにが違うのかを検討 - Qiita
2. 正則化の原理
2.1. 最適化問題と損失関数
「はじめに」でも軽くふれた通り、教師あり機械学習モデルにおける "学習" とは多くの場合で「損失関数を最小化するモデルパラメータを求める最適化問題を解く」ことを指します。これについてもう少し説明します。
損失関数がどのような数式で定義されるかについては手法によって異なりますが、基本的には教師データの推定結果と教師信号の差が少ない(=サンプルデータと推定したモデルの当てはまりが良い)ほど関数の値も小さくなるようにデザインされます。例えば「全教師データの教師信号とそれに対する推定結果の二乗誤差の総和」といった具合です(ちなみに二乗誤差の総和を損失関数として学習を行う手法は"最小二乗法"と呼ばれます)。
下の図はサンプルデータに対して1次関数でフィッティングを行う例です。ここでは学習が十分になされてサンプルへの当てはまりの良いモデルパラメータ(a,b)では減少し、学習が不十分で当てはまりが良くないパラメータ(a', b')では増加するような損失関数を定義します。
ここで、モデルパラメータを動かすと、任意のサンプルに対する損失関数の出力も変化します。学習データに対する損失関数の出力値が最小になるようなパラメータを学習によって獲得したい、というわけです。したがって「モデルの学習」は「パラメータを変数とする損失関数 を目的関数として、これを最小化する最適化問題」として置き換えることができることになります。
式に表すと以下です。
ただし、
: モデルのパラメータ(学習により獲得したい値)
: 損失関数 (Loss Function)
正則化は、この損失関数に工夫を加えることで過学習を抑えようとする手法です。次に、正則化の元になる着想について考えていきます。
2.2. 正則化の着想
ここで、過学習が起きた際のモデルの形状について観察してみます。
サンプルデータに対して多項式関数によるフィッティングを行い、過学習が発生している場合といない場合のそれぞれについて、学習された関数をプロットしてみました。学習で得られたモデル係数は、グラフの上部に"coef_"として記載しました。
過学習が生じたモデルを観察してみると、サンプルデータの各点を通過するべく複雑な関数が学習され、係数が大きくなる傾向にあることがわかります。逆に、過学習が生じていないモデルの係数は、過学習が起きた場合と比較して小さいことがわかります。
ここから次のような発想を得ることができます。
ということで、損失関数にパラメータの大きさに対するペナルティ項を追加しよう、という発想に至ります。
2.3. 正則化項
ここからは正則化について数式も交えつつより具体的に解説していきます。
「損失関数にペナルティ項を追加して、これを最小化するパラメータを最適化問題として解く」という正則化のアイデアを数式で表すと、以下のようになります。
ただし、
: モデルパラメータ(学習により獲得したい値)
: 損失関数 (Loss Function)
: 正則化項 (Regularizer)
正則化項 はパラメータの要素が大きくなるほど大きい値を返すように定義された関数で、これが追加した"ペナルティ"にあたる部分です。これにより、パラメータが大きくなりすぎることを抑制します。正則化項としてどのような関数を定義するかによって、いくつかの手法に分類されます。これについては次章で説明します。
正則化パラメータ は学習の際に事前に設定するメタなパラメータで、これにより正則化の強さを調整します。大きい値に設定すると正則化項のペナルティが強くなり、より強く過学習を抑えることができます。ただし、強すぎるとモデルパラメータを小さく保つことばかりが優先されてモデルの表現力が低し、結果としてバイアスが大きく残ってしまうことがあるので、目的に応じた調整が必要になります。
正則化項として定義する関数により、正則化はいくつかの種類に分類されます。次章からこれについて解説していきます。
3. 色々な正則化
ここでは2種類の主要な正則化の手法として、"L1正則化(Lasso)" と "L2正則化(Ridge)" を説明します。両者に共有する考え方として、正則化項をパラメータのノルム(ベクトルの大きさ)により定義します。そして、このノルムをL1ノルムで定義するのがL1正規化(Lasso)であり、L2ノルムで定義するのがL2正規化(Ridge)です。
※余談ですが、ノルムはL1,L2,...,L∞まで定義できるので、そのぶん正規化項の種類も増えることになります。ただ、L3ノルム以上のノルムが正則化項に利用されている例は、僕は聞いたことがないです。
ここからは"正則化"で画像検索するといっぱい出てくる「例の図」も参照しつつ、それぞれの正則化の効果についてまとめていきます。まずは比較的、直感的に理解しやすいと思われるL2正則化(Ridge)から紹介していきます。
3.1. L2正則化 (Ridge)
L2正規化では正則化項をL2ノルムで定義します。L2ノルムとは各要素の二乗和の平方根をとったもので、"ユークリッド距離"、すなわち、いわゆる一般的な意味での"距離"です。最適化の式は以下のようになります。
ただし、
: モデルパラメータ
: 損失関数
: 正則化パラメータ
が正則化項 にあたる部分で、L2ノルムに相当します。意味深に係数としてかかっている "1/2" は計算の都合でつけられたもので、挙動を理解する上では重要ではないので一旦無視します。
正則化の効果を理解するにあたり、まずは正則化項を可視化して外観を掴んでみます。簡単のため、モデルパラメータが2つしかない場合( ) を考えます。λ=0.1 として正則化項の等高線を描画すると、下図のようになります。原点からの距離に応じてペナルティが決まるので、原点から離れるにつれ同心円状にペナルティが強くなっていくような形になります。
次にL2ノルムの正則化項が損失関数に与える効果を、目的関数を簡略化した下図で考えてみます。ここでは正則化項を制約条件として捉えた上で、制約の元で損失関数が最小になる座標(つまり最適解)はどこか、そして制約により元々の損失関数の最適解がどのように移動するかを考えてみます。
目的関数に対してある最適解が得られたとします(下図の赤い点)。この位置を通る正則化項の等高線(下図の青い円)を考えると、最適解は正則化項の等高線上でもっとも損失関数の値が小さい位置であるはずです。
また、最適解を通る損失関数の等高線(図の破線)を考えると、最適解は正則化項の等高線と損失関数の等高線が接する位置になります。もし等高線が「交わる」位置であるならば、正則化項の等高線上をいずれかの方向に移動することで現在の位置よりも小さい損失関数が得られることになり、そこは最適解とは言えません。等高線どうしが「接する」位置であれば、正則化項の等高線上をどの方向に移動しようとも、損失関数が小さくなることはありません。
損失関数の形状や正則化パラメータの大きさによって最適解の位置は変化しますが、最適解の位置が正則化項の等高線上で損失関数がもっとも小さくなる位置あることは変わりません。結果として、元の損失関数の最適解(図の灰色の点)に対して原点方向に引っ張られるような形で最適解が移動します。これがL2正則化でモデルパラメータの大きさが抑制される仕組みです。
3.2. L1正則化 (Lasso)
L1正規化では正則化項をL1ノルムで定義します。L1ノルムとは各要素の絶対値の和をとったもので、"マンハッタン距離"とも言われます。「碁盤の目状の町である2点間を移動するのに歩く距離」みたいなイメージですね。最適化の式は以下の通りです。
ただし、
: モデルパラメータ(学習により獲得したい値)
: 損失関数
: 正則化パラメータ
が正則化項 にあたる部分で、L1ノルムに相当します。原点から の各要素の和を表しています。
正則化項の等高線を描画すると、下図のようになります。L2正規化では正方形状の等高線となります。
簡略化した下図で考えると、L2正規化の時と同様に、正規化項の等高線上でもっとも損失関数の小さい位置が最適解となります。ここで重要なのは、等高線の正方形の角に当たる部分が「等高線上でもっとも損失関数の小さい位置」「正則化項と損失関数の等高線の接する位置」になりやすく、さらに、これがモデルパラメータ空間の軸上に位置することです。このことにより、L1正則化では最適解が軸上となりやすい傾向にあります。最適解が軸上に位置するということは、最適解のその軸以外の要素が0であるということです。そしてモデルの係数が0になった場合、その係数がかかる特徴量はモデルの出力に影響を及ぼさないことになります。つまり、L1正則化には特徴量削減の効果があるということになります。下図の場合では、 となり、を係数とする特徴量が削減されることになります。
3.3. ElasticNet
正規化項にL1ノルムとL2ノルムを併用するパターンです。L1,L2正則化の中間の効果が期待できます。2つの正則化項を併用する形になるので、それぞれの利きの強さを決めるため、2つの正則化パラメータを持ちます。
ElasticNetに関する詳細な説明はここでは省きます。
4.まとめ
ということで、正則化の原理をなるべく丁寧にまとめてみました。
次記事にて、簡単な関数にて正則化をかけた場合の最適化を実装してシミュレーションを行いましたので、そちらもご覧ください。