RankNet再開発ブログ

RankNetの再開発した際に,気づいた注意すべき点についてまとめます. 尚,RankNetは"From RankNet to LambdaRank to LambdaMART: An Overview"[1]に基づきます.

RankNetについて

まず,RankNetがどのようなものかここで紹介します.

訓練データはクエリによって分割されている.RankNetは入力の特徴ベクトルにマップします.

クエリが与えられた時,urlのペアの特徴ベクトル, はモデルにより,スコアは計算されます.

よりクエリと関連度が高いことを意味します.モデルの2つの出力は,シグモイド関数によってよりも上位にランク付けされるべきであるという学習済み確率にマッピングされます.

2つの出力はシグモイド関数によってにマッピングされる.が真の確率分布に近づくように交差エントロピーコスト関数を適用し学習します.コスト関数は以下の通り,

クエリが与えられた時,の場合, の場合の場合はと定義します.そうすると,となり,コスト関数は,

となる.このコスト関数は対称的(の符号変えたら不変)であり,の時.

の時,

と表されます.また,の時はです.したがって,

と表され,重み(モデルのパラメータ)は,SGDでコスト関数を最小化することで更新される.

ここでは正の学習係数.


バッチ処理について

RankNetは,クエリについてurlのペアについて処理を行うが,実際にペア一つずつ計算すると計算量が膨大になってしまいます.計算量の問題を解決するためにバッチ処理を行います.

今回利用したデータセットMQ2007[2]は,一つのクエリについて,約40個の文書があります.40個の文書には文書のから2個の文書ペアを選択する組み合わせは780通り存在します.この780通り全て計算すると計算量が膨大になるので,バッチ処理を行います.

コスト関数を求めるためにを求める必要があるので,まず40個の文書について全てのスコアを計算します.計算できたら,の行列を作ります.

この行列は重複を含むための上三角部分を抽出します.

si_sjを用いてコスト関数を計算します.

モデルの構築

今回の実装ではPyTorchを用いました.PyTorchでモデルを定義する方法はいくつかあります.

nn.Moduleを継承して,構成要素をinitに定義して順方向をforwardに記載します.モデルに入力を渡せば自動的にforwardを実行してくれます.

最もシンプルな方法は,

です.活性化関数もinitに書くことができます.

次にSequential.必要な処理をひたすらnn.Sequentialに順番に渡していくだけなので簡単です.

となります.

layerを先にリストにまとめておいてnn.Sequentialに渡す方法もあります.

この方法を使うとモデルの構造を変えることが容易になります.

References

[1] Christopher J.C. Burges . (2010) From RankNet to LambdaRank to LambdaMART: An Overview. Microsoft Research Technical Report MSR-TR-2010-82

[2] Tao Qin and Tie-Yan Liu. (2013) Introducing LETOR 4.0 datasets. arXiv:1306.2597.

 

戻る

間違いの指摘やコメントお待ちしています

Comment Form is loading comments...