日々の学びと煩悩

正則化とはいったいなにでどうして過学習を防ぐのか

正則化って何をしているんですか????

  • 予測モデルのバリアンスを小さくし未知データに対する汎化性能を高めるのに有効な手法でしょ?
  • その手法としてL1正則化とかL2正則化とかあるよね
  • コスト関数に、ペナルティとして正則化項を加えるんだよね

.....。分かっているようで実態が分かっていない。


  • …そもそもバリアンスが高いってなんだっけ....??
  • そもそも正則化項ってなに?
  • ペナルティとしてモデルのパラメータ(正則化項)を加えたらなぜ過学習が抑えられるの?


「バリアンスが高い」ってなんだっけ?


過学習を起こしている」と同義。

手元のトレーニングデータで学習をしすぎた場合、未知のテストデータだと予測精度が下がってしまうという過学習が起こる。

逆に、作成した手元のデータで予測精度が悪かった場合、学習不足と呼ばれる。これは元も子もなくて、普通学習データで良い精度を出した上でいかに過学習を抑えるかが重要である。

過学習」と「学習不足」は直感的に分かりやすいが、これら以外の説明用語もよく出てくるのでまとめてみる

過学習 学習不足
バリアンスが高い (High variance) バイアスが高い (high bias)
予測結果のばらつきが大きい 予測結果が真値から外れている
汎化性能が悪い (予測精度が悪い)
モデルが複雑 モデルが単純


言葉とイメージを対応させて覚えると良いように思う
高バイアス=予測精度が悪い=左
高バリアンス=ばらつきが大きい=右

f:id:wimper_1996:20200221232331p:plain
イメージ図1


また、的を用いた例もよく見られる。
的の中心が真値だとすると、予測結果(矢の中心)が中心に近いほど精度が高くバイアスが小さい(左列)
そして、矢の中心が試行のたびにあちこちにあたると、汎化性能が悪くバリアンスが高い(下行)

1が最高、4が最悪。

2は、低バリアンスだけど高バイアス。
試合でも動じなくて丁寧なんだけどあんまり最高点取れない....

3は、低バイアスだけど高バリアンス。
練習には強いんだけど試合になるとたまに崩壊するパターン

f:id:wimper_1996:20200221233936p:plain


1行目の「バリアンス(variance)」と「バイアス(bias)」は頻出だが、言い回しが似ているので非常に混乱しやすい。
日本語だと過学習/学習不足の方が分かりやすいので、varianceとbiasに関してはどっちがどっちだっけ?となってしまう。

しかし、英語だとこのvarianceとbiasの表記の方がよく目にする。過学習の英語版overfittingもよく見るけれど、英語ドキュメントを読んでいくに当たっては前者の言い回しに慣れておくのがベター。


なお、バリアンスとバイアスの問題はトレードオフと言われる。
つまり、トレーニングデータで予測精度を向上させようとすると(Low bias)モデルが複雑になりすぎてしまい、未知データに対する汎化性能が小さくなってしまう(Hign variance)。

正則化とは

予測モデルの汎化性を高めるために、最小化させたいコスト関数に「正則化項」を加えること。

i番目のサンプルの予測結果を \hat{ y } ^ { (i) }、真値を\ y^{ (i) }で表し、一つのサンプルに対する損失関数をLで表す*1
最終的に最小化させたいコスト関数Jは重みwを用いて以下のように表せる*2


\displaystyle
y = J (w)  = \sum_{ i = 1 }^{ n } L(\hat{ y } ^ { (i) }, y ^ { (i) })


正則化は式で書くと


\displaystyle
y = J (w)  = \sum_{ i = 1 }^{ n } L(\hat{ y } ^ { (i) }, y ^ { (i) }) + \lambda  \| w \|^2      - (1)

のように表せる。ここで、コスト関数に加えた項を正則化と呼ぶ。


言葉で言い換えると

予測モデルで学習した重みの大きさを、追加のペナルティとしてさらにコスト関数に加えること

であることがわかる。

正則化項は大きく分けて2つある。

この二つ。

そして、この項を加えた線形回帰手法として、

  • L1正則化項を取り入れたLasso回帰
  • L2正則化項を取り入れたRidge回帰
  • 両者を取り入れたElastic Net

この3種類があげられる

なぜ正則化過学習を防ぐのか

よくある説明が、二次元データに対する単純な最小誤差問題\ \sum_{ i = 1 }^{ 2 } (\hat{ y }^{(i)} - y^{(i)} )^2を考え、重みw1とw2を求めるという問題を想定した図である

図2(https://tjo.hatenablog.com/entry/2015/03/03/190000より一部改変)


2次元データで考えた場合、
ペナルティとしての正則化項L2ノルム(E(w) = \displaystyle\lambda \|w\|^{2})と、
元の単独のコスト関数\displaystyle J(w) = \sum_{ i = 1 }^{ 2 } (\hat{ y }^{(i)} - y^{(i)} )^2は、どちらも円で表される。

そして、E(w)とJ(w)は半径とみなすことができ、半径の和の最適化問題に帰着するので、直線上で接した状態が最も最適な状態となる。
それが上図。

要はw1,w2からなる重み付けベクトルの空間上に学習データに対する誤差項の広がりを配置しこれを動かすことで誤差を最小化させるわけですが、そこにペナルティ項を付けておくことでw1,w2の定まり方が変わるというお話です。左側のL1ノルム正則化であれば尖った形の領域に接するようにしなければならないため自ずとw2の軸上に最適点が定まってw1=0となり、右側のL2ノルム正則化であれば円状の領域に接するようにしなければならないためw1,w2ともにnon-zeroな値が入る、という感じになるわけです。

RでL1 / L2正則化を実践する - 渋谷駅前で働くデータサイエンティストのブログ


....わかるようで、わからない。

本当は、コスト関数J(w)をゼロに近づけたい。つまり、右上の楕円のオレンジの中心に行きたい。

しかしながら、ペナルティ項E(w)も入れてしまっており、w1とw2は青い網かけの円を出ることはできない。
(定義\displaystyle\lambda \|w\|^{2} = w_1^2 + w_2^2から、w1とw2は円の外の値はとりえない)

したがって、E(w)とJ(w)の和の最適解は、必然的に上図のようにペナルティ項の円とコスト関数の楕円が接した所になる。


さらにもう少し違う観点からイメージが掴めるように説明してみる。

正則化項を付けない状態で学習を進め、モデルのバリアンスが高くなった状態を考える。

バリアンスが高いとは、トレーニングデータを捉えようとするあまりモデルが複雑になりすぎてしまい、過学習を引き起こしているということだった。

複雑な予測モデルとは??イメージ図1の3つ目の青線のようなモデルのことだ。

f:id:wimper_1996:20200221232331p:plain
再掲
式で書くと、左はシンプルな1次の線形回帰式\displaystyle y = w_1x_1 + w_2x_2であり、右は3次以上の非線形回帰式\displaystyle y = w_1x^{4}_1 + w_2x^{3}_2 + ... と表せる。(4次式なのは適当)
モデルが複雑になるほど、次数が増加し、重みwの取りうる値が多様になる。


この状態のコスト関数Jに正則化項が加わるとどうなるか?



そもそも予測モデルは、トレーニングデータ全体の予測値と真値との差、つまりコスト関数が最小になるように学習したいんだった。
(1)式では、元々のコスト関数J(w)に、さらに正則化項が足されている。


つまり、「正則化項も含めた式全体の値を最小にしなければならない」という視点で考えてみると、

wが多様な値をとれば取るほど、正則化項の値が大きくなり、コスト関数J(w)も大きくなることがわかる。

そしてハイパーパラメータ\lambdaの値が大きくなればなるほど、正則化\lambda \|w\|^2の大きくなるスピードも早まり、重み係数の大きさが小さくなるよう圧迫される。

つまり、トレーニングデータのyを捉えるために出てきた\displaystyle x^{4}のような大きい次数の重みほど、ゼロに近づき、シンプルな式に近づく。

しかし\lambdaを大きくし続けシンプルな式に近づきすぎると、重み係数が全て小さくなってしまい、今度はバイアスが大きくなってしまうので、バイアスとバリアンスのバランス(紛らわしい)が取れたかな?と思うパラメータの調整が必要だ。

実際にモデルに正則化項を取り入れる場合、sklearn.linear_modelから直接適切なモデルを選択すれば良い。

ネットに山ほど情報が載っていると思うのでpythonを用いた例はそちらに...

(1ヶ月ぶりに書いて力尽きました)



機械学習の分野は膨大で、いちいち数学的な証明までできるようになっていては首が回りませんが、盲目的にscikit-learnやKerasといったツールを用いるだけでなくて常に言葉で理由を説明できるようにはなりたいと思うこの頃。

最後まで読んでくださってありがとうございました〜!!

*1:Coursera deep learning AI コース( Neural Networks and Deep Learning | Coursera )によると、一つのサンプルにおける、最小化させたい目的関数を「損失関数」といい、サンプルデータ全体に対しては「コスト関数」と言うらしい

*2:バイアス項bは省略する