ランキング学習のモデルを構築してみよう
ペアワイズのランキング学習アルゴリズムを使ってモデルを構築しましょう。モデル構築に利用するツールは Learning to Rank for Apache Lucene (LTR4L) 。こちらは、著者も開発に携わっているオープンソースのランキング学習フレームワークです。LTR4Lを使うためには、Apache Ant、IvyとJava 8以上のインストールが必要です。
モデル構築に利用する学習データは、Microsoft社が提供しているランキング学習用のデータ、LETOR4.0のMQ2008です。MQ2008のデータは以下の形になっています。
0 qid:10056 1:0.179567 2:0.000000 3:0.000000 4:0.000000 5:0.174455 ... 2 qid:10056 1:0.114551 2:1.000000 3:0.666667 4:0.000000 5:0.143302 ... 1 qid:10056 1:0.065015 2:0.111111 3:0.333333 4:0.000000 5:0.065421 ...
各行は1つの文書です。一番左の数値は正解(ラベル)で、{0, 1, 2} の3段階になっています。2 はクエリに対して最も関連している文書を指し、0はクエリに対して関連していない文書を指します。「qid」はクエリのidを表し、「1:0.179567 2:0.000000」は1番目の特徴量(本文のTF)と2番目の特徴量(anchorのTF)の値を表現します。
以下のリンクよりデータセットをダウンロードできます(Downloadのところにある "download here" のリンクをクリックして、MQ2008.rarをダウンロードします)。データセットの詳細な仕様も書かれています。
上記リンクより学習データをダウンロードして解凍したら、以下を実行します。
git clone https://github.com/LTR4L/ltr4l.git cd ltr4l ant ivy-bootstrap ant package mkdir data mv /path/to/MQ2008 data
これでLETOR 4.0のMQ2008のデータセットで学習を行えます。今回はLambdaRankというランキングアルゴリズムで実行します。LambdaRankはペアワイズのニューラルネットワークベースのアルゴリズムです。LambdaRankのコンフィグファイルのパスはltr4l/confs/lambdarank.json
であり、中身を見るとデフォルトのエポック数や学習データのパス、隠れ層の活性化関数などの設定が見られます。デフォルトの評価手法は、NDCG@10となっています。
"evaluation" : { "evaluator" : "NDCG", "params" : { "k" : 10 } }
以下のようにMQ2008のデータセットを使って、LambdaRankで学習を行えます。
./train lambdarank
上記コマンドを実行すると、以下の出力が表示されます。
1 tr_loss: 0.715475 va_loss: 0.718519 evaluation: 0.253901 2 tr_loss: 0.678584 va_loss: 0.677052 evaluation: 0.488971 3 tr_loss: 0.676376 va_loss: 0.672630 evaluation: 0.458577 4 tr_loss: 0.674833 va_loss: 0.670501 evaluation: 0.432308 5 tr_loss: 0.654248 va_loss: 0.649956 evaluation: 0.448449 6 tr_loss: 0.626821 va_loss: 0.624697 evaluation: 0.466102 7 tr_loss: 0.610173 va_loss: 0.613599 evaluation: 0.466770 8 tr_loss: 0.601708 va_loss: 0.610180 evaluation: 0.469990 9 tr_loss: 0.592280 va_loss: 0.602943 evaluation: 0.474676 10 tr_loss: 0.576621 va_loss: 0.586273 evaluation: 0.485357 11 tr_loss: 0.555400 va_loss: 0.562118 evaluation: 0.497641 12 tr_loss: 0.532048 va_loss: 0.535077 evaluation: 0.512376 13 tr_loss: 0.511615 va_loss: 0.511221 evaluation: 0.526410 14 tr_loss: 0.497519 va_loss: 0.494673 evaluation: 0.529280 15 tr_loss: 0.490013 va_loss: 0.487210 evaluation: 0.531615 16 tr_loss: 0.488278 va_loss: 0.488166 evaluation: 0.530681 17 tr_loss: 0.490726 va_loss: 0.496021 evaluation: 0.531085 18 tr_loss: 0.496008 va_loss: 0.508311 evaluation: 0.529209 19 tr_loss: 0.501833 va_loss: 0.520882 evaluation: 0.526741 20 tr_loss: 0.505837 va_loss: 0.529824 evaluation: 0.524291
上記出力のtr_lossとva_lossは学習データ(tr)と評価データ(va)で計算された損失です。 evaluationは評価値で評価データにおいて計算されます。上記出力では学習が進むと損失が下がるのに対し、評価値は上がっていることが確認できます。 学習が終わると、構築したモデルはmodel/lambdarank-model.json
に保存されます。
学習データと評価データの他に、テストデータもあります。テストデータとは構築したモデルを評価するためのデータで、モデル構築時には使いません。モデル構築時に一切使っていないので、モデルが未知データにどれほど強いか評価するために使います。以下のコマンドでテストデータを用いて構築したモデルをNDCG@10で評価します。
./predict lambdarank # 出力 Evaluation score: 0.465339
おわりに
ランキング学習は検索エンジンにおけるランキング改善を目的として研究・開発が始まりましたが、それ以外にもいろいろな場面で応用できると考えられます。例えば、
- インターネット通販におけるお勧めの商品リストの作成・改善
- パーソナライズ検索
- 検索語のオートコンプリート
など、文書などの集合に順序をつける問題に広く応用できます。実際に上記のようなアプリケーションにランキング学習のモデルをデプロイしている企業はいくつかあります。
ランキング学習用の公開されているデータセットがあり、自分でランキング学習をやってみたい人は、本記事で用いたMicrosoft社提供のLETORのMQ2007やMQ2008、OHSUMEDなどをお勧めします。