はじめに
この記事は、情報検索・検索エンジン Advent Calendar 2019 - Qiitaの14日目の記事です。
2019/12/4にSearch Engineering Tech Talk 2019 Autumnにて、ヤフーにおける機械学習検索ランキングの取り組みについて発表しました。
どんな発表をしたの?
ヤフーショッピングやヤフー知恵袋の検索の裏側では、機械学習によるコンテンツのランキングを行っています。
登壇では、なぜ機械学習によるランキングが必要なのか?どのようにランキングモデルを構築・運用しているのか?について紹介しました。
@818uuuさんに、スライドレコーディングでまとめていただきました、ありがとうございますmm
ヤフーにおける機械学習検索ランキングの取り組み(ヤフー株式会社 .@sz_drさん)のお話を聞きました!
スライドレコーディングに挑戦してみました
3枚の画像にメモをまとめました
スライドわかりやすいし内容もランキング学習とか検索の悩みの話でおもしろかったです!#searchtechjp
登壇の経緯は?
@takuya_bさんからお誘いをいただきました、この場をお借りして感謝申し上げます。
Search Engineering Tech Talk自体には今回で3回目の参加になるのですが、検索と機械学習、特にランキング学習について触れた発表はまだ無かったため、紹介すると面白いかな?と思い登壇を決めました。
発表の内容と話しきれなかったこと
当日発表しきれなかったこと、懇親会やtwitterでいただいたコメントへの掘り下げをしていきます。
ランキングモデルとリアルタイムな予測
検索結果がなかなか返ってこないとイライラしますよね?*1
ランキングモデルは、クエリにヒットしたコンテンツをリアルタイムにランキングする必要があるため*2、予測レイテンシに注意する必要があります。
一般的に、機械学習モデルの重さと精度はトレードオフの関係にあるため、例えば巨大Neural Networkによるランキングは、精度は良いかもしれませんが、プロダクトには入れづらい…といった悩みがあります。
とはいえ、Googleは検索にBERT入れた*3と発表しているし、AlibabaはGraph Embedding手法が検索やレコメに入っている*4と発表しているので、やればできる!ということです、頑張っていきましょう。
ランキング学習における特徴量の注意
ランキング学習問わず、一般的な機械学習プロジェクトについて言える話ですが、特徴量に何でもかんでも突っ込んで良いとは限りません。
例えば、
- 他のモデルによる予測結果を特徴量に入れると、前段モデルの予測を待つ必要があるため、予測レイテンシに不安。
- コンテンツの投稿時刻と検索リクエスト時刻の差分(秒)を特徴量に入れると、検索を更新する度にランキング結果が変わってしまう。時間/日単位にすれば、問題は軽減される。
- ユーザーのデモグラ情報や行動履歴を特徴量に入れると、ユーザーによって検索結果が変わる。ユーザーによって検索結果が変わってもよいか、また、例えば男女間で検索結果が異なるのは差別に繋がらないか考慮が必要*5。
などなど、オフラインで精度が上がれば何でもオッケーというわけにはいきません…
ランキングモデルの更新
これもランキング学習問わないテーマですが、機械学習モデルを更新しないまま使っていると、精度が低下していくことがあります。
例えば、季節トレンドのあるサービス(旅行サイトやECサイトなど)において、学習時のデータと予測対象が乖離していくことが、原因の1つとして挙げられます。
他にも、サービスの拡大・UI変更によって特徴量の意味合いが変わった際には、再度モデルを作り直す必要がある…など、ランキングモデルを導入してからも面倒を見てあげる必要があります。
ランキング学習試したいんだけど、何から始めれば良い?
まず、ランキング学習を使わないことを考えます( ゚д゚ )エー
というのも、
という難しさがあります。
それでもランキング学習を試したいという場合でも、まずは簡単なランキング(例えばtf-idfやBM25といったスコアリング、人気度スコア順)から始めるべきです。
機械学習プロジェクト一般に言えることですが、機械学習手法だけを比較・検討していると、そもそも機械学習が必要なタスクかどうか分かりません。
あらかじめ簡単なランキングによる精度・KPIなどを確認しておき、その次にランキング学習による精度・KPIを確認することで、ランキング学習導入のコスパを見積もることができます。
ランキング学習におけるバイアス
最初に出した候補にしかフィードバックがかからないのかな。 #searchtechjp
トップ10がダメだと入れ替わらなさそう。 #searchtechjp
ユーザー行動ログを使って学習する系の話あるあるですが、学習データセットには様々なバイアスが乗っかっている恐れがあります。
例えば、
- 検索結果上位のコンテンツはクリックされやすい(position bias)
- ランキングモデルはクエリにヒットした集合をランキングするが、データセットに入るのはユーザーが検索結果で閲覧したコンテンツのみ*7(学習データと予測対象の違い)
- 検索結果に良いコンテンツが存在しなければユーザー行動が発生しないため、正のフィードバックが得られない
- ユーザー行動が発生しなかったコンテンツは、本当に関連度が低いコンテンツなのか分からない(たまたまクリックされなかっただけかも)
…など考慮すべき点がたくさんあります。
ランキング学習とバイアスの問題について、Unbiased Learning to Rankというテーマで研究が盛んに行われています。
Unbiased Learning to Rankについてはusaitoさんのブログが詳しいです。
検索クエリ「500円」
「ECサイトだと「500円」というキーワードがくる」 #searchtechjp
500円とかポイント消費したいようなクエリにどう対応すればいいのか問題。 #searchtechjp
;;
LightGBMのパラメータ探索について
リアルタイムに利用するモデルなので、チューニングの際にはモデルのサイズも気にしている
これ中々すごいな#searchtechjp
モデルのサイズ気にしながらって、何を目安にチューニングしたのか気になる #searchtechjp
LightGBMのモデルサイズを気にしながらハイパラチューニング… 具体的に何やってるんだろうか。単純にチューニングの制約にモデルサイズに関するものが入ってるってだけ? #searchtechjp
これは伝え方が下手で申し訳無いのですが、大したことはやっていません…
LightGBMにおける、予測時間に影響するパラメータとして、
- max_depth
- num_leaves
- num_trees
などがありますが、範囲を絞らずに探索してしまうと、とてつもなく深い&たくさんの木が生まれてしまうことがあります。
『Kaggleで勝つデータ分析の技術』では、GBDTのパラメータチューニングの方法として、
- 決定木の数は十分多くして、アーリーストッピングにより制御する
- 学習率etaはチューニングでは0.1を使い、提出するモデルを作るときには小さくする
という方法が一例として紹介されています。
学習率を小さくすればするほどたくさんの木が生まれます。もちろん、予測に十分時間をかけられるタスクであれば問題無いのですが、リアルタイムに予測が走る本番環境では入れられないモデルとなってしまいます。
事前にどれくらいの木の深さ・本数なら負荷に耐えられるのかを検証しておき、ハイパーパラメータ探索の範囲に指定する…といったことをしています。
なので、学習率を固定にして木の本数を増やす戦略というよりは、木の本数を固定にして学習率を調整する戦略を取っています。*8
検索のKPI・A/Bテストについて
Q: ABテストどのくらいのスパン? A: モデル以外も含めてかなり沢山。オフラインのテスト+ABテストには相関があるのでオフラインでうまくいくならABもうまくいきやすい。 #searchtechjp
(>人<;)
補足すると、単純にA/Bテストやって検定して有意差が〜とはやっていないです。
- KPI X%の向上を確認するのに必要なサンプルサイズはいくつか?
- A/Bテストの発動する単位によっては、独立性の仮定が成り立たず単純なt検定ではダメ
など、A/Bテストの統計処理は注意深く行なっています。
A/Bテストに必要なサンプルサイズの決め方については『サンプルサイズの決め方(統計ライブラリー)』を、A/Bテストの発動単位とKPIについてはA. Deng, et. al., WSDM 2017を参考にしています*9。
最後に
コメントくださった皆さまありがとうございました!!
検索を良くする方法としてランキング学習は大変ですが、大きな改善にも繋がる可能性を秘めており、かつ、とても面白いテーマだと思います。
発表内容が皆さまの検索改善の一助になると嬉しいです(っ´ω`c)
*1:"Online Controlled Experiments at Large Scale", KDD 2013. より、"an engineer that improves server performance by 10msec (that’s 1/30 of the speed that our eyes blink) more than pays for his fully-loaded annual costs."
*2:入力クエリが事前に分かっているなら、オフラインでランキングを作っておくといった実装が可能
*3:Understanding searches better than ever before
*4:"AliGraph: A Comprehensive Graph Neural Network Platform", KDD 2019.
*5:"Discrimination through optimization: How Facebook’s ad delivery can lead to skewed outcomes", ACM Trans. Comput.-Hum. Interact. 2019.
*7:ランダムにネガティブサンプリングすると良い…かも?
*8:この探索方法が必ずしもベストだとは思っていないです、ツッコミあればぜひ…