この前の続き。
前回のところは設定をどう置けばいいのかetcが自分でもはっきりしていなかったりで、とりあえずRecallとPrecision書いてみました的な感じになってしまっていたorz。ということで今回はもうちょっとその付近をはっきりさせつつ、プログラムのあれなところも修正してもう一回RecallとPrecisionのplotをやってみました。
閾値などのパラメータは今回は置いといて*1、食わせる辞書のサイズを変化させて結果を見てみることにします。
辞書サイズを変化させてみる
いきなり結果。Iterationは半教師あり学習の中のIterationの数のことです。
Recallが小さいときは差がほとんどないですが、Recallを大きくしていくと半教師あり学習でラベルなしデータを追加していったときのほうがPrecisionが高いということが見て取れます。Recall90%くらいのところで、Precisionで5%くらい差が出ている。Iterationを増やすごとにPrecisionも大きくなっているというのも見て取れます(増え方は減るが)。
上の図はある程度大きめの辞書を使っていたので、辞書サイズを小さくしてみる(1/10くらいにしてみた)とどうなるか実験してみました。結果は以下の図の通り。
まず、最初につっこむ教師データの数が小さいので、大きめの辞書を使ったときより全体的にPrecisionが悪くなっているのが見て取れます。まあ、これは当たり前か。注目すべきはRecallが0.95くらいのところ。Iterationが0の場合だとPrecision0.8を切っていたりするのですが、Iterationが20の場合だとPrecisionはまだ0.95以上あったりします。
結果のまとめ
前回の結果と被りますが、以上の結果をまとめると
- 半教師あり学習をやるとPrecisionが向上している
- Iterationを繰り返すたびに、向上率のしかたはゆっくりになっていく
- 教師データ数が小さいときに、Precisionの改善のされ方が特に顕著である
ということが分かりました。Applicationとしては「ちょっとしかない辞書データを使って、新しく辞書に追加できる候補をなるべく精度よく見つけたい」ということだったので、特に3つ目の結論のところがきいてくるかなと思います。
なぜ半教師あり学習を使うと辞書の自動構築がうまく行くのか?
こういう結果が出たわけですが、理由付けがなんとなく思い浮かんだので、書いておきます。
現在、素性として
- 複合名詞中の単名詞自体と単名詞の品詞(「名詞,一般」くらいまで含めた感じの)
- 複合名詞の前後(2つ)の単語自体とその品詞
- 複合名詞を構成する単名詞の数
などを入れている。ここで、教師データとして使う辞書のサイズが比較的小さい場合について考えよう。この場合、上2つのもの、特に単名詞自体というのはかなりスパースなデータになっている。教師データ数を増やせばいいのではないかと思うが、辞書に新たな単語を追加したいからこの実験をやっているわけで、それでは意味がない。
半教師あり学習では大量のラベルなしデータを使う。そして、各Iterationでスコアの高いサンプルを教師データとして追加する。ここがきいてくる。データスパースネスで困っていたところに、外部から教師データと信頼してよいようなデータを取り込むことができる。これにより、データスパースネスをある程度回避できるという仕組みになっていたわけだ。
...という感じでちゃんと説明できそう。半教師ありと相性がよさそうというのが確認できてよかったです。これで論文書けないかなぁ、と思ったりするのですが無理かなー(特にすごいことを使ってない。。。)。
*1:現在は、ヒューリステックな感じで調整している。。。