はじめに
事前学習済みの多言語SBERTモデルをSolrマニュアルでファインチューニングし、特定の言語(この場合は英語)で書かれた文書を非英語のクエリを使用して取得できるセマンティック検索エンジンの実現可能性を検証しました。
なお、デモサイトはこちらです。 https://demo.rondhuit.com/solr-manual
1. セマンティック検索
セマンティック検索は、データ検索技術であり、検索クエリ内の単語やフレーズの意味と文脈を理解することを目指しています。これは、単にキーワードを一致させるのではなく、検索されるコンテンツと正確に一致しない検索用語を使用しても、ユーザーのクエリに関連性の高い正確な結果を提供できることを意味します。
従来の検索エンジンでは、キーワードベースの検索アルゴリズムが使用されており、検索エンジンはユーザーが検索クエリに入力した正確な単語やフレーズを探します。このアプローチは、検索クエリの背後にある文脈や意図を考慮していないため、結果の精度が低いか、関連性のないコンテンツが表示されることがあります。
一方、セマンティック検索では、従来の検索エンジンの転置インデックスではなく、テキスト埋め込みとしての文書表現を活用します。テキスト埋め込みとは、テキストデータの数値表現です。これらは自然言語処理(NLP)技術を使用して作成され、テキスト内の単語やフレーズの意味と文脈を捉えるように設計されています。このため、セマンティック検索は、単語間の関係を分析し、検索クエリに関連する同義語、関連語、および概念を特定することができます。
検索時には、ユーザーのクエリが文書と同じベクトル空間に埋め込まれ、ターゲットコーパスから最も近い埋め込みが返されます。これらのエントリは、クエリとの高い意味的重複があるはずです。
2. 事前学習済みモデル
事前学習済みテキストモデルとは、大量のテキストデータで事前に学習されたディープラーニングモデルで、単語やフレーズ間の基本的なパターンや関係を学習します。これらのモデルは、ニューラルネットワークなどの技術を用いて学習され、テキストデータの意味と文脈を捉えるように設計されています。したがって、文書のテキスト埋め込みを計算するのに最適なツールとなります。このようなモデルの例として、BERTが挙げられます。
BERTを変更して文埋め込みに特化させたものがSBERTと呼ばれています。SBERTは、類似性検索、クラスタリング、質問応答などのさまざまなNLPタスクに使用できる高品質な文埋め込みを作成するように学習されています。
SBERTは、シャム(siamese)ネットワークとトリプレットネットワークと呼ばれる手法を使用して、文埋め込みの作成を学習します。これらの手法により、SBERTは2つ以上の文の類似性を比較し、その意味を捉える埋め込みを生成できます。これは、セマンティック検索で行っていることによく似ています:つまりクエリの意図と文書の意味の類似性を比較することです。
人々が独自のモデルをゼロから作成する代わりに事前学習済みモデルを使用する理由はいくつかあります:
時間とリソースの節約 :事前学習済みモデルは、大量のデータで学習およびファインチューニングが行われています。これにより、新しいモデルをゼロから作成する場合に必要となる、膨大なデータ準備、ハイパーパラメータの調整、および学習時間を大幅に節約できます。
高いパフォーマンス :事前学習済みモデルは、通常、最先端のモデルであり、広範囲に評価およびテストが行われています。これは、さまざまなタスクに対して高い性能と精度を提供し、かつ、新しいモデルを作成する際に比較のためのベースラインとして使うこともできます。
転移学習 :事前学習済みモデルは、特定のNLPタスク用に新しいデータでファインチューニングされることで、転移学習が可能になります。これは、モデルがゼロから学習する場合に比べて、より少ないデータと学習時間で新しいタスクを学習できることを意味します。
アクセスしやすいオープンソース :多くの事前学習済みモデルが一般に利用可能でオープンソースとなっており、研究者や開発者が簡単にアクセスできます。これにより、NLPコミュニティでの協力とイノベーションが促進され、新しいアプリケーションやユースケースの開発が可能になります。
2.1 多言語事前学習済みモデル
前述の通り、事前学習済みモデルは、時間とリソースの節約、高いパフォーマンス、転移学習を利用して特定のタスクにファインチューニングできる能力を提供します。このため、複数の言語(少なくとも日本語と英語)でSolrマニュアルを検索するという特定のタスクには、 🤗 hugging face の事前学習済み多言語モデルである sentence-transformers/paraphrase-multilingual-mpnet-base-v2
を使用します。
この特定のモデルは、1ダース以上の並列データ(複数言語)セットを使って学習されました。特に、Wikipediaからの1620の言語ペアで構成される1億3500万の並列文が含まれるデータセット「WikiMatrix」が使用されました。著者たちは、ある一定のスコア以上のペアのみを使用し、その閾値以下のペアは、しばしば品質が悪かったためです。
このモデルは、文や段落を768次元の密ベクトル空間にマッピングし、クラスタリングやセマンティック検索などのタスクに使用できます。
以下に、モデルを紹介します:
項目 | 値 |
---|---|
Max Sequence Length | 128 |
Dimensions | 768 |
Normalized Embeddings | false |
Suitable Score Functions | cosine-similarity (util.cos_sim) |
Size | 970 MB |
Pooling | Mean Pooling |
Training Data | Multi-lingual model of paraphrase-mpnet-base-v2, extended to 50+ languages |
このモデルは、対称的なセマンティック検索用に学習されました。つまり、クエリとコーパス内のエントリがほぼ同じ長さであるという意味ですが、私たちはこれを非対称的なセマンティック検索に使用します。非対称的なセマンティック検索では、短い文の埋め込みが、文書全体の埋め込みと一致することが期待されます。
3. Solrマニュアル
Solrマニュアルは、Solr検索プラットフォームのインストール、設定、使用、およびメンテナンス方法に関する詳細な情報を提供する包括的なガイドです。これは、Solrコミッターによって書かれ、公開された公式のSolrドキュメントで、adoc形式で提供されています。
AsciiDoc(adoc)形式は、軽量なマークアップ言語で、ソフトウェアドキュメント、マニュアル、書籍などの技術文書を書くために使用されます。MarkdownやreStructuredTextのような他のマークアップ言語に似ていますが、より多くの機能と柔軟性を提供しています。
AsciiDoc形式のいくつかの特徴には以下のようなものがあります:
- 見出しとサブ見出し
- リストと表
- リンクと相互参照
- 画像や図表
- 構文強調表示付きのソースコードブロック
3.1 ドキュメントのクリーニング
Solrマニュアルでは上記の機能が大幅に利用されているため、構文のオーバーヘッドをクリーニングする必要がありました。これにより、マニュアルのセクションの埋め込み表現が改善されます。コードスニペット、ハイパーリンク、画像を削除するために正規表現を使用しました。また、ほとんどのドキュメントには冗長性を減らすために削除が必要なライセンス通知が含まれていました。表はいくつかの有用な情報を提供し、それらがもたらすノイズも管理可能であるため、そのまま残しました。
見出しとサブ見出しは、サブドキュメントを作成するために使用されました。深さ3までのサブ見出しは、独立したドキュメントとして扱われました。それ以下のサブ見出しは、最も近いサブ見出しの一部として扱われました。たとえば、ルートドキュメント「Field Type Definitions and Properties」は次のように分割されます。
- Field Type Definitions and Properties / Field Type Definitions in the Schema
- Field Type Definitions and Properties / Field Type Properties / General Properties
...
- Field Type Definitions and Properties / Choosing Appropriate Numeric Types
...
General Properties
は深さ3のサブ見出しと見なされ、それ以下のサブ見出しは個々のものではなく、そのドキュメントの一部と見なしました。このデータ処理により、合計2,972件のドキュメントが作成されました。
3.2 ファセット
ユーザーに良好な検索体験を提供し、検索結果の絞り込みと概観を可能にするために、ファセットを導入することにしました。ロンウイットのSolrプラグインに含まれる既知の単語抽出器を使用して、solr_class
カテゴリを埋めました。すべてのマニュアルドキュメント内のSolr JARファイルから抽出されたクラス名を検索しました。
4. ファインチューニング
ほとんどの場合、事前学習済みモデルをそのまま使用するだけで十分な性能が得られます。アプリケーションの目的に応じて、モデルをそのまま使用することができます。ただし、特定のタスクに対してファインチューニングされたモデルは、独自のコンテキストにカスタマイズされているため、より良い結果が得られることが多いです。
センテンストランスフォーマーモデルは、特定のコーパスに対するセマンティック検索タスクのために、クエリと関連パッセージ情報のペアからなるデータセットを使用して簡単にファインチューニングすることができます。企業はこのアプローチを頻繁に使用しています。なぜなら、クエリログやユーザーとの検索結果のインタラクションにアクセスできるからです。ただし、私たちのケースのように最初から何かを構築する場合、この情報は利用できません。Solrマニュアルの内容自体は持っているので、データセットに対してモデルを教師なしでファインチューニングする方法を考案する必要があります。
4.1 クエリ生成
興味深いアプローチがBEIR: A Heterogenous Benchmark for Zero-shot Evaluation of Information Retrieval Modelsで紹介されています。彼らは、密な検索モデルの教師なしドメイン適応アプローチに合成クエリを使用することを提案しています。まず、彼らはT5-baseモデルをファインチューニングして、パッセージが与えられたときにクエリを生成するようにしました。次に、検索用に、合成クエリとドキュメントペアでSBERTモデルをファインチューニングしました。
私たちは、同様のアプローチを使用して目標を達成します。Solrマニュアルのページの内容を取り、その内容にマッチする可能性のあるユーザーのクエリを作成するためにモデルを使用します。
実際のドキュメントのタイトルに似たクエリを考慮すると、ユーザーはこの特定のマニュアルページを表示することを期待して、「Edismax parameters」を検索することがあります。その場合、コンテンツに要約やタイトル生成モデルを使用して、合成クエリとして使用できます。
合成クエリの生成には、snrspeaks/t5-one-line-summaryを使用しました。これは、370,000の研究論文で訓練されたT5モデルで、論文の説明/抄録に基づいて1行の要約を生成します。ドキュメントごとに4つのクエリを生成し、元のドキュメントのタイトルを5番目として含めました。
目指しているのは、段落にある情報をタイトル/クエリとして要約し、それを表現し、この知識タプルを用いて、それらの間の意味的および統語的情報マッピングを捉えるSBERTモデルをファインチューニングすることです。
4.2 翻訳
元の事前学習済みモデルは多言語モデルです。英語のパッセージから英語のタイトルを生成しましたが、ターゲット言語での知識タプルを作成する必要がありました。複数の言語でタイトルとパッセージの組み合わせを作成することも可能ですが、翻訳はコストのかかる操作であり、このデモの目的のためにはシンプルに保つことにしました。ターゲット言語を英語と日本語に設定し、ターゲットパッセージは英語のみにしました。
合成クエリのそれぞれを日本語に翻訳し、対応するマニュアルページと照らし合わせました。また、元の英語のクエリも保持し、ドキュメントごとに10個のクエリで、合計29,720のトレーニング例ができました。
クエリを翻訳するために、Google Translate APIを使ってみましたが、REST APIトランザクションにはオーバーヘッドが発生し、短いタイトルの比較的少ない数にもかかわらず、操作が高コストになりました。さらに、APIへの複数の呼び出し後にエラーメッセージが発生しました。代わりに、別の事前学習済みモデルを使用して機械翻訳を行いました。モデルはfacebook/nllb-200-distilled-600Mで見つけることができます。結果はGoogleのAPIほど正確ではありませんでしたが、それは私たちが受け入れなければならなかったトレードオフでした。
4.3 バイエンコーダーモデルのファインチューニング
SBERTは、エンコーディングに平均プーリングを使用し、検索にコサイン類似度を使用するシャムバイエンコーダーです。バイエンコーダーアーキテクチャの1つの利点は、類似したテキスト入力の効率的な検索を可能にすることです。入力を他のすべての入力と比較する代わりに、バイエンコーダーはすべての入力をベクトル表現にエンコードし、効率的に比較することができます。
実験全体を通じて、SentenceTransformers ライブラリを使用しました。このライブラリは、独自のテキスト埋め込みモデルをファインチューニングするのが非常に簡単なように設計されています。詳細なプロセスについては、How to train or fine-tune a Sentence Transformer model をご覧ください。コードサンプルや付随するノートブックも提供されています。
4.3.1 損失関数: Multiple Negatives Ranking Loss
損失関数は、モデルをファインチューニングする際に重要な役割を果たします。これは、特定の下流タスクに対して埋め込みモデルがどれだけうまく機能するかを決定します。残念ながら、「すべてに適合する」損失関数はありません。適切な損失関数は、利用可能なトレーニングデータと目標タスクによって異なります。
SentenceTransofmersライブラリで定義されたMultiple Negatives Ranking Lossは、たとえば、パラフレーズのペア、重複する質問のペア、(クエリ, レスポンス)のペア、または(ソース言語, ターゲット言語)のペアなど、類似したテキストのペアのみを持つ場合に適した損失関数です。
この損失関数は、入力として、(a1, p1), (a2, p2)..., (an, pn)といった文のペアを持つバッチを想定しています。ここで、(ai, pi)は正のペアであり、(ai, pj)はi != jの場合には負のペアです。各aiに対して、他のすべてのpjをネガティブサンプルとして使用し、つまり、aiに対して1つの正の例(pi)とn-1つのネガティブな例(pj)があります。その後、ソフトマックス正規化されたスコアの負の対数尤度を最小化します。
この損失関数は、正のペア(例:(クエリ, 関連ドキュメント))を持つリトリーバルセットアップ用の埋め込みをトレーニングするのに適しており、各バッチでn-1のネガティブドキュメントをランダムにサンプリングします。通常、バッチサイズが大きくなるとパフォーマンスが向上します。また、データを次のように構成することで、アンカー・ポジティブペアごとに1つまたは複数のハードネガティブを提供することもできます:(a1, p1, n1), (a2, p2, n2)。ここで、n1は(a1, p1)に対するハードネガティブです。ペア(ai, pi)に対して、損失はすべてのpj (j != i)と、すべてのnjをネガティブとして使用します。
ここで注意しておきたいのは、CosineSimilarityLossを使用していないことです。なぜなら、モデルをファインチューニングする最も簡単な方法は、0から1のスケールで類似性を示すスコアで注釈付きの知識タプルを持つことですが、ラベル付きのスコアは持っていません。MultipleNegativesRankingLossは、はるかに直感的で、はるかに優れた文の表現を生成します。
全体として、複数のネガティブランキング損失を持つバイエンコーダのファインチューニングは、バイエンコーダが関連性のある例を関連性のない例よりも高くランク付けすることを奨励する適切な目的関数を定義することを含みます。
5. 評価
モデルを評価するために、SentenceTransformersライブラリの InformationRetrievalEvaluator
を使用します。これは、情報検索タスクでモデルのパフォーマンスを評価する方法を提供するクラスです。リコール、適合率、平均平均適合率(MAP; Mean Average Precision)などの標準的なIRメトリクスを計算します。 InformationRetrievalEvaluator
の仕組みは以下の通りです。
入力データ :
InformationRetrievalEvaluator
への入力は、クエリのリストと、各クエリに対応するドキュメントのリストです。各ドキュメントはテキスト文字列で表され、各クエリはクエリ文字列で表されます。モデル推論 :モデルは、クエリとドキュメントを固定長のベクトル表現にエンコードするために使用されます。
類似性スコアリング :クエリとドキュメントのベクトル表現は、コサイン類似度や内積などの類似性関数を使用して比較されます。類似性スコアは、各クエリに対して関連度の降順でドキュメントをランク付けするために使用されます。
メトリクスの計算 :各クエリのランク付けされたドキュメントリストは、グラウンドトゥルースの関連性ラベルと比較して、リコール、適合率、MAPなどのメトリクスを計算します。
出力 :InformationRetrievalEvaluatorの出力は、リコール、適合率、MAPを含む計算されたメトリクスを含む辞書です。
ファインチューニングされたモデルによって得られた結果は以下の通りです。
計測方法 | 値 | 計測方法 | 値 |
---|---|---|---|
Accuracy @ 1 | 0.890 | Recall @ 1 | 0.890 |
Accuracy @ 3 | 0.993 | Recall @ 3 | 0.993 |
Accuracy @ 5 | 0.999 | Recall @ 5 | 0.999 |
Accuracy @ 10 | 0.999 | Recall @ 10 | 0.999 |
Precision @ 1 | 0.890 | NDCG @ 10 | 0.956 |
Precision @ 3 | 0.331 | MRR @ 10 | 0.941 |
Precision @ 5 | 0.199 | mAP@ 100 | 0.941 |
Precision @ 10 | 0.099 |
上記の結果は非常に良好に見えますが、評価はコーパス全体で実行されていることに注意する価値があります。つまり、トレーニング/テストの分割は行っていません。このような方法を選んだ理由はいくつかあります。
マニュアルは時間とともに劇的に変化しません。 既存のドキュメントは小さな修正が加えられるかもしれませんが、ほぼ静的と見なすことができます。新しいドキュメントは確実に時間とともに追加されますが...
新しいデータを使ってモデルを再トレーニングすることは、計算コストが高い操作ではありません。 生成されたクエリを再利用し、コーパスに新しく追加されたものだけ新しいクエリを生成することができます。トレーニングが5時間以内(Google Colabでの20エポック)で終了できることを考えると、新しいSolrバージョンがリリースされるたびにモデルを更新することができます。
基本的に、モデルが未知のデータをまったく扱わないため、モデルの過学習(高いバリアンス、低いバイアス)を心配する必要はありません。
6. 改善点
モデルを改善するために検討できるいくつかの点を以下に示します。
対称的検索モデルと非対称的検索モデル :タスクに適した事前学習済みモデルを慎重に選択します。コサイン類似度にチューニングされたモデルは、短いドキュメントの検索を優先する一方で、内積にチューニングされたモデルは、長いドキュメントの検索を優先します。タスクに応じて、どちらか一方のタイプのモデルが好ましいです。このプロセスのステップにはあまり考慮していませんでしたが、このアプリケーションはデモを目的としていたためです。
より良い合成クエリ :期待する実際のユーザー入力により近いクエリを生成するために、より適切なモデルを見つけるか、独自のモデルをファインチューニングします。既存の生成されたクエリの翻訳にも同じ概念が適用されます。より良い翻訳が最終的により良い検索結果をもたらす可能性が高いです。
実際のユーザークエリ :アクティビティログは、スマートな情報検索システムにとって非常に重要です。実際のユーザークエリ、インプレッション(検索結果)、インタラクション(クリック)を記録することで、クエリ-ドキュメントの知識ペアを推測できます。これにより、合成クエリを完全に廃止し、モデルの教師付きトレーニングを実行するための現実的なデータセットを作成することができます。
参考文献
Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks https://arxiv.org/abs/1908.10084
Making Monolingual Sentence Embeddings Multilingual using Knowledge Distillation https://arxiv.org/abs/2004.09813
WikiMatrix: Mining 135M Parallel Sentences in 1620 Language Pairs from Wikipedia https://arxiv.org/abs/1907.05791
Synthetic Query Generation https://arxiv.org/abs/2104.08663
Multiple Negative Ranking Loss https://arxiv.org/pdf/1705.00652.pdf
How to use BERT for finding similar sentences or similar news? https://github.com/huggingface/transformers/issues/876