はじめに
人間にエゴや業(ゴウ)があるように、機械学習には過学習というものがついて回ります。宿命というか定めなのです。そのため、最近のニューラルネットワークライブラリには、過学習を防止するための機能がいくつか用意されています。今回はその中から代表的なものを3つ紹介します。
正則化(Regularization)
過学習の原因は、特定の学習データに最適になるように学習し過ぎたため、未知のデータに対する誤差(汎化誤差)が逆に上がってしまうことでしたね。(Vol.4参照)
これを防止するための正則化とは、一言でいえば「極端だと思われる意見は聞かないようにする」ということです。つまり、モデルを複雑にする重みにはその量に応じたペナルティを与えて、モデルが複雑にならないようにすることです。
正則化は、一般に次の2つが用いられており、この2つを組み合わせる場合もあります。
L1ノルム正則化(Lasso回帰):極端なデータの重みを0にする
L2ノルム正則化(Ridge回帰):極端なデータの重みを0に近づける
回帰分析とは Lasso回帰やRidge回帰などの言葉が出てきたので、ここで回帰について簡単に説明します。回帰分析を一言で言うと「たくさんのデータをプロットしたときに、その関係性を表す線(関数)を見出すこと」です。直線(1次関数)で表すのが線形回帰ですが、2次以上の曲線で表すのが非線形回帰で、その線を回帰曲線と呼びます(図1)。 なお、ノルムとはベクトル空間における距離の概念です。この図で言えば、回帰線とプロットした点との距離がノルムになります。 図1:回帰曲線 |
と、理解したような気になったところに麻里ちゃんが登場して、いつものように思いついた疑問を投げかけてきました。
「正則化は通常の回帰と何が違うの?」
おお、またまた素朴な分だけ難しい質問です。麻里ちゃんもだいぶレベルアップしています。こんな難問にどう答えたらいいのでしょうか。
ここが麻里ちゃんと焼き肉行けるかどうかの重要なポイントなので、気を引き締めてしっかり覚えておきましょう。通常の回帰はデータとの誤差(プロットと線との距離:ノルム)を縮めるように計算されるのですが、ノルムの大きさにかかわらずプロットは同じ影響度です。
正則化はそれに加えて誤差に応じてペナルティ(重みを0にする、または0に近づける)を与える点が違うのです。図1で言えば座標(38,41)にあるプロットは回帰曲線から離れている(極端だと思われるデータ)ので、ペナルティを与えて影響度を小さくするのです。
過学習を実社会に例えると不祥事を起こす会社にありがちな「自社の常識、世間の非常識」のようなものです。非常識なことを声高に言う幹部やスタッフを鵜呑みにして判断をミスってはいけません。通常の回帰では非常識な意見も平等に聴くわけですが、正則化の場合、それに加えて非常識の度合いに応じて無視したり(L1)、話半分に聞いたり(L2)するわけです。
今時のニューラルネットワークライブラリには、こうした正則化のパラメータを指定できるようになっています。ただし、むやみに正則化を使おうとすると逆に学習不足(Under fitting)となって精度が落ちることもありますのでご注意ください。
ドロップアウト(Drop out)
ドロップアウトは、図2のように「ランダムにノードを非活性にして学習する」処理です。図1の回帰曲線で言えば、全プロットをもとに線を引く代わりに、ある程度間引いたプロットに対して回帰線を求めるようなイメージです。
図2:ドロップアウト
過学習はデータが多すぎるというイメージから、なんとなく間引くといいのかと思いがちですが、そういうあいまいな理解でいるとまた麻里ちゃんが鋭い質問を投げかけてきます。
「なぜ、間引くと過学習を防止できるの?」
うっ、また答えに詰まってしまいそう。この質問に答えるための重要なポイントをわかっていない人は、案外少なくないかもしれません。
ヒントは、機械学習は同じ訓練データで何回も学習を繰り返すことにあります。
例え話で説明しましょう。職場に麻里ちゃんがいたとしましょう。毎日顔を合わせているので、麻里ちゃんが”てきぱき働く明るい子”だというのは十分わかっています。自分は誰よりも彼女のことをよく理解しているとさえ思っていました。
でも、ある時K-POPコンサート会場でばったり会ったら、てきぱき働くという強いノードが非活性化されていて、ファンキーでぶっ飛んでいる彼女がそこにいました。お、こんな一面もいいねぇって感動したあなたが、この貴重なチャンスを逃がさないと決意して、人生最大の勇気を出してデートに誘い成功したとしましょう。次の週にデートで一緒に美術館に行ったときは、今度は結構奥手で甘えっ子な一面が垣間見えました(また、少し妄想モードか)。
どんな彼女も全部彼女そのものです。近くでずっと職場の麻里ちゃんを見続けていたのに、自分は彼女の何を知っていたのでしょう。彼女のいろいろな面を知った今こそ、「僕は本当の麻里をよく知っている」と心から思えるわけです。
ドロップアウトも原理は一緒です。学習のたびにランダムに非活性化されるノードが選ばれるので、実態は同じなのに毎回違う重みづけがなされる(図1で言えば違う回帰線が描かれる)わけです。普通の(全ノード活性化)状態で200回学習すると過学習となる場合でも、毎回ランダムにノード状態を変えて200回学習して、その結果を総合するアンサンブル学習にすれば、汎化性能が高まって過学習にならないのです。
アンサンブル学習(Ensemble learning) アンサンブル学習とは、個々に学習した複数の学習器を融合させて汎化能力を高める機械学習の技術です。例えば、機械学習でよく使われるランダムフォレストは、複数の決定木(デシジョンツリー)の結果を平均化するアンサンブル学習を用いた手法です。 ドロップアウトは1つの学習器なのですが、毎回ランダムに非活性化ノードを決めることにより、疑似的にアンサンブル学習を行っているのです。 |
最近のニューラルネットワークライブラリはドロップアウトの機能も持っており、例えば入力層20%、隠れ層をすべて50%、全結合層20%というように層ごとにパラメータを指定できます。
K分割交差検証 (K-fold cross-validation)
Vol.3で訓練データと評価データを分離するホールドアウト法と、さらにテストデータを別に取り置いておく方法について解説しました。これをさらに進めたものがK分割交差検証(クロスバリデーション)です。名前はなんか難しそうですが方法はいたってシンプルです。これも抑えておきましょう。
図3は学習データが12000ある場合にK=5としたときの交差検証です。K=5なので学習データのうち訓練に使うデータ(10,000)を5分割して、1回目は最初の4つを学習データに、残り1つを評価データに使います。2回目の学習では4番目のデータを評価データにという具合に役割を変えて全部で5回学習します。そして、5回の学習結果の平均を取ったものが、訓練における認識率となるわけです。
図3:K分割交差検証
K分割交差検証も、データセットをK個にわけてそれぞれで学習した結果を総合評価することから一種のアンサンブル学習といえます。そういう意味ではKの値を10や20とかにした方が過学習防止により効果があるわけですが、ことはそんなに簡単ではありません。
図3の学習1は10000のデータを1回流して終わりというわけではありません。評価を高めるために何度かデータを流した結果、(過学習とならない程度で)最高の評価を得たところで学習1がようやく終わりになります。ライブラリでKのパラメータを20にするのは簡単ですが、通常の学習に対して20倍も学習することになるということに注意してください。
なお、K分割交差検証を採用した場合でもテストデータは別に取っておく必要があるのでしょうか。答えは「YES」です。上記のように学習1~学習nの各回で評価データ値が高まるようチューニングするわけなので、最後にテストデータで最終確認しなければ本当の性能が測れません。
まとめ
Vol.8では、過学習を防ぐ技術として、「正則化」「ドロップアウト」「K分割交差検証」をしました。こうした技術をライブラリに実装するならば統計学や数式の知識が必要ですが、ライブラリを使って機械学習をさせる人にとっては、パラメータの意味を理解する方が重要です。車のエンジンの構造を知らなくてもアクセルやブレーキの意味や使い方を知っていれば運転できるのと同じです。車の運転と同じく、あとは練習あるのみ。試行錯誤して自分なりの運転のコツをつかんでください。
梅田弘之 株式会社システムインテグレータ :Twitter @umedano
- カテゴリ: