HOME > Scutumを支える技術 > Scutum技術ブログ

技術者ブログ

クラウド型WAF「Scutum(スキュータム)」の開発者/エンジニアによるブログです。
金床“Kanatoko”をはじめとする株式会社ビットフォレストの技術チームが、“WAFを支える技術”をテーマに幅広く、不定期に更新中!

2021年10月

          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
Scutum開発者/エンジニアによる技術ブログ WAF Tech Blog

教師なし学習の性能評価は雰囲気でやるしかない

books

はじめに

2020年のGWはオライリーの「Pythonではじめる教師なし学習」Outlier Analysisという2冊の本を読んでいたのですが、その過程で私が数年前から持っていた、教師なし学習についての大きな疑問に対する答えが得られました。これは個人的には「年に1度、あるかないか」というくらい大きな衝撃を伴うイベントだったので、ここでブログにまとめたいと思います。なお、もしかしたら、知っている人には当たり前の話なのかもしれません...(もしそうだったらすみません)。

また、オライリー「Pythonではじめる教師なし学習」で行われているハイパーパラメータのチューニングには致命的な間違いがあるので、それも合わせて紹介します。

セキュリティと機械学習における教師なし学習

WAFのように日々大量の通信が発生し、かつ少しずつ内容は変わっていく可能性がある場面では、大量のデータにラベルをいちいち付けることが難しいため、教師なし学習が適用できるとリターンが大きいと考えられます。その中でも、データの中で特に変わった性質を持つものを見つけることができる、異常検知が本命になります。

疑問とは

今回答えを得ることができた疑問とは、「教師なし学習のモデルの性能はどうやって評価すればよいのか」というものです。ざっくりとした大雑把な評価ではなく、細かいレベルでの突き詰めた評価です。

教師なし学習の場面を想定していますが、さらに前提として、以下のような点があります。

  • 異常検知、あるいは外れ値検知をしようとしている
  • ラベルは付いていない
  • データは数十万〜数百万のオーダーで大量にあり、人がラベルを付けることはできない
このような場面で、例えばIsolation ForestやLOF、あるいはクラスタリングのアルゴリズムなどを使って異常検知を行うことを考えます。

当然ですが、モデルはアルゴリズムやハイパーパラメータによって何通りでも作ることができます。しかし、欲しいのは最も性能の良いモデル1つだけです。学習してモデルを作ったらそれを評価したい、というのは当然の欲求であるのですが、これを実際にはどうやるのか?というのが何年もの間、私には不明だったのです。

教師あり学習の場合

教師あり学習ではモデルの評価方法は確立されており、バリデーションと呼ばれています。ここがしっかりしているため、カリカリにハイパーパラメータをチューニングしたり、複数のモデルを組み合わせたりすることができます。性能が上がっていくことを科学的に確認しながら作業を前に進めることができます。

また、特徴量の選択や生成についても同様で、バリデーションが確立されているからこそ、新たな特徴が役に立つのかどうかを確認しながら、作成したり削除したりすることができるわけです。

教師なし学習での欲求

Kaggleで確認できるように、教師あり学習ではモデルの性能を上げるためにさまざまな手法が確立され、特徴量の生成やアンサンブルの手法が「新たな常識」となりました。そして原理的に考えてこれらは教師なし学習でも使えるはずなのですが、バリデーション手法を先に確立しないと、性能が上がるのか下がるのかを判断できないため、実際の作業を進めることはできません。

教師なし学習においても、きっとどこかに役に立つ新たな特徴量が存在するはずですし、良い形でモデルのアンサンブルすると性能は上がるはずです。また、ハイパーパラメータの中のいずれかの値が、もっとも良い性能を発揮するはずです。

教師あり学習で有効性が確認された各種のテクニックを教師なし学習で使いたい...というのが私の強い欲求でした。

答えとの遭遇

そして、遂に2020年のGW、冒頭で書いた2冊の本を同時並行的に読んでいる中で、答えにたどり着くことができました。「Outlier Analysis」のP.30の「1.7.2 Common Mistakes in Benchmarking」に答えが書いてあります。より正確にはこのブログだけでなく原書をぜひ読んでみてください(※1)。

要するに、答えは

「できない」

でした(汗。

クラスタリングの研究者の間ではかなり以前から、「クラスタリングには正解は存在しない」ことは共通の認識として存在していたようですが、それと同じく異常検知・外れ値検知を行う場合でも、モデルの評価を正確に行うことはできないというのが結論です。本当に残念な事実なのですが、納得できます。

「ざっくりした評価」は可能

前項で示したように、教師なし学習ではモデルの評価を正確に行うことはできません。そのため、カリカリにハイパーパラメータを操ってモデルをチューニングしたり、性能がとても近い2つのモデル同士のどちらがより優れているのか、を判定することはできません。

しかし、大雑把な比較ならば可能です。例えば、どんなデータに対しても完全にランダムに「異常スコア」を吐き出すモデルと、Isolation Forestのモデルを比較したら、圧倒的に後者の性能が勝るはずですが、これは実際に確かめることができます。これには以下2通りの方法があります(※2)。

ラベルありのデータを使う方法

1つめの方法は、教師あり学習用のデータセットを利用する方法です。私がこちらのブログで行っているように、ラベルを隠したデータで教師なしの学習を行い、性能の評価をラベルを使って行う方法です。

この方法であれば、前項で書いたような「完全にランダムにスコアを吐く」ようなでたらめなモデルは明らかに性能が低いことが確認できます。そして常識的に考えればまったく別のデータセットでも同じような傾向になるであろうことは予想できます。

しかし、この方法で使っているデータセットは実際に教師なし学習を行いたい、本来の目的のデータセット(ラベルなし)とは別のものです。そのため、このラベルありのデータセットで2つのモデルの性能差がわずかな場合には、本来の目的のデータセット側でどちらが勝るのかを評価することはできません。

いくつかのデータにラベルを付ける方法

2つめの方法は、本来目的としていたデータセット(ラベルなし)において、少数のデータに人手を使ってラベルを付け、そのデータで評価を行う方法です。この方法でも、「完全にランダムにスコアを吐く」ようなモデルと、まともなモデルとの性能差があることは明確に確認することができます。

しかし、ラベルを付けることができたデータはデータセット全体の中ではごく少数であるため、性能が拮抗している2つのモデルの性能差をこのラベル付きの少数のデータで行ってしまうと、その部分への過剰適合が起こる可能性があります。そのため、やはり性能差がわずかな場合には、どちらが勝るのかを厳密に評価することはできません。

生存者バイアスに注意

今回のこのブログの主題である「教師なし学習の異常検知では、モデルの正確な評価はできない」ことに気づかせてくれたきっかけは、実はオライリーの「Pythonではじめる教師なし学習」のP.100にある、致命的な間違いでした。

ここでは、前々項で紹介した、「ラベルありのデータを使う方法」によって教師なし学習のモデルのハイパーパラメータをチューニングしています。そして、出来たモデルに対して「ラベルを使っていないことを考えれば、素晴らしい結果だ」としています。

先に書いたように、私はかなり長い間、教師なし学習でハイパーパラメータのチューニングを行うことを考え、方法を模索していました。そのためこの部分を読んだときは「これは!!」と思いました。つまり、ここに探していた答えがあるのかと思ったのです。

しかし良くこの手法について考えてみると、モデルの選択(ハイパーパラメータの選択)の際にラベルを使ってしまっており、これは教師なし学習の結果とは言えません。複数のモデルから1つのモデルを選択する過程から、これはまさに生存者バイアスであることがわかります。こちらのAmazon.comのレビューでも同様の指摘がされています。

例えば、将来(次の一回)のジャンケンに勝つことを目的にモデルを3つ(グー・チョキ・パー)を作ります。次に、ラベル(次のジャンケンで何が勝つかの正解データ)を見て、3つの中から勝つモデルを選択します。そして、そのモデルが勝利することをもって「教師なし学習で作ったモデルにしては素晴らしい結果だ」と言っているのと同じことです。もしラベルがなかったら、そのモデルを選択できないわけです。

教師なし学習では優秀なモデルを作れないことが問題なのではなく、作ったとしてもそれを選ぶことができないことが問題なのです。

このオライリー本のミスから、改めて「教師なし学習のモデルの評価はどう行うのだろうか?」という視点で「Outlier Analysis」を読んでいたところ、この節(P.30の1.7.2)に答えが書いてあることに気づくことができました。そういう意味で個人的にはこのミスに非常に感謝しています。

ちなみに、「Outlier Analysis」では前述の生存者バイアスの問題は"Such an approach is not acceptable in outlier detection..."と、明確に気をつけるように書かれていました。つまり「Outlier Analysis」において「Common mistakes(よくある間違い)」とされているものが、もろにオライリーの本に存在するということです。

まとめ

今回は教師なし学習のモデルの評価における根源的な問いの答えをついに見つけることが出来たので、ブログにまとめてみました。教師あり学習では存在が完全に当たり前となっている「バリデーション」方法が、教師なし学習には存在しない、ということは、あまり広く知られていないような気がします。実用上、これは「ラベルあり・なし」と同じくらいの、教師あり学習と教師なし学習における最大の違いの1つとも言えるポイントだと感じました。もっと、強調されてもよいのではないかと思います。

個人的にはこれによって教師なし学習における「カリカリのハイパーパラメータチューニング」や「モデルのアンサンブル」の実現が相当に遠のいたと感じており少々悲しいですが、何年も抱いていた疑問がようやく答えを得たという点については非常にスッキリし、気持ちが良いです。

※1: Google Booksで立ち読み可能なようです。また、この本では評価はKaggleで好んで用いられるValidationではなくBenchmarkingという単語が使われていますが、実質同じです。

※2: 他にもあるかもしれません。