SlideShare a Scribd company logo
3
Most read
11
Most read
24
Most read
ElasticsearchでSPLADEする
クックパッド株式会社
薄羽 皐太
● 薄羽 皐太(うすは こうた / kota usuha)
● ~ 2024/04: 筑波大学で情報検索の研究
● 2024/04 ~: クックパッド株式会社(検索チーム)
※今回の話は完全に趣味でやってる話で、会社でやっているという話ではないです...
自己紹介 2
● Elasticsearchが疎ベクトルのクエリに対応
○ 8.15から新しく疎ベクトルでクエリが可能に1
○ これによりSPLADEがElasticsearchで使いやすく!
● 日本語のSPLADEの学習済みモデルがいくつか登場
○ お手軽に試しやすい環境に!
● RAGが広く知られていることでDense Retrivalはよく知られるが、まだLearned Sparse Retrievalはよ
く知られていない気がする
なぜこのテーマ? 3
1. https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-sparse-vector-query.html
● RAGか密検索(Dense Retrieval)が注目を浴びてる
○ NLP系での発展もあり、検索ですぐ使えるようなモデルも色々
○ 色んなところがいろんなVectorDBを出してる
● しかし、最近では疎検索モデルも来てる!
○ メジャーなvector DB、Elasticsearchで疎ベクトル検索のサポート
○ 日本語の学習済み SPLADEモデル!
■ aken12/splade-japanese-v3
■ hotchpotch/japanese-splade-base-v1
なぜこのテーマ? 4
● SPLADEのことよく知らない人・気になる人の知るきっかけに
● 検索に興味ある多くの人が知ってそうなElasticsearchで
● 今回紹介する実験に使用したコードを公開1
なぜこのテーマ? 5
「なんとなく聞いたことある」から SPLADEのことをもう1歩知る
1. https://github.com/argonism/splade-es/tree/main
● SPLADEの説明
● Elasticsearchでの使い方を簡単に
● 使ってみて、結果をBM25と比較
● 話さないこと
○ 転置インデックスなど、検索の基礎的な話
話すこと 6
● よくある検索:Elasticsearchでの単語ベース(BM25)
○ クエリ中の単語が含まれていたら、マッチする
○ 単語の重みはTF・IDF
○ 転置インデックス等のデータ構造によって高速な検索が可能になっている
● 限界
○ クエリ中に含まれないとマッチしない
○ 辞書で頑張ることもできるが、メンテが大変
● これを解決する二つの流れ
○ 文書を密ベクトルの表現して、その類似度でマッチ度を測ろう!(Dense Retrieval)
○ 文書を拡張しよう / 文書中の単語の重みをもっといい感じに計算しよう!
(Learned Sparse Rtrieval)
SPLADEとは?(1 /2) 7
言語モデルを使って文書中の語の重みづけと拡張をする検索モデル
● 近年の情報検索モデル
○ Dense Retrieval :クエリと文書それぞれを密ベクトルで表現
○ Learned Sparse Retrieval:クエリと文書それぞれを疎ベクトル で表現
○ ベクトルの類似度で検索
SPLADEとは?(2 /2) 8
にんじん じゃがいも
/
定番!にんじんじゃがいものシ
チュー
Dense
Retriever
Learned
Sparse
Retriever
にんじん 宇宙 じゃがいも … 馬鈴薯 シチュー 建築
score 1.1 0.0 1.3 … 0.8 0.2 0.0
にんじん 宇宙 じゃがいも … 馬鈴薯 シチュー 建築
score 1.1 0.0 1.3 … 0.8 1.1 0.0
語彙数次元のベクトル
密ベクトル( 768次元)
内積
内積
スコア計算例
539.42
13.2
なぜ疎ベクトルがいいのか? 9
● Dense Retrieval:密ベクトル
○ ベクトルの解釈が難しい
● Learned Sparse Retreival
○ ベクトルの解釈がしやすい
○ 既存の単語ベースの仕組みと相性がいい(転置インデックスを活用できる)
にんじん じゃがいも
/
Dense
Retriever
Learned
Sparse
Retriever
にんじん 宇宙 じゃがいも … 馬鈴薯 シチュー 建築
score 1.4 0.0 1.3 … 0.8 0.0 0.0
にんじん 宇宙 じゃがいも … 馬鈴薯 シチュー 建築
score 1.01 0.0 1.02 … 0.25 1.54 0.0
語彙数次元のベクトル
密ベクトル( 768次元)
スコア計算例
にんじん じゃがいも
/
定番!にんじんじゃがいものシ
チュー
��
なにもわからない
☺
「馬鈴薯」が
拡張されてる!
定番!にんじんじゃがいものシ
チュー
SPLADEのアーキテクチャ(1 /3):概要 10
MLMヘッドを埋め込みベクトルを疎ベクトルに変換
Encoder
BERT等
0.0
0.0
0.8
0.0
0.0
2.1
1.5
…
● SPLADEの構造
○ BERTのMLMヘッドを利用して、入力テキストを疎ベクトルに変換
■ MLMヘッド:MLMの学習に利用する層。埋め込み表現を語彙数次元のベクトルに変換
○ 学習時に、疎ベクトルがなるべく疎になるような損失を導入 ←SPLADEの新しい部分!
○ その他色々な学習上工夫
MLM
ヘッド
福
井
県と
言
え
ば
?
入力テキスト
埋め込み
ベクトル
疎ベクトル
検索
人参
めがね
勉強会
Tシャツ
恐竜
博物館
対応する語彙
得られた疎ベクトルを
検索に利用
SPLADEではこのフレームワークを応用して、単語の重みと文書の拡張に利用
● Masked Language Model:単語の穴埋め問題を解かせる事前学習手法
○ テキストの一部をマスク(穴埋めの穴に)して、そこに何の単語が入るか当てる
○ 単語の埋め込みベクトルから、語彙数次元のベクトルを生成
→ 対応する単語のスコアが高くなるように学習
SPLADEのアーキテクチャ(2 /3):MLMヘッド 11
MLM:文中の単語の穴埋め問題を解くタスク
0.0
0.0
0.08
0.0
0.0
0.12
0.01
…
福井県,
は,
<mask>,
で,
有名,
です
入力テキスト
埋め込み
ベクトル
疎ベクトル
検索
人参
めがね
勉強会
Tシャツ
恐竜
博物館
語彙数次元
のベクトル
Encoder
BERT等
MLM
ヘッド
福井県,
は,
恐竜,
で,
有名,
です
正解のテキスト
一部をマスク
マスクした部分に何が
入るのかを当てる
文書が大きくなりすぎて検索速度に影響 ...
● 疎ベクトルは大変大きいベクトル(3万次元以上)
○ 0じゃない次元数が増える(文書が拡張)されると、検索効率が下がる
○ 文書の拡張はなるべく効率的にしたい!
→ 文書間で拡張される単語が散らばるように学習:疎ベクトルの正則化
→ 文書を拡張しつつ、転置インデックスを効果的に活用できる!
SPLADEのアーキテクチャ(3 /3):正則化 12
SPLADE:疎ベクトルがなるべく疎になるように学習
検索
人参
めがね
勉強会
Tシャツ
恐竜
博物館
0.01
0.3
0.8
0.2
1.0
0.1
0.0
…
0.21
0.02
0.92
0.41
0.0
1.01
0.5
…
文書A 文書B
0.01
0.34
0.0
0.02
2.01
0.01
0.12
…
文書C
SPLADE
文書A
文書B
文書C
文書間で拡張される語が被ってない
→ 効率的に検索できる
検索
人参
めがね
勉強会
Tシャツ
恐竜
博物館
0.01
0.3
0.0
0.0
0.0
0.1
0.0
…
2.1
0.0
0.0
1.4
0.1
0.0
0.0
…
文書A 文書B
0.0
0.0
0.3
0.0
0.0
0.0
0.02
…
文書C
SPLADE
文書A
文書B
文書C
正則化あり
SPLADEをElasticsearchで使う:インデクシング(1 /2)
- Elasticsearchでは、疎ベクトルは「単語:重み」のJSONに変換
- 値が0じゃないもののみ集めてJSONにする
- sparse_vectorフィールドへのインデクシング、
sparse_vectorフィールドへのクエリに使用
13
{
"SPLADE": 2.9,
"Elasticsearch": 1.7,
"検索": 1.3,
"で": 0.1,
"Retrieval": 0.2,
}
SPLADEをElasticsearchで検索に使う
インデクシング・クエリに使用
例文
SPLADE 海 検索 … グミ Retrieval で
score 2.9 0.0 1.3 … 0.0 0.2 0.1
SPLADE
非0だけ
集める
● type: sparse_vector のフィールドを用意
● インデクシング先ほどのようなJSONの形で表現した疎
ベクトルを、sparse_vectorのフィールドにPOSTするだ
け
SPLADEをElasticsearchで使う:インデクシング(2 /2) 14
PUT my-index-000001
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "standard"
},
"sparse_vec_field": {
"type": "sparse_vector"
},
}
}
}
POST my-index-000001/_doc
{
"title": "I want to use Elasticsearch with SPLADE."
"sparse_vec_field": {"Elasticsearch": 1.7, "SPLADE": 2.9, "検索": 1.3, …}
}
SPLADEをElasticsearchで使う:クエリ(1 /2) 15
● sparse_vector クエリで、インデクシング時と
同じような形でJSONを投げる
get /my-index-000001/_search
{
"query": {
"sparse_vector": {
"field": "sparse_vec_field",
"query_vector": { "SPLADE": 0.1 }
}
}
}
"hits": {
"total": {...}
"hits": [
{
"_index": "my-index-000002",
"_id": "TtVmppMBndQCrQ0GMNNS",
"_score": 0.28984377,
"_source": {
"title": "I want to use Elasticsearch with SPLADE.",
"sparse_vec_field": {
"Elasticsearch": 1.7,
"SPLADE": 2.9,
…
"検索": 1.5
}
}
}
]
}
● クエリ側の”SPLADE”の重みが0.1、
文書側の”SPLADE”の重みが2.9
● ベクトルの内積を計算するので、文書のスコ
アは 0.29 になる
クエリ
レスポンス
● 単純にSPLADEだけ使って検索することは稀
● Elasticsearchの利点:
その他の仕組みと組み合わせて使える
例:タイトルマッチの重みをもっと重視したい
検索結果には記事のタイトルが目立つ形で載るので、タイトルマッ
チしてる記事をブースト
SPLADEをElasticsearchで使う:クエリ(2 /2) 16
タイトルでマッチしてる記事をさらにブーストするクエリ
get /my-index-000001/_search
{
"query": {
"function_score": {
"query": {
"sparse_vector": {
"field": "sparse_vec_field",
"query_vector": { "SPLADE": 0.1 }
}
},
"functions": [
{
"filter": {
"multi_match": {
"query": "SPLADE",
"fields": ["title"]
}
},
"weight": 2
}
]
}
}
}
BEIRベンチマークで評価 17
論文で報告されている性能と大体同じ性能
Metrics scidocs quora touche scifact arguana fiqa trec-covid nq nfcorpus 平均
ndcg@10 15.6 81.4 31.0 71.6 61.4 37.6 73.3 51.2 36.3 51.0
ndcg@10 (original) 15.8 81.4 29.3 71.0 50.9 37.4 74.8 58.6 35.7 50.5
● SPLADEは論文では高い性能を出している
● Elasticsearch w/ SPLADEでも、ちゃんと性能を引き出せているか確認
○ BEIRという情報検索のベンチマークの一部を使って評価
○ nDCG@10を計算して、SPLADEの元論文の結果と比較
ケーススタディ: SPLADEで上手くいったケース(1 /2) 18
Query bm25 splade
Too Much Iodine Can Be as Bad as Too Little 0.00 0.77
low-carb diets 0.09 0.55
What’s Driving America’s Obesity Problem? 0.08 0.50
crib death 0.00 0.47
Preventing Cataracts with Diet 0.00 0.44
Meat & Multiple Myeloma 0.00 0.41
Relieving Yourself of Excess Estrogen 0.00 0.39
Apthous Ulcer Mystery Solved 0.00 0.36
● BM25(Elasticsearchのmulti_matchクエリ)とSPLADEの結果を比較
○ どういうクエリでSPLADEが上手くいったかを調査
○ NFCorpusでのクエリごとnDCG@10を比較
nDCG@10
Iodine: ヨウ素
医療系のデータセット
● BM25で1位だった文書
○ タイトル:Too much of too little : xylitol, an unusual trigger of a chronic metabolic hyperchloremic acidosis.
(適合度:0/2)
○ スコアの約60% が、タイトルの「too」
■ クエリに2つtooが含まれる
● SPLADEで1位だった文書
○ タイトル:Iodine -induced neonatal hypothyroidism secondary to maternal seaweed consumption: …
(適合度:2/2)
○ 疎ベクトルの重みをみると、iodineからのウェイトが集まっている
ケーススタディ: SPLADEで上手くいったケース(2 /2) 19
クエリ: Too Much Iodine Can Be as Bad as Too Little
io ##dine too
2.73 2.51 0.31
文書の疎ベクトルの重み(一部)
io ##dine too
2.61 1.79 1.57
クエリの疎ベクトルの重み(一部)
約8倍の差!
文書内の重要な単語に重みが集中することで検索できている
ケーススタディ: SPLADEで上手くいかなかったケース(1 /2) 20
Query bm25 splade
Harvard Physicians’ Study II 0.61 0.09
The Actual Benefit of Diet vs. Drugs 0.44 0.00
Diet and Cellulite 0.37 0.00
Fish Fog 0.29 0.00
medical ethics 0.22 0.09
The Saturated Fat Studies: Buttering Up the Public 0.19 0.00
mouth cancer 0.11 0.00
● SPLADEがBM25より上手くいかなかったクエリ
○ どういうクエリでSPLADEが上手くいかなかったか
○ NFCorpusでのクエリごとnDCG@10を比較
固有名詞の検索はゼロショットで課題になりそう
● BM25で1位だった文書
○ タイトル:Multivitamins in the Prevention of Cancer in Men: The Physicians’ Health Study II Randomized …
(適合度:1/2)
○ “The Physicians’ Health Study II”というシリーズ名に正確にマッチしている
● SPLADEで1位だった文書
○ タイトル:A global survey of physicians' perceptions on cholesterol management: the From …
(適合度:0/2)
○ ”Physician”や “Study“ のような語はよく拡張されそう
○ 適合文書の方では、これらの語は重みが相対的に低くなっていることで順位が低くなっていそう
ケーススタディ: SPLADEで上手くいかなかったケース(2 /2) 21
クエリ: Harvard Physicians’ Study II
prostate cancer multi study physician
2.45 2.37 2.30 1.45 1.44
BM25で1位だった文書の疎ベクトルの重み(一部)
harvard physician study ii
2.59 1.30 2.00 2.56
クエリの疎ベクトルの重み(一部)
● 疎検索モデルが来てる!
○ Elasticsearchもサポート
○ 学習済みの日本語SPLADEモデルもある
● SPLADEはテキストを疎ベクトルに変換して検索するモデル
○ Dense Retrieverと比べて解釈性が高い
○ 既存の検索フレームワークと相性がいい
● Elasticsearchで疎検索モデルを使うのは簡単!
まとめ 22
● SPLADEはクエリ側もSPLADEを通す必要がある
○ スループットが重要な検索ではこれは厳しいかもしれない...
● SPLADE-Doc: 文書側だけSPLADEを通し、クエリはそのままで検索する
○ 文書側だけ単語の重みの計算・拡張を行う
○ クエリはトークナイズのみ行い、検索
○ 検索時にSPLADEの重い計算が要らない!
余談:SPLADE-Doc 23
にんじん じゃがいも
/
Learned
Sparse
Retriever
にんじん 宇宙 じゃがいも … 馬鈴薯 シチュー 建築
score 1 0 1 … 0 0 0.0
にんじん 宇宙 じゃがいも … 馬鈴薯 シチュー 建築
score 1.01 0.0 1.02 … 0.8 1.54 0.0
語彙数次元のベクトル
定番!にんじんじゃがいものシ
チュー
余談:SPLADE-Doc 24
Metrics nfcorpus
SPLADE 36.3
SPLADE-Doc 34.9
● SPLADE-Docは性能はSPLADEより劣るものの、検索速度は早い!
● 余談の余談
○ SPLADE-Doc はsparse_vectorクエリなしでもElasticsearchで実現しやすい
■ 疎ベクトルを文書に戻して、whitespace tokenizerでインデックス
○ sparse_vectorクエリが実装される前はそうやってSPLADE-Docで遊んでいたこと
をきっかけに、sparse_vector実装後に今回の実験をしてみた

More Related Content

PDF
Storytelling For The Web: Integrate Storytelling in your Design Process
PDF
Artificial Intelligence, Data and Competition – SCHREPEL – June 2024 OECD dis...
PDF
How to Leverage AI to Boost Employee Wellness - Lydia Di Francesco - SocialHR...
PDF
2024 Trend Updates: What Really Works In SEO & Content Marketing
PDF
قانون الميثاق الجماعي وفق آخر التعديلات
PDF
地理空間インテリジェンス:屋内測位技術を用いた現場のラボ化に基づくサービス研究事例
PDF
XR/xDRによる労働生産性の向上、QoW向上
PPT
Ch1電子商務的概念
Storytelling For The Web: Integrate Storytelling in your Design Process
Artificial Intelligence, Data and Competition – SCHREPEL – June 2024 OECD dis...
How to Leverage AI to Boost Employee Wellness - Lydia Di Francesco - SocialHR...
2024 Trend Updates: What Really Works In SEO & Content Marketing
قانون الميثاق الجماعي وفق آخر التعديلات
地理空間インテリジェンス:屋内測位技術を用いた現場のラボ化に基づくサービス研究事例
XR/xDRによる労働生産性の向上、QoW向上
Ch1電子商務的概念
Ad

ElasticsearchでSPLADEする [Search Engineering Tech Talk 2025 Winter]

  • 2. ● 薄羽 皐太(うすは こうた / kota usuha) ● ~ 2024/04: 筑波大学で情報検索の研究 ● 2024/04 ~: クックパッド株式会社(検索チーム) ※今回の話は完全に趣味でやってる話で、会社でやっているという話ではないです... 自己紹介 2
  • 3. ● Elasticsearchが疎ベクトルのクエリに対応 ○ 8.15から新しく疎ベクトルでクエリが可能に1 ○ これによりSPLADEがElasticsearchで使いやすく! ● 日本語のSPLADEの学習済みモデルがいくつか登場 ○ お手軽に試しやすい環境に! ● RAGが広く知られていることでDense Retrivalはよく知られるが、まだLearned Sparse Retrievalはよ く知られていない気がする なぜこのテーマ? 3 1. https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-sparse-vector-query.html
  • 4. ● RAGか密検索(Dense Retrieval)が注目を浴びてる ○ NLP系での発展もあり、検索ですぐ使えるようなモデルも色々 ○ 色んなところがいろんなVectorDBを出してる ● しかし、最近では疎検索モデルも来てる! ○ メジャーなvector DB、Elasticsearchで疎ベクトル検索のサポート ○ 日本語の学習済み SPLADEモデル! ■ aken12/splade-japanese-v3 ■ hotchpotch/japanese-splade-base-v1 なぜこのテーマ? 4
  • 5. ● SPLADEのことよく知らない人・気になる人の知るきっかけに ● 検索に興味ある多くの人が知ってそうなElasticsearchで ● 今回紹介する実験に使用したコードを公開1 なぜこのテーマ? 5 「なんとなく聞いたことある」から SPLADEのことをもう1歩知る 1. https://github.com/argonism/splade-es/tree/main
  • 6. ● SPLADEの説明 ● Elasticsearchでの使い方を簡単に ● 使ってみて、結果をBM25と比較 ● 話さないこと ○ 転置インデックスなど、検索の基礎的な話 話すこと 6
  • 7. ● よくある検索:Elasticsearchでの単語ベース(BM25) ○ クエリ中の単語が含まれていたら、マッチする ○ 単語の重みはTF・IDF ○ 転置インデックス等のデータ構造によって高速な検索が可能になっている ● 限界 ○ クエリ中に含まれないとマッチしない ○ 辞書で頑張ることもできるが、メンテが大変 ● これを解決する二つの流れ ○ 文書を密ベクトルの表現して、その類似度でマッチ度を測ろう!(Dense Retrieval) ○ 文書を拡張しよう / 文書中の単語の重みをもっといい感じに計算しよう! (Learned Sparse Rtrieval) SPLADEとは?(1 /2) 7 言語モデルを使って文書中の語の重みづけと拡張をする検索モデル
  • 8. ● 近年の情報検索モデル ○ Dense Retrieval :クエリと文書それぞれを密ベクトルで表現 ○ Learned Sparse Retrieval:クエリと文書それぞれを疎ベクトル で表現 ○ ベクトルの類似度で検索 SPLADEとは?(2 /2) 8 にんじん じゃがいも / 定番!にんじんじゃがいものシ チュー Dense Retriever Learned Sparse Retriever にんじん 宇宙 じゃがいも … 馬鈴薯 シチュー 建築 score 1.1 0.0 1.3 … 0.8 0.2 0.0 にんじん 宇宙 じゃがいも … 馬鈴薯 シチュー 建築 score 1.1 0.0 1.3 … 0.8 1.1 0.0 語彙数次元のベクトル 密ベクトル( 768次元) 内積 内積 スコア計算例 539.42 13.2
  • 9. なぜ疎ベクトルがいいのか? 9 ● Dense Retrieval:密ベクトル ○ ベクトルの解釈が難しい ● Learned Sparse Retreival ○ ベクトルの解釈がしやすい ○ 既存の単語ベースの仕組みと相性がいい(転置インデックスを活用できる) にんじん じゃがいも / Dense Retriever Learned Sparse Retriever にんじん 宇宙 じゃがいも … 馬鈴薯 シチュー 建築 score 1.4 0.0 1.3 … 0.8 0.0 0.0 にんじん 宇宙 じゃがいも … 馬鈴薯 シチュー 建築 score 1.01 0.0 1.02 … 0.25 1.54 0.0 語彙数次元のベクトル 密ベクトル( 768次元) スコア計算例 にんじん じゃがいも / 定番!にんじんじゃがいものシ チュー �� なにもわからない ☺ 「馬鈴薯」が 拡張されてる! 定番!にんじんじゃがいものシ チュー
  • 10. SPLADEのアーキテクチャ(1 /3):概要 10 MLMヘッドを埋め込みベクトルを疎ベクトルに変換 Encoder BERT等 0.0 0.0 0.8 0.0 0.0 2.1 1.5 … ● SPLADEの構造 ○ BERTのMLMヘッドを利用して、入力テキストを疎ベクトルに変換 ■ MLMヘッド:MLMの学習に利用する層。埋め込み表現を語彙数次元のベクトルに変換 ○ 学習時に、疎ベクトルがなるべく疎になるような損失を導入 ←SPLADEの新しい部分! ○ その他色々な学習上工夫 MLM ヘッド 福 井 県と 言 え ば ? 入力テキスト 埋め込み ベクトル 疎ベクトル 検索 人参 めがね 勉強会 Tシャツ 恐竜 博物館 対応する語彙 得られた疎ベクトルを 検索に利用
  • 11. SPLADEではこのフレームワークを応用して、単語の重みと文書の拡張に利用 ● Masked Language Model:単語の穴埋め問題を解かせる事前学習手法 ○ テキストの一部をマスク(穴埋めの穴に)して、そこに何の単語が入るか当てる ○ 単語の埋め込みベクトルから、語彙数次元のベクトルを生成 → 対応する単語のスコアが高くなるように学習 SPLADEのアーキテクチャ(2 /3):MLMヘッド 11 MLM:文中の単語の穴埋め問題を解くタスク 0.0 0.0 0.08 0.0 0.0 0.12 0.01 … 福井県, は, <mask>, で, 有名, です 入力テキスト 埋め込み ベクトル 疎ベクトル 検索 人参 めがね 勉強会 Tシャツ 恐竜 博物館 語彙数次元 のベクトル Encoder BERT等 MLM ヘッド 福井県, は, 恐竜, で, 有名, です 正解のテキスト 一部をマスク マスクした部分に何が 入るのかを当てる
  • 12. 文書が大きくなりすぎて検索速度に影響 ... ● 疎ベクトルは大変大きいベクトル(3万次元以上) ○ 0じゃない次元数が増える(文書が拡張)されると、検索効率が下がる ○ 文書の拡張はなるべく効率的にしたい! → 文書間で拡張される単語が散らばるように学習:疎ベクトルの正則化 → 文書を拡張しつつ、転置インデックスを効果的に活用できる! SPLADEのアーキテクチャ(3 /3):正則化 12 SPLADE:疎ベクトルがなるべく疎になるように学習 検索 人参 めがね 勉強会 Tシャツ 恐竜 博物館 0.01 0.3 0.8 0.2 1.0 0.1 0.0 … 0.21 0.02 0.92 0.41 0.0 1.01 0.5 … 文書A 文書B 0.01 0.34 0.0 0.02 2.01 0.01 0.12 … 文書C SPLADE 文書A 文書B 文書C 文書間で拡張される語が被ってない → 効率的に検索できる 検索 人参 めがね 勉強会 Tシャツ 恐竜 博物館 0.01 0.3 0.0 0.0 0.0 0.1 0.0 … 2.1 0.0 0.0 1.4 0.1 0.0 0.0 … 文書A 文書B 0.0 0.0 0.3 0.0 0.0 0.0 0.02 … 文書C SPLADE 文書A 文書B 文書C 正則化あり
  • 13. SPLADEをElasticsearchで使う:インデクシング(1 /2) - Elasticsearchでは、疎ベクトルは「単語:重み」のJSONに変換 - 値が0じゃないもののみ集めてJSONにする - sparse_vectorフィールドへのインデクシング、 sparse_vectorフィールドへのクエリに使用 13 { "SPLADE": 2.9, "Elasticsearch": 1.7, "検索": 1.3, "で": 0.1, "Retrieval": 0.2, } SPLADEをElasticsearchで検索に使う インデクシング・クエリに使用 例文 SPLADE 海 検索 … グミ Retrieval で score 2.9 0.0 1.3 … 0.0 0.2 0.1 SPLADE 非0だけ 集める
  • 14. ● type: sparse_vector のフィールドを用意 ● インデクシング先ほどのようなJSONの形で表現した疎 ベクトルを、sparse_vectorのフィールドにPOSTするだ け SPLADEをElasticsearchで使う:インデクシング(2 /2) 14 PUT my-index-000001 { "mappings": { "properties": { "title": { "type": "text", "analyzer": "standard" }, "sparse_vec_field": { "type": "sparse_vector" }, } } } POST my-index-000001/_doc { "title": "I want to use Elasticsearch with SPLADE." "sparse_vec_field": {"Elasticsearch": 1.7, "SPLADE": 2.9, "検索": 1.3, …} }
  • 15. SPLADEをElasticsearchで使う:クエリ(1 /2) 15 ● sparse_vector クエリで、インデクシング時と 同じような形でJSONを投げる get /my-index-000001/_search { "query": { "sparse_vector": { "field": "sparse_vec_field", "query_vector": { "SPLADE": 0.1 } } } } "hits": { "total": {...} "hits": [ { "_index": "my-index-000002", "_id": "TtVmppMBndQCrQ0GMNNS", "_score": 0.28984377, "_source": { "title": "I want to use Elasticsearch with SPLADE.", "sparse_vec_field": { "Elasticsearch": 1.7, "SPLADE": 2.9, … "検索": 1.5 } } } ] } ● クエリ側の”SPLADE”の重みが0.1、 文書側の”SPLADE”の重みが2.9 ● ベクトルの内積を計算するので、文書のスコ アは 0.29 になる クエリ レスポンス
  • 16. ● 単純にSPLADEだけ使って検索することは稀 ● Elasticsearchの利点: その他の仕組みと組み合わせて使える 例:タイトルマッチの重みをもっと重視したい 検索結果には記事のタイトルが目立つ形で載るので、タイトルマッ チしてる記事をブースト SPLADEをElasticsearchで使う:クエリ(2 /2) 16 タイトルでマッチしてる記事をさらにブーストするクエリ get /my-index-000001/_search { "query": { "function_score": { "query": { "sparse_vector": { "field": "sparse_vec_field", "query_vector": { "SPLADE": 0.1 } } }, "functions": [ { "filter": { "multi_match": { "query": "SPLADE", "fields": ["title"] } }, "weight": 2 } ] } } }
  • 17. BEIRベンチマークで評価 17 論文で報告されている性能と大体同じ性能 Metrics scidocs quora touche scifact arguana fiqa trec-covid nq nfcorpus 平均 ndcg@10 15.6 81.4 31.0 71.6 61.4 37.6 73.3 51.2 36.3 51.0 ndcg@10 (original) 15.8 81.4 29.3 71.0 50.9 37.4 74.8 58.6 35.7 50.5 ● SPLADEは論文では高い性能を出している ● Elasticsearch w/ SPLADEでも、ちゃんと性能を引き出せているか確認 ○ BEIRという情報検索のベンチマークの一部を使って評価 ○ nDCG@10を計算して、SPLADEの元論文の結果と比較
  • 18. ケーススタディ: SPLADEで上手くいったケース(1 /2) 18 Query bm25 splade Too Much Iodine Can Be as Bad as Too Little 0.00 0.77 low-carb diets 0.09 0.55 What’s Driving America’s Obesity Problem? 0.08 0.50 crib death 0.00 0.47 Preventing Cataracts with Diet 0.00 0.44 Meat & Multiple Myeloma 0.00 0.41 Relieving Yourself of Excess Estrogen 0.00 0.39 Apthous Ulcer Mystery Solved 0.00 0.36 ● BM25(Elasticsearchのmulti_matchクエリ)とSPLADEの結果を比較 ○ どういうクエリでSPLADEが上手くいったかを調査 ○ NFCorpusでのクエリごとnDCG@10を比較 nDCG@10 Iodine: ヨウ素 医療系のデータセット
  • 19. ● BM25で1位だった文書 ○ タイトル:Too much of too little : xylitol, an unusual trigger of a chronic metabolic hyperchloremic acidosis. (適合度:0/2) ○ スコアの約60% が、タイトルの「too」 ■ クエリに2つtooが含まれる ● SPLADEで1位だった文書 ○ タイトル:Iodine -induced neonatal hypothyroidism secondary to maternal seaweed consumption: … (適合度:2/2) ○ 疎ベクトルの重みをみると、iodineからのウェイトが集まっている ケーススタディ: SPLADEで上手くいったケース(2 /2) 19 クエリ: Too Much Iodine Can Be as Bad as Too Little io ##dine too 2.73 2.51 0.31 文書の疎ベクトルの重み(一部) io ##dine too 2.61 1.79 1.57 クエリの疎ベクトルの重み(一部) 約8倍の差! 文書内の重要な単語に重みが集中することで検索できている
  • 20. ケーススタディ: SPLADEで上手くいかなかったケース(1 /2) 20 Query bm25 splade Harvard Physicians’ Study II 0.61 0.09 The Actual Benefit of Diet vs. Drugs 0.44 0.00 Diet and Cellulite 0.37 0.00 Fish Fog 0.29 0.00 medical ethics 0.22 0.09 The Saturated Fat Studies: Buttering Up the Public 0.19 0.00 mouth cancer 0.11 0.00 ● SPLADEがBM25より上手くいかなかったクエリ ○ どういうクエリでSPLADEが上手くいかなかったか ○ NFCorpusでのクエリごとnDCG@10を比較
  • 21. 固有名詞の検索はゼロショットで課題になりそう ● BM25で1位だった文書 ○ タイトル:Multivitamins in the Prevention of Cancer in Men: The Physicians’ Health Study II Randomized … (適合度:1/2) ○ “The Physicians’ Health Study II”というシリーズ名に正確にマッチしている ● SPLADEで1位だった文書 ○ タイトル:A global survey of physicians' perceptions on cholesterol management: the From … (適合度:0/2) ○ ”Physician”や “Study“ のような語はよく拡張されそう ○ 適合文書の方では、これらの語は重みが相対的に低くなっていることで順位が低くなっていそう ケーススタディ: SPLADEで上手くいかなかったケース(2 /2) 21 クエリ: Harvard Physicians’ Study II prostate cancer multi study physician 2.45 2.37 2.30 1.45 1.44 BM25で1位だった文書の疎ベクトルの重み(一部) harvard physician study ii 2.59 1.30 2.00 2.56 クエリの疎ベクトルの重み(一部)
  • 22. ● 疎検索モデルが来てる! ○ Elasticsearchもサポート ○ 学習済みの日本語SPLADEモデルもある ● SPLADEはテキストを疎ベクトルに変換して検索するモデル ○ Dense Retrieverと比べて解釈性が高い ○ 既存の検索フレームワークと相性がいい ● Elasticsearchで疎検索モデルを使うのは簡単! まとめ 22
  • 23. ● SPLADEはクエリ側もSPLADEを通す必要がある ○ スループットが重要な検索ではこれは厳しいかもしれない... ● SPLADE-Doc: 文書側だけSPLADEを通し、クエリはそのままで検索する ○ 文書側だけ単語の重みの計算・拡張を行う ○ クエリはトークナイズのみ行い、検索 ○ 検索時にSPLADEの重い計算が要らない! 余談:SPLADE-Doc 23 にんじん じゃがいも / Learned Sparse Retriever にんじん 宇宙 じゃがいも … 馬鈴薯 シチュー 建築 score 1 0 1 … 0 0 0.0 にんじん 宇宙 じゃがいも … 馬鈴薯 シチュー 建築 score 1.01 0.0 1.02 … 0.8 1.54 0.0 語彙数次元のベクトル 定番!にんじんじゃがいものシ チュー
  • 24. 余談:SPLADE-Doc 24 Metrics nfcorpus SPLADE 36.3 SPLADE-Doc 34.9 ● SPLADE-Docは性能はSPLADEより劣るものの、検索速度は早い! ● 余談の余談 ○ SPLADE-Doc はsparse_vectorクエリなしでもElasticsearchで実現しやすい ■ 疎ベクトルを文書に戻して、whitespace tokenizerでインデックス ○ sparse_vectorクエリが実装される前はそうやってSPLADE-Docで遊んでいたこと をきっかけに、sparse_vector実装後に今回の実験をしてみた