機械学習
第 13 回 特徴学習
(回帰:交差検証)
白浜 公章
更新情報
2019.12.16
前回(第
12
回)は、コーディングの詳細で時間を使い切ってしまったので、第
12
回に用意したスライドを第13
回に転用申し訳ないm(_ _)m
今日のポイント
(前回)
基底関数群による関数近似を、理想的なケースから実際のケースへ拡張
(理想的)関数全体をカバーするノイズのない大量の事例
(実際)まちまちの箇所しかカバーしないノイジーな限られた事例
(今回)
実際のケースにおける問題と解決方法
•
オーバー/
アンダーフィッティング•
交差検証(Cross validation
)実際に特徴学習に基づく回帰を行う上で、
必ず必要になってくる知識とノウハウ なので必ず抑えておくこと!
(理解するのは、非常に簡単)
minimize
𝑤0,𝑤1,⋯𝑤𝑀,Θ 𝑏 + 𝒇𝑝𝑇𝒘 − 𝑦𝑝 2
𝑃
𝑝=1
オーバーフィッティング
基底関数の数を増やして、モデルの表現力を上げると、
理想的な場合:目的の関数全体をカバーする大量のクリーンな事例が与えられている
→ 常に、目的の関数をより正確に近似できる
実際の場合:まちまちの箇所しかカバーしないノイジーな限られた事例しか与えられていない
→ 学習例に対する近似精度は向上するが、目的の関数とは限らない(オーバーフィッティング!)
(理想的) (実際)
求めたい関数は、𝑦 𝑥 = sin(2𝜋𝑥)
• 𝑀 = 3個の多項式群による近似
• 𝑀 = 10個の多項式群による近似
注意してみれば、𝑀 = 10の方が、
学習例に対するラベルと予測値の 2乗誤差が小さいことが分かるはず
「2乗誤差が最小」という制約しかない
minimize
𝑏,𝒘,Θ 𝑏 + 𝒇𝑝𝒘 − 𝑦𝑝 2
𝑃
𝑝=1
どういう形状の関数になるかは考慮外
目的とする関数が近似できるように、
適切に𝑴を設定することが大事!
コード 13_overfitting.ipynb参照
(余談)オッカムの剃刀( Occum’s Razor )
求める関数(モデル)は、
•
データに正確(柔軟)にフィットし、かつ•
シンプルであるべきである!物体の落下距離の回帰(ガリレオの落下法則)
𝑀 = 2個の多項式群によって、正しく近似された関数
(落下距離𝑦は時間𝑥の2乗に比例するので、
𝑥2に対する重みが1で、それ以外はゼロ)
→ 人間の直感に合う
𝑀 = 1個の多項式群によって近似された関数
→ シンプル過ぎて、2乗誤差が大きい (アンダーフィッテイング)
𝑀 = 12個の多項式群によって近似された関数
→ 学習データを完璧に近似しているが、
複雑すぎるし(オーバーフィッティング)、人間の直感に合わない (落下距離𝑦がマイナスにはなり得ない)
人間にとって予測がつく、納得がいく、
不必要に複雑でない
結局、何が問題なのか?
未知の事例に対応できていないことが問題!
“元の学習例”を学習例とテスト例の
2
種類に分割して、未知の事例に対する テストをシミュレーションするこの状況下で、色々な
𝑀
を試して、テスト例に対して最も精度が高いものを選ぶ ホールドアウト交差検証(Hold-out cross validation
)“元の学習例”の大部分を学習例にして学習したモデルは、全ての“元の学習例”を使って学習した モデルと類似しているので、選択した𝑀は後者でも有効であると仮定できる
(多くの事例を使って学習した方が精度が高いので、最終的には“元の学習例”を全て使用する)
紛らわしいが、これが一番正確な表現だと思われる コード 13_overfitting.ipynb参照
ホールドアウト交差検証
(入力) 𝑘:“元の学習例”を何分割するか、候補となる𝑀の集合
1. 元の学習例をランダムに𝑘分割し、1/𝑘をテスト例、残りの(𝑘 − 1)/𝑘を学習例に設定 2. それぞれの𝑀を用いて、モデルを学習・テストして、テスト例に対する最も精度が高い (2乗誤差が最小)モデルが学習できた𝑀∗を選択
3. 選択した𝑀∗を用いて、“元の学習例”の全て使用してモデルを学習し、未知の事例に備える
典型的には、“元の学習例”を𝑘 = 3~10分割することが多い
• 多くの事例を使用可能な場合
多くの事例(𝑘 = 3で1/3)をテスト例にしても問題ない。学習例も十分にあり、
2.と3.で学習するモデルに大差なく、交差検定で正確なシミュレーションが行えていると考えられる。
• 少数の事例しか使用できない場合
少数の事例(𝑘 = 10で1/10)をテスト例にした方がよい。出来る限り多くの学習例を使用して、
2.と3.で学習するモデルが類似してくるようにし、有意義なシミュレーションが行えるようにする。
コード 13_cross_validation.ipynb参照
ホールドアウト交差検証の例
フーリエ群を用いた関数近似で、次数𝐷 = 1~8の中で最適なものを選ぶ
(1つの次数に対してsinとcosがあるので、基底関数の個数は𝑀 = 2𝐷)
𝑘 = 3で“元の学習例”を分割し(青が学習、黄色がテスト)、各𝐷を試し、𝐷∗ = 5を選択している (つまり、𝑀∗ = 10)
𝐷∗ = 5で全ての“元の学習例”
を使用して学習された 最終的なモデル
𝐷(𝑀)が増えると、学習例に対しては、
常に2乗誤差が小さくなっていることに留意!
ただし、テスト例に対して有効かは別問題 𝐷 = 1,2のときは、特に
アンダーフィッティング
𝐷 = 6,7,8のときは、特に オーバーフィッティング
k 重交差検証( k-fold Cross Validation )
(ホールドアウト交差検定の欠点)
ランダムなので、学習例、テスト例に使用する事例が偏ってしまう可能性がある 実際には、有効でない𝑀を選択してしまう可能性がある
単一の学習例、テスト例だけでなく、色々なバージョンを試して、ロバストに𝑀∗を選択する
k重交差検証:𝑘個の分割のそれぞれをテスト例にして、ホールドアウト交差検証を𝑘回繰り返し、
平均誤差が最小となる𝑀を選択する(各回のホールドアウト交差検証をfoldという)
特に、事例数が少ない場合
各𝑀に関して、それぞれのfoldにおけるテスト例に対する2乗誤差を計算し、平均を𝑀の総合的な誤差とする
→ 総合的な誤差が最小となるものを𝑀∗とする
𝑀∗の選択はロバストになるが、計算量は 𝑘倍になることに注意!
十分な事例が使用できる場合(例えば、1万個以上)は、
ホールドアウト交差検証でOK(これだけの量なので、
ランダムサンプリングによる分割でも、まず偏らない)
学習・テスト例へのそれぞれの分割をfoldということもある
k 重交差検証の例
(設定はさっきと同じ)
フーリエ群を用いた関数近似で、次数𝐷 = 1~8 の中で最適なものを選ぶ(1つの次数に対して sinとcosがあるので、基底関数の個数は𝑀 = 2𝐷) 1番目のfold
𝐷 = 2が最適
→ アンダーフィッティングを引き起こす 2番目のfold
𝐷 = 5が最適 3番目のfold 𝐷 = 5が最適
3回のfoldの平均2乗誤差から、𝐷 = 5
(つまり、𝑀 = 10)が選択された。
1番目のfoldでたまたま選択された𝐷 = 2を 排除できている。
• 青が学習例に対する2乗誤差
• 黄色がテスト例に対する2乗誤差
最適な𝐷による 近似結果
(全事例を使用)
各foldでの、
• 学習例が青
• テスト例が黄色
1 個抜き交差検証( Leave-one-out Cross validation )
“元の学習例”の数が本当に少ない時、
𝑘 = 𝑃
重交差検証をすることがある→ 1
個抜き交差検証:1
つの事例をテスト例、それ以外を学習例という設定で、学習・テストを
𝑃
回繰り返し、平均2
乗誤差が最小の𝑀
を選択する。𝑃は“元の学習例”の数
多項式群による関数近似で、
基底関数の数(𝑀)を決めたい
(ガリレオの落下法則の データで𝑀 = 2が最適)
ただ、“元の学習例”に 𝑃 = 6個の事例しかない 各foldで、
• 青が学習例
• 黄色がテスト例
このfold以外では適切な𝑀 が選択されていて、平均を とって、適切な𝑀に最終決定 できている!
これまでは、最適な𝑀を発見するためだけに交差検証を使用してきたが、それ以外にも、
学習で最適化する以外のパラメータ(ハイパーパラメータ:例えば、正規化項に対する
重みなど)の最適値を選択するために使用できる! コード 13_cross_validation.ipynb参照
どの基底関数がいいの?
基底関数の選び方に関する一般的な法則はないが、
以下に、いくつかのガイドラインを示しておく。
1.
既知の法則からの類推で、データに線形、2
乗、3
乗などのパターンが存在しそうなとき→
多項式群が有効である可能性が高い2.
データに周期性のあるパターンが存在しそうなとき→
フーリエ群が有効である可能性が高い(sinusoidal活性化関数を用いたニューラルネットワークもあり得る)
3.
人間の知覚機構(脳での処理の仕組み)が関係しそうなとき→
ニューラルネットワークが有効である可能性が高い4.
データの値域が小さい(例えば、0
~1
)とき→
多項式群を使うべきではない:𝑥 = 3
のとき𝑥
20= 3,486,784,401
となるように、簡単に値域外の値になってしまい、多くの基底関数を使う意味がなくなる
5.
大量の学習例が偏りなくあり、ノイズも少ないとき→
どの基底関数を使用してもOK
(理想的なケースでの関数近似に近づく)結局、全部試してみる方が早いことも多い
特徴学習の使いどころ
いつでも特徴学習(特に、ニューラルネットワーク)が有効な訳ではない!
データにもよるが、せめて1万個以上の事例がないと、普通の方法では無理!
どういう基底関数がいいのか分からず、調整可能なものを 使用するしかない
→ 多くの学習例が必要(𝒃と𝒘に加えて、基底関数の 内部パラメータΘも最適化する必要がある)
パラメータが多い(表現力が高い)分、学習例に合わせて、
モデルの形状はどうとでもなる(オーバーフィッティングしやすい)
→ 適切なモデルが学習できるだけの大量の偏りのない事例が必要
どういう基底関数を使えばいいのか固定できる
→ 少ない学習例でもOK(最適化するのは𝒃と𝒘だけ)
転移学習、Fine-tuning、データ拡張などの名称で、少数の学習例から 一般性のあるモデルを学習する手法が研究されている