Upgrade to Pro — share decks privately, control downloads, hide ads and more …

論文紹介: Accelerating Learned Sparse Indexes Via T...

論文紹介: Accelerating Learned Sparse Indexes Via Term Impact Decomposition (Findings of EMNLP 2022)

IR Reading 2023 春 での論文紹介に使用したスライドです.
https://sigir.jp/post/2023-06-10-irreading_2023spring/

紹介した論文
Accelerating Learned Sparse Indexes Via Term Impact Decomposition (Findings of EMNLP 2022)

Yu Nakano / 中野優

June 09, 2023
Tweet

More Decks by Yu Nakano / 中野優

Other Decks in Science

Transcript

  1. 論⽂紹介する⼈: 中野 優 https://sites.google.com/view/yu-nakano 図表は基本的に論⽂より引⽤ 私⾒・感想・コメントは薄い灰⾊で記述 Accelerating Learned Sparse Indexes

    Via Term Impact Decomposition (Findings of EMNLP 2022) Joel Mackenzie (University of Queensland), Antonio Mallia (Amazon Alexa, Italy), Alistair Moffat (University of Melbourne), Matthias Petri (Amazon Alexa, USA) URL: https://aclanthology.org/2022.findings-emnlp.205/
  2. 学習済み疎検索で特に有効な 既存の top-k OR 検索をさらに⾼速化する Term Impact Decomposition を提案 論⽂の概要

    MaxScore や WAND など データセットから学習した単語重要度を 転置インデックスに格納し検索する⼿法 2
  3. • データセットから単語重要度を学習する⼿法 ◦ 単語重要度: 単語 𝑤 に対する重み(スコア) • TF-IDF の

    tf 𝑤 $ idf 𝑤 や BM25 の !!"# $% & !! #'( "("# $ %&'"# "$% & $ idf 𝑤 ◦ 学習済み疎検索ではこの重み(単語重要度)をデータセットから学習 • 主に Transformer モデルを⽤いて学習 ◦ 推論時は学習した重み(単語重要度)を転置インデックスに格納し検索 • 利点 ◦ ⽂脈を考慮した単語重要度を設定可能(次ページ) • これにより BM25 などよりも精度良く検索可能に ◦ 転置インデックスが利⽤可能 • これにより既存の様々な知識やツールが容易に利⽤できる(例: 効率的な検索,イン デックスの作成・更新,フレーズ検索などの複雑なクエリ処理など) 背景: 学習済み疎検索(Learned Sparse Retrieval) 3 (term impact) Elastic Cloud でも Elasticsearch 8.8 から利⽤可能に! Elasticsearch 8.8 のリリースの記事: https://www.elastic.co/jp/blog/whats-new-elasticsearch-8-8-0 Elastic Learned Sparse Encoder の紹介記事: https://www.elastic.co/jp/blog/may-2023-launch-sparse-encoder-ai-model
  4. • 通常の BM25 と⽐べて検索が遅い ◦ top-k OR 検索において数倍〜数⼗倍 • なぜか?:

    既存の top-k OR 検索と相性が悪い ◦ 単語重要度の最⼤値の傾向が BM25 と学習済み疎検索で異なる →既存の top-k OR 検索⼿法でうまく⾼速化されない 学習済み疎検索の問題点 DeepImpact uniCOIL MSMARCO-v1 (8.8M) 約 4.8 倍 約 8.1 倍 MSMARCO-v2 (138.4M) 約 75.3 倍 約 15.0 倍 MaxScore を使った場合の⽐較(Table 4 と 5 をもとに計算) 5
  5. • ⼀般的な転置インデックス+クエリ処理を想定 ◦ ポスティングリストは⽂書 ID の昇順に単語重要度を持つ ◦ Document-at-a-time にポスティングリストを処理していく 転置インデックスにおける

    top-k OR 検索 6 単語 𝑡 𝑡 = engine 𝑡 = search ID: 1 ID: 3 ID: 5 ID: 20 重要度: 2 重要度: 3 重要度: 5 重要度: 6 ID: 2 ID: 3 ID: 4 ID: 7 ID: 9 ID: 10 ID: 13 ID: 15 ID: 19 ID: 21 重要度: 1 重要度: 4 重要度: 3 重要度: 2 重要度: 3 重要度: 1 重要度: 2 重要度: 2 重要度: 3 重要度: 1
  6. クエリ例: search OR engine 転置インデックスにおける top-k OR 検索 7 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 1 位 2 位 ID: 1 ID: 3 スコア: 2 スコア: 3 検索結果 (上位 𝑘 = 2 件) ↑ ↑
  7. 転置インデックスにおける top-k OR 検索 8 単語 𝑡 𝑡 = engine

    𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア ↑ ↑ 1 位 2 位 ID: 1 ID: 3 スコア: 2 スコア: 3 検索結果 (上位 𝑘 = 2 件) クエリ例: search OR engine
  8. クエリ例: search OR engine 転置インデックスにおける top-k OR 検索 9 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 ↑ ↑ 1 位 2 位 ID: 1 ID: 3 スコア: 2 スコア: 3 検索結果 (上位 𝑘 = 2 件)
  9. クエリ例: search OR engine 転置インデックスにおける top-k OR 検索 10 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 ↑ ↑ 1 位 2 位 ID: 1 ID: 2 スコア: 2 スコア: 1 検索結果 (上位 𝑘 = 2 件)
  10. クエリ例: search OR engine 転置インデックスにおける top-k OR 検索 11 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 ↑ ↑ 1 位 2 位 ID: 3 ID: 1 スコア: 7 スコア: 2 検索結果 (上位 𝑘 = 2 件)
  11. クエリ例: search OR engine 転置インデックスにおける top-k OR 検索 12 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 3 ↑ ↑ 1 位 2 位 ID: 3 ID: 4 スコア: 7 スコア: 3 検索結果 (上位 𝑘 = 2 件)
  12. クエリ例: search OR engine 転置インデックスにおける top-k OR 検索 13 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 3 5 ↑ ↑ 1 位 2 位 ID: 3 ID: 5 スコア: 7 スコア: 5 検索結果 (上位 𝑘 = 2 件)
  13. クエリ例: search OR engine 転置インデックスにおける top-k OR 検索 14 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 3 5 2 ↑ ↑ 1 位 2 位 ID: 3 ID: 5 スコア: 7 スコア: 5 検索結果 (上位 𝑘 = 2 件)
  14. クエリ例: search OR engine 転置インデックスにおける top-k OR 検索 15 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 3 5 2 3 ↑ ↑ 1 位 2 位 ID: 3 ID: 5 スコア: 7 スコア: 5 検索結果 (上位 𝑘 = 2 件)
  15. クエリ例: search OR engine 転置インデックスにおける top-k OR 検索 16 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 3 5 2 3 1 ↑ ↑ 1 位 2 位 ID: 3 ID: 5 スコア: 7 スコア: 5 検索結果 (上位 𝑘 = 2 件)
  16. クエリ例: search OR engine 転置インデックスにおける top-k OR 検索 17 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 3 5 2 3 1 2 2 3 6 1 ↑ ↑ 1 位 2 位 ID: 3 ID: 5 スコア: 7 スコア: 5 検索結果 (上位 𝑘 = 2 件)
  17. クエリ例: search OR engine 転置インデックスにおける top-k OR 検索 18 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 3 5 2 3 1 2 2 3 6 1 ↑ ↑ 1 位 2 位 ID: 3 ID: 5 スコア: 7 スコア: 5 検索結果 (上位 𝑘 = 2 件) ⻑いリストでも最後まで 全て⾒る必要があり遅い OR 検索の問題点
  18. クエリ例: search OR engine 転置インデックスにおける top-k OR 検索 19 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 3 5 2 3 1 2 2 3 6 1 ↑ ↑ 1 位 2 位 ID: 3 ID: 5 スコア: 7 スコア: 5 検索結果 (上位 𝑘 = 2 件) ⻑いリストでも最後まで 全て⾒る必要があり遅い OR 検索の問題点 Good News!: top-k 検索の場合は⾼速化可能 動的枝刈り: 追加の情報を事前に転置インデックスに格納し その情報を利⽤して⼀部のスコア計算を(安全に)スキップする ⼿法: MaxScore,WAND,Block-Max WAND,… dynamic pruning (注釈) ここで考慮する ⾼速化はナイーブな top-k 検索と全く同じ 結果を返す「安全な」 ⾼速化⼿法のみに着⽬
  19. MaxScore による動的枝刈り(⾼速化) 20 MaxScore ポスティングリスト中の単語重要度の最⼤値を利⽤して ⼀部のスコアの計算をスキップするクエリ処理⼿法 (単語重要度の最⼤値はインデックス構築時に事前計算しておく) (の 1 つ)

    クエリ例: search OR engine 単語 𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア ↑ ↑ 1 位 2 位 ID: 1 ID: 3 スコア: 2 スコア: 3 検索結果 (上位 𝑘 = 2 件)
  20. MaxScore による動的枝刈り(⾼速化) 21 MaxScore (単語重要度の最⼤値はインデックス構築時に事前計算しておく) クエリ例: search OR engine 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア ↑ ↑ 最⼤値 𝑈!"#$"! = 6 最⼤値 𝑈%!&'() = 4 ポスティングリスト中の単語重要度の最⼤値を利⽤して ⼀部のスコアの計算をスキップするクエリ処理⼿法(の 1 つ) 1 位 2 位 ID: 1 ID: 3 スコア: 2 スコア: 3 検索結果 (上位 𝑘 = 2 件)
  21. MaxScore による動的枝刈り(⾼速化) 22 MaxScore (単語重要度の最⼤値はインデックス構築時に事前計算しておく) クエリ例: search OR engine 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア ↑ ↑ 最⼤値 𝑈!"#$"! = 6 最⼤値 𝑈%!&'() = 4 1 位 2 位 ID: 1 ID: 3 スコア: 2 スコア: 3 検索結果 (上位 𝑘 = 2 件) ポスティングリスト中の単語重要度の最⼤値を利⽤して ⼀部のスコアの計算をスキップするクエリ処理⼿法(の 1 つ)
  22. MaxScore による動的枝刈り(⾼速化) 23 MaxScore (単語重要度の最⼤値はインデックス構築時に事前計算しておく) クエリ例: search OR engine 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 ↑ ↑ 最⼤値 𝑈!"#$"! = 6 最⼤値 𝑈%!&'() = 4 1 位 2 位 ID: 1 ID: 3 スコア: 2 スコア: 3 検索結果 (上位 𝑘 = 2 件) ポスティングリスト中の単語重要度の最⼤値を利⽤して ⼀部のスコアの計算をスキップするクエリ処理⼿法(の 1 つ)
  23. MaxScore による動的枝刈り(⾼速化) 24 MaxScore (単語重要度の最⼤値はインデックス構築時に事前計算しておく) クエリ例: search OR engine 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 ↑ ↑ 最⼤値 𝑈!"#$"! = 6 最⼤値 𝑈%!&'() = 4 1 位 2 位 ID: 1 ID: 2 スコア: 2 スコア: 1 検索結果 (上位 𝑘 = 2 件) ポスティングリスト中の単語重要度の最⼤値を利⽤して ⼀部のスコアの計算をスキップするクエリ処理⼿法(の 1 つ)
  24. MaxScore による動的枝刈り(⾼速化) 25 MaxScore (単語重要度の最⼤値はインデックス構築時に事前計算しておく) クエリ例: search OR engine 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 ↑ ↑ 最⼤値 𝑈!"#$"! = 6 最⼤値 𝑈%!&'() = 4 1 位 2 位 ID: 3 ID: 1 スコア: 7 スコア: 2 検索結果 (上位 𝑘 = 2 件) ポスティングリスト中の単語重要度の最⼤値を利⽤して ⼀部のスコアの計算をスキップするクエリ処理⼿法(の 1 つ)
  25. MaxScore による動的枝刈り(⾼速化) 26 MaxScore (単語重要度の最⼤値はインデックス構築時に事前計算しておく) クエリ例: search OR engine 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 3 ↑ ↑ 最⼤値 𝑈!"#$"! = 6 最⼤値 𝑈%!&'() = 4 1 位 2 位 ID: 3 ID: 4 スコア: 7 スコア: 3 検索結果 (上位 𝑘 = 2 件) ポスティングリスト中の単語重要度の最⼤値を利⽤して ⼀部のスコアの計算をスキップするクエリ処理⼿法(の 1 つ)
  26. MaxScore による動的枝刈り(⾼速化) 27 MaxScore (単語重要度の最⼤値はインデックス構築時に事前計算しておく) クエリ例: search OR engine 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 3 5 ↑ ↑ 最⼤値 𝑈!"#$"! = 6 最⼤値 𝑈%!&'() = 4 1 位 2 位 ID: 3 ID: 5 スコア: 7 スコア: 5 検索結果 (上位 𝑘 = 2 件) ポスティングリスト中の単語重要度の最⼤値を利⽤して ⼀部のスコアの計算をスキップするクエリ処理⼿法(の 1 つ)
  27. MaxScore による動的枝刈り(⾼速化) 28 MaxScore (単語重要度の最⼤値はインデックス構築時に事前計算しておく) クエリ例: search OR engine 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 3 5 ↑ ↑ 最⼤値 𝑈!"#$"! = 6 最⼤値 𝑈%!&'() = 4 1 位 2 位 ID: 3 ID: 5 スコア: 7 スコア: 5 検索結果 (上位 𝑘 = 2 件) ポスティングリスト中の単語重要度の最⼤値を利⽤して ⼀部のスコアの計算をスキップするクエリ処理⼿法(の 1 つ)
  28. MaxScore による動的枝刈り(⾼速化) 29 MaxScore (単語重要度の最⼤値はインデックス構築時に事前計算しておく) クエリ例: search OR engine 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 3 5 ↑ ↑ 最⼤値 𝑈!"#$"! = 6 最⼤値 𝑈%!&'() = 4 現時点での第 𝑘(= 2) 位のスコアが 5 スコアが 5 以下の⽂書が 最終的な上位 𝒌(= 𝟐) 件の ランキングに⼊る可能性が消滅 1 位 2 位 ID: 3 ID: 5 スコア: 7 スコア: 5 検索結果 (上位 𝑘 = 2 件) ポスティングリスト中の単語重要度の最⼤値を利⽤して ⼀部のスコアの計算をスキップするクエリ処理⼿法(の 1 つ)
  29. MaxScore による動的枝刈り(⾼速化) 30 MaxScore (単語重要度の最⼤値はインデックス構築時に事前計算しておく) クエリ例: search OR engine (k=2)

    単語 𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 3 5 ↑ ↑ 最⼤値 𝑈!"#$"! = 6 最⼤値 𝑼𝐬𝐞𝐚𝐫𝐜𝐡 = 𝟒 現時点での第 𝑘(= 2) 位のスコアが 5 スコアが 5 以下の⽂書が 最終的な上位 𝒌(= 𝟐) 件の ランキングに⼊る可能性が消滅 1 位 2 位 ID: 3 ID: 5 スコア: 7 スコア: 5 検索結果 (上位 𝑘 = 2 件) ポスティングリスト中の単語重要度の最⼤値を利⽤して ⼀部のスコアの計算をスキップするクエリ処理⼿法(の 1 つ) 𝑡 = search の単語重要度の最⼤値は 4 𝑡 = search のみに存在する⽂書 (つまり 𝑡 = engine には存在しない⽂書) は最終的な上位 𝒌(= 𝟐) 件の ランキングに⼊る可能性が消滅した!
  30. MaxScore による動的枝刈り(⾼速化) 31 MaxScore (単語重要度の最⼤値はインデックス構築時に事前計算しておく) クエリ例: search OR engine 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 3 5 ↑ ↑ 最⼤値 𝑈!"#$"! = 6 最⼤値 𝑼𝐬𝐞𝐚𝐫𝐜𝐡 = 𝟒 1 位 2 位 ID: 3 ID: 5 スコア: 7 スコア: 5 検索結果 (上位 𝑘 = 2 件) ポスティングリスト中の単語重要度の最⼤値を利⽤して ⼀部のスコアの計算をスキップするクエリ処理⼿法(の 1 つ)
  31. MaxScore による動的枝刈り(⾼速化) 32 MaxScore (単語重要度の最⼤値はインデックス構築時に事前計算しておく) クエリ例: search OR engine 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 3 5 skip skip skip skip skip skip ↑ 最⼤値 𝑈!"#$"! = 6 最⼤値 𝑼𝐬𝐞𝐚𝐫𝐜𝐡 = 𝟒 1 位 2 位 ID: 3 ID: 5 スコア: 7 スコア: 5 検索結果 (上位 𝑘 = 2 件) ↑ これらの⽂書は 𝒕 = 𝐬𝐞𝐚𝐫𝐜𝐡 のみに しか出現しないためスキップ可能! 補⾜: skiplist などの データ構造で スキップ⾃体も ⾼速に可能 ポスティングリスト中の単語重要度の最⼤値を利⽤して ⼀部のスコアの計算をスキップするクエリ処理⼿法(の 1 つ)
  32. MaxScore による動的枝刈り(⾼速化) 33 MaxScore (単語重要度の最⼤値はインデックス構築時に事前計算しておく) クエリ例: search OR engine 単語

    𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 3 5 6 最⼤値 𝑈!"#$"! = 6 最⼤値 𝑈%!&'() = 4 1 位 2 位 ID: 3 ID: 20 スコア: 7 スコア: 6 検索結果 (上位 𝑘 = 2 件) ↑ ↑ ポスティングリスト中の単語重要度の最⼤値を利⽤して ⼀部のスコアの計算をスキップするクエリ処理⼿法(の 1 つ)
  33. MaxScore による動的枝刈り(⾼速化) 34 MaxScore ポスティングリストの単語重要度の最⼤値を利⽤して ⼀部のスコアの計算をスキップするクエリ処理⼿法 (単語重要度の最⼤値はインデックス構築時に事前計算しておく) (の 1 つ)

    クエリ例: search OR engine (k=2) Term 𝑡 𝑡 = engine 𝑡 = search 2 3 5 6 1 4 3 2 3 1 2 2 3 1 1 2 3 4 5 7 9 10 13 15 19 20 21 ⽂書 ID スコア 2 1 7 3 5 6 最⼤値 𝑈!"#$"! = 6 最⼤値 𝑈%!&'() = 4 1 位 2 位 ID: 3 ID: 20 スコア: 7 スコア: 6 検索結果 (上位 𝑘 = 2 件) ↑ ↑ 単語重要度の最⼤値 𝑼𝒕 が ⼩さい単語 𝒕 はスキップされやすい MaxScore の性質 e.g. さきほどの 𝑡 = search
  34. • なぜか?: 単語重要度の最⼤値の分布が BM25 と学習済み疎検索で異なる 学習済み疎検索の問題点: 通常の BM25 より遅い ポスティングリストの⻑さの

    log (底 2) (→右にいくほど⽂書頻度が⼤きい) 正規化済み 単語重要度の 最⼤値の分布 ポスティングリスト : ⻑い 単語重要度の最⼤値 𝑼𝒕 : ⼩さい (逆⽂書頻度の影響) スキップが発⽣しやすいので ⽐較的⾼速に処理される BM25 の場合 35 🙆 🙅 🙆
  35. • なぜか?: 単語重要度の最⼤値の分布が BM25 と学習済み疎検索で異なる 学習済み疎検索の問題点: 通常の BM25 より遅い 正規化済み

    単語重要度の 最⼤値の分布 ポスティングリスト : ⻑い 単語重要度の最⼤値 𝑼𝒕 : ⼤きい スキップが発⽣しづらく遅い 学習済み疎検索(DeepImpact, uniCOIL)の場合 36 ポスティングリストの⻑さの log (底 2) (→右にいくほど⽂書頻度が⼤きい) 🙅 🙅 🙅
  36. • リスト分割(List Splitting)ベースの⾼速化⼿法 提案⼿法: Term Impact Decomposition スキップが発⽣しやすい →⽐較的⾼速に処理可能 38

    ポスティングリスト ℒ 𝑡 : ⻑い 単語重要度の最⼤値 𝑈ℒ 1 : ⼩さい Low List 適当な割合で重要度の⾼い順にポスティングリスト を Low List ℒ 𝑡 と High List ℋ 𝑡 の 2 つに分割 🙆 🙅 単語重要度 単語重要度 単語重要度 🙆
  37. • リスト分割(List Splitting)ベースの⾼速化⼿法 提案⼿法: Term Impact Decomposition スキップが発⽣しやすい →⽐較的⾼速に処理可能 そもそも短いので⾼速に処理可能

    39 ポスティングリスト ℒ 𝑡 : ⻑い 単語重要度の最⼤値 𝑈ℒ 1 : ⼩さい Low List ポスティングリスト ℋ 𝑡 : 短い 単語重要度の最⼤値 𝑈ℋ 1 : ⼤きい High List 適当な割合で重要度の⾼い順にポスティングリスト を Low List ℒ 𝑡 と High List ℋ 𝑡 の 2 つに分割 🙆 🙅 🙅 🙆 単語重要度 単語重要度 単語重要度 🙆 🙆
  38. • 𝒎 ≥ 𝟐 個以上の単語に対する MaxScore のスキップ ◦ 基準: 𝑚

    個の単語重要度の最⼤値の和 ∑!"# $ 𝑈%% が 𝑘 位の⽂書のスコア以下か? ◦ ⾜し合わせる 𝑚 個の単語の選び⽅: 𝑈5 の⼩さい順 or の⼤きい順 • リスト分割の場合 ◦ 性質: 必ず Low List ℒ 𝑡 は High List ℋ 𝑡 より先に⾜し合わされる • 単語重要度の最⼤値では 𝑈ℒ 1 < 𝑈ℋ 1 ,ポスティングリストでは ℒ 𝑡 > ℋ 𝑡 ◦ 問題点: High List の 𝑈ℋ 5 をそのまま⾜し合わせるとスキップする基準 を⼤きく取りすぎる • なぜか?: 先に Low List の 𝑈ℒ 1 をスキップする基準に⾜し合わせているため ◦ 解決策: 𝑈ℋ 5 ではなく差分 𝑈ℋ 5 − 𝑈ℒ 5 を⾜し合わせる • この⾜し合わせ⽅を Smart Bounds と呼ぶ Smart Bounds 40 ポスティングリストの⻑さ 単語重要度の最⼤値 (スキップする)基準: 閾値 (threshold) のこと
  39. (Smart Bounds とは違って差分を考える必要がなくなったので) Postings Clipping では High List での特別な処理が不要 Postings

    Clipping 41 • Smart Bounds の問題点 ◦ High List の 𝑈ℋ 5 を⾜し合わせる際に 𝑈ℋ 5 ではなく 𝑈ℋ 5 − 𝑈ℒ 5 を⾜し合わせるという特別な処理が必要 • 提案: Postings Clipping High List ℋ 𝑡 には Low List ℒ 𝑡 から はみ出た分だけを格納
  40. • データセット ◦ MSMARCO-v1 (8.8 M),MSMARCO-v2 (138.4 M) • 実装

    ◦ PISA (https://github.com/pisa-engine/pisa) • Anserini より⾼速らしい • ⽐較する検索⼿法 ◦ BM25,DocT5Query (+BM25) ◦ 学習済み疎検索: DeepImpact, uniCOIL • インデックスサイズに関する実験(右図) ◦ Postings clipping ありでも 最⼤ +1.8% の増加のみ 実験 42 カッコ内はパッセージ数 インデックスのサイズ (単位は GiB)
  41. • MSMARCO-v1 + DeepImpact で実験 ◦ MaxScore,WAND,Variable Block-Max WAND (VBMW)

    で⽐較 ◦ ⼯夫: List Splitting,Priming,Smart Bounds,Postings Clipping 学習済み疎検索に対する⼯夫要素ごとの⽐較 43 ⻘字は同じ⼿法内で最速の値
  42. • MSMARCO-v1 + DeepImpact で実験 ◦ MaxScore,WAND,Variable Block-Max WAND (VBMW)

    で⽐較 ◦ ⼯夫: List Splitting,Priming,Smart Bounds,Postings Clipping 学習済み疎検索に対する⼯夫要素ごとの⽐較 44 提案⼿法全体としては ⼯夫を適⽤しない場合と⽐較して 最⼤約 2.6 倍の改善 VBMW は改善の度合いはかなり⼩さい もとからかなり⼯夫がなされていて改善の余地が少なかった せいかも?もしくは提案⼿法と相性が悪い?実装の違い? 提案⼿法適⽤前: VBMW 最速 提案⼿法適⽤後: MaxScore 感想: MaxScore よりBMW の⽅が 速いイメージ なので少し意外 ⻘字は同じ⼿法内で最速の値
  43. • 学習済み疎検索で特に有効な,既存の top-k OR 検索を さらに⾼速化する Term Impact Decomposition を提案

    ◦ リスト分割ベースの⾼速化⼿法に Postings Clipping と呼ばれる 新たな技術を導⼊ ◦ MSMARCO-v2 で学習済み疎検索⼿法を最⼤ 9.65 倍⾼速化 • 感想 ◦ クエリ処理の⾼速化についてあまり知らなかったので読んで勉強になった • DeepImpact や uniCOIL だと top-k OR 検索が遅くなるというのも知らなかった ◦ ⼀⽅で⼿法⾃体の新規性はそこまで⼤きくない • 真に新しい技術は Postings Clipping のみ • (最近流⾏っていてコミュニティの関⼼が⾼い)学習済み疎検索という検索モデル の課題に対して,⽐較的広く適⽤可能な新しい⼿法を提案した点が評価された? まとめ 46
  44. • top-k OR クエリ処理の⽇本語⽂献 ◦ 情報検索 検索エンジンの実装と評価: 5 章 クエリ処理

    ◦ 検索システム 実務者のための開発改善ガイドブック: 第 4 章 ◦ Efficient top-k query processing in Lucene 8 • Apache Lucene 8のTop-k クエリプロセッシング最適化 ◦ 転置インデックスとtop-k query ◦ 浅野さんのブログ・論⽂紹介 • Accelerated Query Processing Via Similarity Score Prediction (SIGIR 2019) • Finding the Best of Both Worlds: Faster and More Robust Top-k Document Retrieval (SIGIR 2020) • Information Retrieval and Web Search まとめ(16): 検索システムの効率性 関連⽂献 47
  45. • 適切なはじめに閾値を決めることで(安全な)⾼速化が可能 ◦ top-k OR 検索である閾値 𝜃 が安全であるか?は検索結果の⽂書集合に スコアが 𝜃

    以上の⽂書が k 個以上存在するか?で決まる • ⾃明な閾値は 𝜃 = 0 ◦ より良い閾値を事前に決めることでより多くの⽂書をスキップできるので ⾼速化が可能(Priming) • リスト分割で利⽤可能な閾値 ◦ これはなぜ安全な閾値か? • 閾値をある単語 t の Low List の単語重要度の最⼤値と取ったとする • このとき閾値以上の⽂書集合は,単語 t のHigh List に含まれる⽂書集合を含む • 閾値の取り⽅から,単語 t のHigh List に含まれる⽂書集合は k 以上であるため, この閾値は安全 リスト分割における閾値の初期化(Priming) 49 Low List の 単語重要度の最⼤値 クエリ 𝑄 中の 単語 𝑡 High List の⻑さが k 以上 単語重要度の最⼤値 正確には min(k, |検索結果の⽂書集合|) 個以上
  46. • MSMARCO-v1 + DeepImpact で実験 ◦ MaxScore,WAND,Variable Block-Max WAND (VBMW)

    で⽐較 ◦ ⼯夫: List Splitting,Priming,Smart Bounds,Postings Clipping ⼯夫要素ごとの⽐較 50 (⼀⽅で)List Splitting で既に かなりの改善が得られている 感想: (全くの新規の提案である) Postings Clipping の効果は (実⽤上は)そこまで…?