Posts

Showing posts from September, 2018

「機械学習の論文をスクラッチから実装しよう!」LambdaMART の数式をコードに落とす

Image
「機械学習の論文をスクラッチから実装しよう!」というシリーズは、機械学習で現れる数式をコードに落とすことを目的としています。論文で数式がでてくると、「これは 具体的にはどういう式なのでしょう」と思うことは多いでしょう。その数式が実際のコードで実装された形であれば、漠然としていた数式がわかりやすくなるのではないかと 考え、本シリーズを書くことにしました。本記事では、数式の実装に重点を置いてコードを書きます。本記事に含まれたコードはアルゴリズムの評価、判別などの完全実装ではなく、 むしろ機械学習のアルゴリズムを実装するにあたって参考になればなと考えています。提供しているコードは Learning-to-Rank for Lucene というオープンソースで筆者が書いたコードに基づいています。ランキング学習LambdaMART はランキング学習(Learning to Rank)のアルゴリズムです。ランキング学習は、情報検索において多用されており、yes か no、クラス・関連度予測ではなく、複数の文書のランキング(表示順)に基づいた学習です。例えば、以下二つの文書があるとしましょう(星の数が多いほど関連度が高い)。文書A, 星の数:5文書B, 星の数:4文書C, 星の数:3学習済みのモデルでそれぞれの文書に星の数を予測しようとしたら、以下の結果が出たとします。文書A, 予測値:4文書B, 予測値:2文書C, 予測値:1上記の予測値は、期待の星の数とは異なりますが、星の数の高い順で並ぶと、表示順が変わりません。ユーザにとっては結果の表示順が理想と全く同じです。従って、文書のランキングに基づいて学習し、学習されたモデルを文書のランキングで評価すべきではないかというイデアが生まれ、ランキング学習のアルゴリズムが開発されました。LambdaMARTさて、本題に入りましょう。LambdaMARTは、どういう機械学習のアルゴリズムかというと、勾配ブースティング回帰木(Gradient Boosted Regression Tree)のアルゴリズムです。具体的には LambdaMART はニューラルネットワークのアルゴリズム「LambdaRank」の勾配を用いて、MART(Multiple Added Regression Trees)というブースティングアルゴリズムで作る回帰木の…