自然言語処理における類似度学習(機械学習における距離学習)について

Twitterグラフ理論に関する話題が上がっていたので、最近調べている距離学習(distance metric learning)について少しまとめてみる。カーネルとか距離(類似度)とかを学習するという話(カーネルというのは2点間の近さを測る関数だと思ってもらえれば)。

この分野では Liu Yang によるA comprehensive survey on distance metric learning (2005) が包括的なサーベイ論文として有名なようだが、それのアップデート(かつ簡略)版として同じ著者によるAn overview of distance metric learning (2007) が出ているので、それをさらに簡略化してお届けする(元論文自体本文は3ページしかないし、引用文献のあとに表が2ページあって、それぞれ相違点と共通点がまとまっているので、これを見ると非常に分かりやすい)。ちなみにそれぞれMatlab 用のコードが公開されているので、試したい人は(Matlab があれば)すぐ試せるのもよい(少なくともコードを読めばアルゴリズムも分かる)。

さて、そもそもなんで距離(カーネル)学習なんてするのか、という話だが、自然言語処理をはじめとした様々な分野で、2つの対象がどれくらい近い・遠いか、というのを測る尺度は重要である。自然言語処理では同義語(言い換え)獲得、固有表現抽出にはじまり、様々な問題で素性の一つとして使われる要素技術の一つである(他の分野としては画像認識で同じ顔の画像を検索するための特徴量として使われたり、音声検索で使われたりもする)。そして、しばしばどんな機械学習手法を使うかなんてのより、どんな素性を使うか・どんな距離関数を使うかのほうがパフォーマンスに大きな影響を与える。素性エンジニアリング(feature engineering)という言葉があるくらい、機械学習が重要であるというよりは、解きたい問題の特徴を考え抜いて、対象の分類に寄与する素性を考えるほうが大事だ、ということである。言い換えると、確かに機械学習の登場によって自然言語処理で専門家がしこしこルールを書いたり辞書を人手でメンテナンスするコストは確実に減ったのだが、だからといって機械学習(数学)ばかり知っているだけではだめで、(時には泥臭い、例外だらけの)人間の言語に関する知識も必要である、ということだ。

そういったわけで、どんな素性を使うかというのは重要なのだが、それぞれの素性が全く同じ重要性があるわけではなく、分類・認識に全く寄与しない素性もたくさんあって、こういうのを人手で重みをつけるのはたいへん骨が折れる。どんな素性を使うのか、という問題は「素性選択(feature selection)」または「次元削減(dimension reduction)」と呼ばれ、それ自体で一つの研究テーマである(松本研では ai-a さんと ikumi-s さんが取り組んでいる)が、ざっくり言うとこれを自動でやりましょう、というのが距離学習のしたいこと(の一つ)である(実際は対象同士の類似度を直接学習する場合もある。問題としては裏表だが……)。ではどんな距離を学習するのか? というと、実はマハラノビス距離という距離を学習していることに相当するのだが、その距離をどういうふうに縮めたり伸ばしたり、もしくは回転したり(行列のかけ算に相当する)するか、というのを実際のデータから学習したいわけだ。

方法は大きく分けて4つある。

1つ目は教師あり(つまり人手で作成した正解データがある状態)で距離学習する手法。距離を全体で最適化するように学習する手法と局所的に最適化するように学習する(グローバルに制約を満たそうとしてもできないことがあるので)手法、あとは Neighborhood Component Analysis (NCA) や Revelant Components Analysis (RCA) がここに入る。2つ目は教師なしで距離学習する手法。Principal Component Analysis (PCA)、Multidimensional Scaling (MDS)、Laplacian Eigenmap (LE) などがここに入る。

3つ目は最大マージンに基づく手法で、Large Margine Nearest Neighbour (LMNN) とかカーネル化した距離学習を最大マージンでやる手法がここに入る。要は同じクラスに属する事例の距離を0にして、違うクラスに属する事例の距離を大きく(究極的には∞)する、という話。4つ目はカーネル版の距離学習で、学習したいカーネルに学習元のカーネルを近づけるというカーネルアライメントの手法や、ラベルつき事例から作成した idealized kernel というカーネルに近づけるように学習する手法(こっちの利点としてはラベルつき事例からカーネル作るので、事前にカーネルを仮定しなくてよい)がある。

自分の気持ちとしてはラベルつきデータ(たとえば語義曖昧性解消であれば、どの単語がどの意味であるかというタグ)があるならそれを使って学習したいし、かといってラベルなしデータが大量に手に入るのであれば、ラベルなしデータも使って精度を向上させたい(つまり半教師あり学習の設定)、というもので、距離学習にラベルつきデータを使う手法を最近実験中。

cf.