いま修論を振り返る
この記事は Sansan Advent Calendar の9日目です。
約5年前、修士時代にやってた機械学習の研究の話をします。この分野で5年前といったら化石のような内容かもしれませんが、いま思い返してもなかなか面白いテーマでした。ちなみに普段の私の業務では機械学習は扱ってません。
画像データは当時のものを使いまわしています。ダサいのは知ってます。
(もっとゆるい記事を書くつもりだったのですが、これまでマジメな内容しかないので方針をかえました)
前提
機械学習を分類×回帰、教師あり×教師なしの四象限でみたとき、分類かつ教師あり、を対象にしています。学習機械は Support Vector Machines (SVM) を想定します。
これらの用語の説明はここでは行いません。
能動学習 (active learning)
いまも能動学習という分野があるのかわかりませんが (世間では教育系の用語として定着している感はありますが) 、扱う問題は「教師あり学習の学習データをどうやって集めるか?」というものです。どういうことかというと、教師あり学習の学習データはラベルが付いている必要があるわけですが、ラベルが付いていないデータが大量にあったときに、全部のデータのラベルを付けるとコストがかかるので避けたい。つまり、ラベルをつけるデータの数が少なく、かつ、予測性能を高めたい。
流れとしては以下を想定します (結局最初にラベル付けるの?という疑問がありそうですが、ここで説明するとゴチャゴチャするのでとりあえずそういうもんだと思ってください)
- ラベル付きデータを用意する
- 学習する
- ラベルなしデータからラベルを付けるデータを選択する
- データに人間がラベルを付ける
- に戻る
似た問題に対処する手法に半教師あり学習 (semi-supervised learning) があります。こちらは、ラベルが付いているデータと付いていないデータの両方が手元にあったとき、両方を使って学習しようというものです。能動学習は、新たにラベルを付けるとしたらどのデータにつけるか、という問題を扱います。半教師あり学習と能動学習と排反な関係ではありません。つまり、半教師あり学習に能動学習を組み込むこともできるわけです。今回は半教師あり学習についてはここまで触れるだけに留めておきます。
既存研究
Tong and Koller (2001) の Margin 法では、現在の学習で得られた情報からみてラベルが最も不確実なデータを選択します。SVM でいうと不確実性とは識別面からの距離です。
ギリギリ境目のデータを学習させようということですね。たしかに直感的です。が、実は落とし穴があります。そして、それら落とし穴に対応した手法も存在します。
- 局所的な選択になりがち
- 初回の学習データが全体からまんべんなくされたものであるとは限りません。いちど識別面が決まってしまったら、そこから離れたデータは二度と選択されなくなってしまいます。
- Baram ら (2004) や Osugi ら (2005) の手法では、データ集合全体から大局的にデータを取得しようとします。
- 複数のデータを選択する際、選択したデータが似ていると効率が悪い
- 外れ値が防げない
- 不確実だと外れ値が多い、と一概にいえるわけではないのですが、除外することが考慮されていません。
- Settles と Craven (2008) の手法は、データが高密度な領域から選択しようとします。
既存研究はいろいろあるが
上記色々な手法があるわけですが、どの戦略を重視すべきかがわかりません。ユーザーパラメーターで重み付け、という提案もあるにはあったわけですが、パラメーターチューニングのためには正解データを用意しなければならない (= 人間のラベル付けが必要) なので本末転倒です。
で、どうするか。
Small Pool 法
ちょっとだけ話が逸れます。
Ertekin らによる Small Pool 法は Margin 法の拡張です。ラベルなしデータのなかから無作為にデータを抽出し、そのなかから最も不確実なデータを選択する、というものです。
なんじゃそりゃという感じですが、意外と理に叶っています。無作為抽出ということは分布にしたがって高密度な領域のデータが選択されやすく、外れ値が混入する確率が低くなります。また、全データに対して不確実性を求める必要がないので、計算時間も少なく済みます。
ちなみにデータ抽出件数ですが、「不確実性の高い上位 5% を 95% の確率で選択するためには、全体のデータ数によらず 59 件取得すれば十分である」ということが証明されています。不思議!!(でもそんなに難しくないので別の記事で紹介しようと思っています)
で、この Small Pool 法を拡張しようと考えました。つまり、無作為に抽出していたデータを、ある程度尺度を設けて抽出しようということを考えました。
提案手法 (名前は無い)
以下のような流れです。2. - 4. が、 Small Pool 法にはなかったプロセスです。
- ラベルなしデータから無作為にデータを取得する。
- データに対して多様性、探索性の評価値を計算する。
- で求めた評価値をそれぞれに対して乱数と比較、いずれもそれらの乱数より大きければ、ラベル付け候補データに含める。そうでなければ破棄して 1. に戻る。
- までを、データ個数が目的の個数になるまで繰り返す。
ラベル付け候補データの中から最も不確実性の高いデータをラベル付け対象データとする。
で乱数を用いているのは、データ全体に対して評価値を計算するのは現実的でないのと、無作為性を残したかったからです (平たくいうと楽したかった) 。
(評価値の定義はまたややこしくなるので載せません、もし知りたいという奇特な方がいらっしゃれば教えてください)
比較
で、結果どうだったかというと、まあまあ高い予測性能になりました。以下、F1値の ALC です。縦軸はテストに用いたデータセット、横軸は手法です。Proposed1 が上記の提案手法です。
(テストデータはもともと全てラベルが付いてあるものですが、付いていないものと付いているもので分け、はじめに述べた能動学習の流れにおける「データに人間がラベルを付ける」のときにもともとのラベルを使用する、ということにしました)
ちなみに計算時間も短いです。こちらは MNIST-8 というデータセットに対して行った結果で、縦軸は対数軸です。訓練事例数というのはラベル付きデータ数です。上の表で AD という手法が Proposed1 に次いで高い値を出していますが、かなりの計算時間がかかっていることがわかります。
というわけで
だいぶ端折ましたが、修論を振り返りました。こんなもんで許してください。