CodeZine(コードジン)

特集ページ一覧

話題の「ランキング学習」とは? 回帰法・分類法との違いからモデル構築まで

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2018/12/17 11:00

目次

ランキング学習のモデルを構築してみよう

 ペアワイズのランキング学習アルゴリズムを使ってモデルを構築しましょう。モデル構築に利用するツールは 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などをお勧めします。

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • Kamuela Lau(カムエラ ラウ)

     米国ハワイ州出身。2014年に米国マサチューセッツ州の Williams College を物理学と日本語学の二重専攻で卒業後来日。株式会社ロンウイットでランキング学習など機械学習を中心に、製品開発や顧客コンサルティングの業務に従事。米国の Georgia Institute of Technol...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5