<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Julie Tibshirani - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Julie Tibshirani - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/jp/search-labs/author/julie-tibshirani</link>
    </image>
    <link>https://www.elastic.co/jp/search-labs/author/julie-tibshirani</link>
    <atom:link href="https://www.elastic.co/jp/search-labs/rss/author/julie-tibshirani.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[jp]]></language>
    <lastBuildDate>Tue, 22 Sep 2026 13:47:30 GMT</lastBuildDate>
  <item>
    <title><![CDATA[ベクトル場を用いたテキスト類似性検索]]></title>
    <description><![CDATA[この投稿では、テキスト埋め込みと Elasticsearch の新しい dense_vector タイプを使用して類似性検索をサポートする方法について説明します。]]></description>
    <content:encoded><![CDATA[<p>Elasticsearch は、<a href="https://www.elastic.co/about/history-of-elasticsearch">レシピ検索エンジン</a>として誕生して以来、高速で強力な全文検索を提供するように設計されました。このような背景から、テキスト検索の改善は、ベクターに関する私たちの継続的な取り組みの重要な動機となっています。Elasticsearch 7.0 では、高次元ベクトル用の実験的なフィールドタイプを導入し、7.3 リリースでは、ドキュメント スコアリングでこれらのベクトルを使用するためのサポートが追加されました。</p><p>この投稿では、テキスト類似性検索と呼ばれる特定の手法に焦点を当てています。このタイプの検索では、ユーザーは短いフリーテキストクエリを入力し、ドキュメントはクエリとの類似性に基づいてランク付けされます。テキストの類似性は、さまざまな使用例で役立ちます。</p><ul><li><p><strong>質問回答:</strong>よくある質問のコレクションが与えられた場合、ユーザーが入力した質問に類似した質問を見つけます。</p></li><li><p><strong>記事検索:</strong>研究記事のコレクションで、ユーザーのクエリに密接に関連するタイトルの記事を返します。</p></li><li><p><strong>画像検索:</strong>キャプション付きの画像のデータセットで、ユーザーの説明に類似したキャプションを持つ画像を検索します。</p></li></ul><p>類似性検索の直接的なアプローチは、クエリと共有する単語の数に基づいてドキュメントをランク付けすることです。しかし、共通する単語がほとんどない場合でも、ドキュメントがクエリと類似している可能性があります。より堅牢な類似性の概念では、構文と<a href="https://en.wikipedia.org/wiki/Semantic_similarity">意味の</a>内容も考慮されます。</p><p>自然言語処理 (NLP) コミュニティは、単語や文章を数値ベクトルとしてエンコードするテキスト埋め込みと呼ばれる手法を開発しました。これらのベクトル表現は、テキストの言語コンテンツをキャプチャするように設計されており、クエリとドキュメント間の類似性を評価するために使用できます。</p><p>この投稿では、テキスト埋め込みと Elasticsearch の dense_vector タイプを使用して類似性検索をサポートする方法について説明します。まず、埋め込み技術の概要を説明し、次に Elasticsearch を使用した類似性検索の簡単なプロトタイプを段階的に説明します。</p><strong>注:</strong>検索でテキスト埋め込みを使用することは、複雑かつ進化を続ける領域です。このブログは、特定のアーキテクチャや実装を推奨するものではありません。<a href="https://www.elastic.co/what-is/vector-search">ベクター検索</a>の力を利用して検索エクスペリエンスを強化する方法を学ぶには、ここから始めてください。<h2>テキスト埋め込みとは何ですか?</h2><p>さまざまな種類のテキスト埋め込みと、従来の検索アプローチとの比較を詳しく見てみましょう。</p><h3>単語埋め込み</h3><p><a href="https://en.wikipedia.org/wiki/Word_embedding">単語埋め込み</a>モデルは、単語を密な数値ベクトルとして表現します。これらのベクトルは、単語の意味特性を捉えることを目的としています。つまり、ベクトルが近い単語は、意味の点で類似しているはずです。適切な埋め込みでは、ベクトル空間の方向は単語の意味のさまざまな側面に結び付けられます。たとえば、「カナダ」のベクトルは、ある方向では「フランス」に近く、別の方向では「トロント」に近くなる可能性があります。</p><p>NLP および検索コミュニティは、かなり長い間、単語のベクトル表現に興味を抱いてきました。過去数年間、多くの従来のタスクがニューラル ネットワークを使用して再検討され、単語埋め込みへの関心が再び高まりました。<a href="https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf">word2vec</a>や<a href="https://nlp.stanford.edu/pubs/glove.pdf">GloVe</a>など、いくつかの成功した単語埋め込みアルゴリズムが開発されました。これらのアプローチでは、大規模なテキスト コレクションを利用し、各単語が出現するコンテキストを調べてベクトル表現を決定します。</p><ul><li><p>word2vec Skip-gram モデルは、ニューラル ネットワークをトレーニングして、文中の単語の周囲のコンテキスト ワードを予測します。ネットワークの内部重みによって単語の埋め込みが与えられます。</p></li><li><p>GloVe では、単語の類似性は、他の文脈上の単語と一緒に出現する頻度によって決まります。このアルゴリズムは、単語の共起カウントに基づいて単純な線形モデルをトレーニングします。</p></li></ul><p>多くの研究グループが、Wikipedia や Common Crawl などの大規模なテキスト コーパスで事前トレーニングされたモデルを配布しており、ダウンロードして下流のタスクに組み込むのが便利になっています。事前トレーニング済みのバージョンが直接使用される場合もありますが、特定のターゲット データセットとタスクに合わせてモデルを調整すると役立つ場合があります。これは通常、事前トレーニング済みのモデルに対して「微調整」ステップを実行することによって実現されます。</p><p>単語埋め込みは非常に堅牢かつ効果的であることが証明されており、機械翻訳や感情分類などの NLP タスクでは、個々のトークンの代わりに埋め込みを使用するのが一般的になっています。</p><h3>文の埋め込み</h3><p>最近では、研究者たちは単語だけでなく、より長いテキストセクションを表す埋め込み技術に注目し始めています。現在のアプローチのほとんどは、複雑なニューラル ネットワーク アーキテクチャに基づいており、意味情報の取得を支援するためにトレーニング中にラベル付けされたデータを組み込むこともあります。</p><p>一度トレーニングされると、モデルは文を受け取り、文脈内の各単語のベクトルと文全体のベクトルを生成できるようになります。単語埋め込みと同様に、多くのモデルの事前トレーニング済みバージョンが利用可能であり、ユーザーはコストのかかるトレーニング プロセスを省略できます。トレーニング プロセスは大量のリソースを消費する可能性がありますが、モデルの呼び出しははるかに軽量です。文埋め込みモデルは通常、リアルタイム アプリケーションの一部として使用できるほど高速です。</p><p>一般的な文埋め込み手法としては、 <a href="https://arxiv.org/abs/1705.02364">InferSent</a> 、 <a href="https://arxiv.org/abs/1803.11175">Universal Sentence Encoder</a> 、 <a href="https://arxiv.org/abs/1802.05365">ELMo</a> 、 <a href="https://arxiv.org/abs/1810.04805">BERT</a>などがあります。単語や文の埋め込みの改善は活発に研究されている分野であり、今後さらに強力なモデルが導入される可能性があります。</p><h3>従来の検索アプローチとの比較</h3><p>従来の情報検索では、テキストを数値ベクトルとして表現する一般的な方法は、語彙内の単語ごとに 1 つの次元を割り当てることです。テキストのベクトルは、語彙内の各用語が出現する回数に基づいて決定されます。テキストを表現するこの方法は、文の構造を考慮せずに単語の出現回数を単純に数えるため、「bag of words」と呼ばれることがよくあります。</p><p>テキスト埋め込みは、いくつかの重要な点で従来のベクトル表現と異なります。</p><ul><li><p>エンコードされたベクトルは密度が高く、比較的低次元であり、多くの場合 100 次元から 1,000 次元の範囲になります。対照的に、Bag of Words ベクトルはスパースであり、50,000 以上の次元で構成できます。埋め込みアルゴリズムは、テキストの意味をモデル化する一環として、テキストを低次元空間にエンコードします。理想的には、同義語やフレーズは、新しいベクトル空間で同様の表現になります。</p></li><li><p>文の埋め込みでは、ベクトル表現を決定するときに単語の順序を考慮できます。たとえば、「tune in」というフレーズは、「in tune」とはまったく異なるベクトルとしてマッピングされる場合があります。</p></li><li><p>実際には、文の埋め込みはテキストの大きなセクションにはうまく一般化されないことがよくあります。これらは通常、短い段落よりも長いテキストを表すために使用されません。</p></li></ul><h2>類似性検索に埋め込みを使用する</h2><p>質問と回答の大きなコレクションがあったとしましょう。ユーザーは質問をすることができ、私たちはユーザーが回答を見つけやすくするために、コレクション内で最も類似した質問を取得したいと考えています。</p><p>テキスト埋め込みを使用すると、類似の質問を取得できるようになります。</p><ul><li><p>インデックス作成中に、各質問は文埋め込みモデルに渡され、数値ベクトルが生成されます。</p></li><li><p>ユーザーがクエリを入力すると、同じ文埋め込みモデルが実行され、ベクトルが生成されます。回答をランク付けするために、各質問とクエリ ベクトル間のベクトル類似度を計算します。埋め込みベクトルを比較する場合、<a href="https://en.wikipedia.org/wiki/Cosine_similarity">コサイン類似度を</a>使用するのが一般的です。</p></li></ul><p><a href="https://github.com/jtibshirani/text-embeddings">このリポジトリには、</a> Elasticsearch でこれをどのように実現できるかの簡単な例が示されています。メイン スクリプトは、 <a href="https://github.com/elastic/rally-tracks/tree/master/so">StackOverflow データセット</a>から約 20,000 件の質問にインデックスを付け、ユーザーがデータセットに対してフリーテキスト クエリを入力できるようにします。</p><p>スクリプトの各部分については後ほど詳しく説明しますが、まずはいくつかの例の結果を見てみましょう。多くの場合、この方法は、クエリとインデックス付けされた質問の間に強い単語の重複がない場合でも類似性を捉えることができます。</p><ul><li><p>「ファイルを圧縮」と入力すると、「フォルダとファイルの圧縮/解凍」が返されます。</p></li><li><p>「何かが IP であるかどうかを判断する」は、「文字列が IP であるかホスト名であるかを判断する方法」を返します。</p></li><li><p>「バイトを倍精度浮動小数点数に変換する」は「Pythonでバイトを浮動小数点数に変換する」を返します。</p></li></ul><h3>実装の詳細</h3><p><a href="https://github.com/jtibshirani/text-embeddings/blob/blog/src/main.py">スクリプトは、</a> TensorFlow に埋め込みモデルをダウンロードして作成することから始まります。Google の Universal Sentence Encoder を選択しましたが、他の多くの埋め込み方法を使用することもできます。スクリプトは追加のトレーニングや微調整を行わずに、埋め込みモデルをそのまま使用します。</p><p>次に、質問のタイトル、タグ、およびベクトルとしてエンコードされた質問のタイトルのマッピングを含む Elasticsearch インデックスを作成します。</p>"mappings": {
"properties": {
"title": {
"type": "text"
},
"title_vector": {
"type": "dense_vector",
"dims": 512
}
"tags": {
"type": "keyword"
},
...
}
}
<p>dense_vector のマッピングでは、ベクトルに含まれる次元の数を指定する必要があります。title_vector フィールドにインデックスを作成するとき、Elasticsearch はマッピングで指定されたのと同じ数のディメンションがあるかどうかを確認します。</p><p>ドキュメントのインデックスを作成するには、質問のタイトルを埋め込みモデルに渡して数値配列を取得します。この配列は、title_vector フィールドのドキュメントに追加されます。</p><p>ユーザーがクエリを入力すると、テキストは最初に同じ埋め込みモデルに渡され、パラメータ query_vector に保存されます。7.3 以降、Elasticsearch はネイティブ スクリプト言語で<a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.6/query-dsl-script-score-query.html#vector-functions">cosineSimilarity 関数</a>を提供します。したがって、ユーザーのクエリとの類似性に基づいて質問をランク付けするには、script_score クエリを使用します。</p>{
"script_score": {
"query": {"match_all": {}},
"script": {
"source": "cosineSimilarity(params.query_vector, 'title_vector') + 1.0",
"params": {"query_vector": query_vector}
}
}
}
<p>新しいクエリごとに<a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.6/modules-scripting-using.html#prefer-params">スクリプト () が再コンパイルされるのを避ける</a>ために、クエリ ベクトルをスクリプト パラメータとして渡すようにします。Elasticsearch では負のスコアが許可されないため、コサイン類似度に 1 を追加する必要があります。</p><p>|<strong>注:</strong>このブログ投稿では、元々、Elasticsearch 7.3 で使用可能だった<a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.3/query-dsl-script-score-query.html#vector-functions">ベクトル関数の別の構文</a>を使用していましたが、7.6 では非推奨になりました。|</p><h3>重要な制限事項</h3><p>script_score クエリは、制限的なクエリをラップし、返されるドキュメントのスコアを変更するように設計されています。ただし、match_all クエリを提供しているため、スクリプトはインデックス内のすべてのドキュメントに対して実行されます。これは、Elasticsearch におけるベクトル類似性の現在の制限です。ベクトルはドキュメントのスコアリングには使用できますが、最初の検索手順では使用できません。ベクトル類似性に基づく検索のサポートは、<a href="https://github.com/elastic/elasticsearch/issues/42326">現在進行中の作業</a>の重要な領域です。</p><p>すべてのドキュメントをスキャンすることを回避し、高速なパフォーマンスを維持するために、match_all クエリをより選択的なクエリに置き換えることができます。検索に使用する適切なクエリは、特定のユースケースによって異なる可能性があります。</p><p>上記ではいくつか有望な例を見てきましたが、結果にはノイズが多く直感的でない場合もあることに注意することが重要です。例えば、「ファイルを圧縮する」では、「部分的な.csproj」にも高いスコアが割り当てられます。ファイル」と「.pyc を回避する方法」ファイルですか？また、メソッドが予期しない結果を返す場合、その問題をデバッグする方法が必ずしも明確であるとは限りません。各ベクトル要素の意味は不透明であることが多く、解釈可能な概念に対応していません。単語の重複に基づく従来のスコアリング手法を使用すると、「なぜこのドキュメントのランクが高いのか」という質問に答えるのが簡単になることがよくあります。</p><p>前述のように、このプロトタイプは埋め込みモデルをベクトル フィールドで使用する方法の例として提供されており、本番環境で使用できるソリューションとして提供されているわけではありません。新しい検索戦略を開発するときは、一致クエリなどの強力なベースラインと比較しながら、独自のデータでそのアプローチがどのように機能するかをテストすることが重要です。確実な結果を得るには、ターゲット データセットの埋め込みモデルを微調整したり、単語レベルのクエリ拡張などの埋め込みを組み込むさまざまな方法を試したりするなど、戦略に大きな変更を加える必要がある場合があります。</p><h2>結論</h2><p>埋め込み技術は、テキストの言語コンテンツを取得する強力な方法を提供します。埋め込みをインデックス化し、ベクトル距離に基づいてスコアリングすることで、単語レベルの重複を超えた類似性の概念を使用してドキュメントを比較できます。</p><p>ベクター フィールド タイプに基づいた機能をさらに導入することを楽しみにしています。検索にベクトルを使用するのは、微妙で発展途上の領域です。いつものように、 <a href="https://github.com/elastic/elasticsearch">Github</a>や<a href="https://discuss.elastic.co/">ディスカッション フォーラム</a>で、皆さんの使用事例や体験談をお聞かせください。</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/text-similarity-search-with-vectors-in-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/text-similarity-search-with-vectors-in-elasticsearch</guid>
    <category><![CDATA[Vector Database]]></category>
    <dc:creator><![CDATA[Julie Tibshirani]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt91384bd99b05cd28/6a17e7e01d1b835cc593e467/c633ed737add7d22a7d65b3ca5c56480ef3d8b2c-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Thu, 06 Oct 2022 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[学術論文の実装: ElasticsearchとLuceneから学んだ教訓]]></title>
    <description><![CDATA[Elasticsearch と Lucene の経験を活かして、研究論文をソフトウェア アプリケーションに組み込む戦略を学びます。]]></description>
    <content:encoded><![CDATA[<p>この投稿では、学術論文をソフトウェア アプリケーションに実装するための戦略を紹介します。他のエンジニアが私たちの経験から学べるよう、Elasticsearch と Lucene の例を参考にしています。これらの戦略を読んで、「でもこれは単なるソフトウェア開発だ！」と思うかもしれません。そしてそれは確かに真実です。エンジニアとして私たちはすでに適切な方法とツールを持っており、それらを新たな課題に適応させる必要があるだけです。</p><h2>背景</h2><p>Elasticsearch を開発しているときに、解決するための単純なアプローチや確立されたアプローチがない重要な問題に遭遇することがあります。「うーん、これについて言及している学術論文はあるのだろうか？」と疑問に思うのは当然です。時には、学術的な仕事がインスピレーションの源となることもあります。新しいアルゴリズムやデータ構造を提案する論文に出会うと、「これはとても便利だろう！」と思うでしょう。Elasticsearch と Apache Lucene が学術研究にどのように組み込まれているか、いくつかの例を次に示します。</p><ul><li><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.15/search-aggregations-metrics-cardinality-aggregation.html">カーディナリティ集計 のための</a> <a href="https://research.google/pubs/pub40671/">HyperLogLog++</a></p></li><li><p><a href="https://www.elastic.co/blog/improving-response-latency-in-elasticsearch-with-adaptive-replica-selection">適応型レプリカ選択</a> <a href="https://www.usenix.org/system/files/conference/nsdi15/nsdi15-paper-suresh.pdf">のための C3アルゴリズム</a></p></li><li><p>Lucene における最近傍ベクトル検索のため<a href="https://arxiv.org/abs/1603.09320">の階層的ナビゲート可能スモールワールドグラフ (HNSW)</a></p></li><li><p><a href="https://github.com/elastic/ml-cpp/pull/488">機械学習の分類を改善する</a> <a href="https://jmlr.csail.mit.edu/papers/volume17/15-308/15-308.pdf">ための MIC統計</a></p></li><li><p><a href="https://www.elastic.co/blog/faster-retrieval-of-top-hits-in-elasticsearch-with-block-max-wand">Lucene でトップヒット検索を高速化</a> する<a href="http://engineering.nyu.edu/~suel/papers/bmw.pdf"> ブロック最大 WAND</a></p></li><li><p>...<a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.15/query-dsl-combined-fields-query.html"> その他 多数</a></p></li></ul><p>学術論文は、データ集約型システムを開発するエンジニアにとって貴重なリソースです。しかし、それらを実装するのは困難で、エラーが発生しやすくなります。アルゴリズムの説明は複雑であることが多く、重要な実用的な詳細が省略されています。そして、テストは本当に難しいです。たとえば、出力がデータセットに大きく依存する機械学習アルゴリズムを徹底的にテストするにはどうすればよいでしょうか。</p><h2>ソフトウェアの依存関係と同じように論文を評価する</h2><p>新しいソフトウェア依存関係を追加するには、慎重な評価が必要です。他のパッケージが正しくなかったり、速度が遅かったり、安全でなかったりする場合は、プロジェクトも同様になる可能性があります。依存関係を導入する前に、開発者は必ずその品質を評価します。</p><p>実装を検討している学術論文にも同じことが当てはまります。アルゴリズムが論文で発表されているので、そのアルゴリズムは正しく、パフォーマンスも優れているに違いないと思われるかもしれません。しかし、査読プロセスに合格したとしても、学術論文には問題がある可能性があります。おそらく、正しさの証明は現実的ではない仮定に依存しているのでしょう。あるいは、「実験」セクションではベースラインよりもはるかに優れたパフォーマンスが示されていますが、これは特定のデータセットにのみ当てはまります。たとえ論文の質が優れていたとしても、そのアプローチがプロジェクトに適していない可能性があります。</p><p>学術論文に「依存」するかどうかを考えるときは、ソフトウェア パッケージの場合と同じ質問をすると役立ちます。</p><ul><li><p>ライブラリは広く使用され、「実戦テスト済み」ですか?→ 他のパッケージでもこの論文は実装されていますか? また、うまく機能しましたか?</p></li><li><p>パフォーマンスベンチマークは利用可能ですか?これらは正確かつ公平と思われますか?→論文には現実的な実験が含まれていますか？それらはうまく設計されていますか?</p></li><li><p>パフォーマンスの改善は複雑さを正当化するほど大きいですか?→ この論文は強力なベースラインアプローチに匹敵しますか?このベースラインをどれだけ上回るのでしょうか?</p></li><li><p>このアプローチは当社のシステムとうまく統合されるでしょうか?→ アルゴリズムの前提とトレードオフは、私たちのユースケースに適合していますか?</p></li></ul><p>どういうわけか、ソフトウェア パッケージが競合製品とのパフォーマンス比較を公開すると、そのパッケージが常に最速であると出てきます。第三者がベンチマークを設計した場合、よりバランスが取れる可能性があります。同じ現象が学術論文にも当てはまります。アルゴリズムが元の論文だけでなく、他の論文でも強力なベースラインとして優れたパフォーマンスを示している場合、そのアルゴリズムは信頼できる可能性が非常に高くなります。</p><h2>テストを創造的に行う</h2><p>学術論文のアルゴリズムは、私たちが日常的に目にするタイプのアルゴリズムよりも動作が洗練されていることがよくあります。おそらく、これは精度と引き換えに速度を向上させる近似アルゴリズムです。あるいは、大規模なデータセットを取り込み、（場合によっては予期しない）出力を生成する機械学習の手法である可能性もあります。アルゴリズムの動作を単純な方法で特徴付けることができない場合、これらのアルゴリズムのテストをどのように記述できるでしょうか?</p><h3>不変量に焦点を当てる</h3><p>ユニット テストを設計するときは、例に基づいて考えるのがよくあります。つまり、アルゴリズムにこの例の入力を与えると、その出力が得られるはずです。残念ながら、ほとんどの数学アルゴリズムでは、例に基づくテストではその動作を十分にカバーできません。</p><p>Elasticsearch が検索リクエストをどのノードが処理すべきかを判断するために使用する C3 アルゴリズムを考えてみましょう。ノードの以前のサービスと応答時間、およびキュー サイズを組み込んだ微妙な計算式を使用して各ノードをランク付けします。いくつかの例をテストしても、式を正しく理解できたかどうかは実際には確認できません。一歩下がって不変条件のテストについて考えてみると役に立ちます。サービス時間が長くなると、ノードのランクは下がりますか?キューのサイズが 0 の場合、論文で主張されているように、ランクは応答時間によって決定されますか?</p><p>不変条件に焦点を当てると、次のような多くの一般的なケースで役立ちます。</p><ul><li><p>このメソッドは順序に依存しないものになるのでしょうか?もしそうなら、入力データを異なる順序で渡すと同じ出力が得られるはずです。</p></li><li><p>アルゴリズムの何らかのステップでクラス確率が生成されますか?もしそうなら、これらの確率の合計は 1 になるはずです。</p></li><li><p>関数は原点を中心に対称ですか?もしそうなら、入力の符号を反転すると、出力の符号も単に反転するはずです。</p></li></ul><p>C3 を初めて実装したとき、式にバグがあり、応答時間の代わりに応答時間の逆数を誤って使用していました。つまり、より遅いノードの方が上位にランク付けされる可能性があるということです。問題を修正する際には、将来のミスを防ぐために<a href="https://github.com/elastic/elasticsearch/pull/70283">不変チェックを追加するようにしました</a>。</p><h3>リファレンス実装と比較する</h3><p>論文とともに、著者らはアルゴリズムの実装も公開したようです。(論文に実験が含まれている場合は特にこの可能性が高くなります。多くのジャーナルでは、著者が結果を再現するためのコードを投稿することを求めているためです。)このリファレンス実装に対してアプローチをテストし、アルゴリズムの重要な詳細を見逃していないことを確認できます。</p><p>最近傍検索用の Lucene HNSW 実装を開発する際に、論文の著者による<a href="https://issues.apache.org/jira/browse/LUCENE-9937">参照ライブラリに対してテストを行いました</a>。同じデータセットに対して Lucene とライブラリの両方を実行し、結果の精度と実行された計算の数を比較しました。これらの数値がほぼ一致する場合、Lucene がアルゴリズムを忠実に実装していることがわかります。</p><p>アルゴリズムをシステムに組み込む場合、複数のコアに拡張したり、パフォーマンスを向上させるためにヒューリスティックを追加したりするなど、変更や拡張を行う必要があることがよくあります。最初に「バニラ」バージョンを実装し、リファレンスに対してテストしてから、段階的な変更を加えるのが最適です。そうすれば、カスタマイズを行う前に、すべての重要な部分を確実にキャプチャできます。</p><h3>既存のアルゴリズムとの決闘</h3><p>最後のセクションでは、テスト不変条件の別のアイデアとして、アルゴリズムの出力を、より単純で理解しやすいアルゴリズムの出力と比較する方法について説明します。例として、上位の結果に表示されないドキュメントをスキップすることでドキュメントの検索を高速化する、Lucene の block-max WAND アルゴリズムを考えてみましょう。block-max WAND があらゆるケースでどのように動作するかを正確に説明することは困難ですが、これを適用しても上位の結果は変わらないはずです。したがって、テストではランダムな検索クエリをいくつか生成し、<a href="https://github.com/apache/lucene/blob/main/lucene/core/src/test/org/apache/lucene/search/TestWANDScorer.java#L669">それらを WAND 最適化ありとなしの両方で実行して</a>、結果が常に一致することを確認できます。</p><p>これらのテストの重要な側面は、比較を実行するための<a href="https://www.elastic.co/blog/elasticsearch-testing-qa-increasing-coverage-randomizing-test-runs">ランダムな入力を生成する</a>ことです。これにより、思いもよらなかったケースを練習したり、予期しない問題を明らかにしたりすることができます。たとえば、Lucene の BM25F スコアリングのランダム化比較テストは<a href="https://issues.apache.org/jira/browse/LUCENE-10039">、微妙なエッジ ケースのバグを検出するのに</a>役立ちました。アルゴリズムにランダムな入力を与えるという考え方には、コンピューター セキュリティの一般的なテスト手法である<a href="https://en.wikipedia.org/wiki/Fuzzing">ファジング</a>の概念との密接な関係があります。</p><p>Elasticsearch と Lucene では、このテスト手法が頻繁に使用されます。2 つのアルゴリズム (TestDuelingAnalyzers、testDuelTermsQuery...) 間の「決闘」について言及しているテストを見ると、この戦略が実行中であることがわかります。</p><h2>論文の用語を使用する</h2><p>他の開発者があなたのコードで作業する場合、詳細を理解するために論文を参照する必要があります。<a href="https://github.com/elastic/elasticsearch/blob/4f22f437ee50cacb94b37b457be1da0b8ba0e8ce/server/src/main/java/org/elasticsearch/search/aggregations/metrics/HyperLogLogPlusPlus.java#L24-L39">Elasticsearch の HyperLogLog++ 実装に関するコメントは、</a>次のようにうまく表現しています。「論文を読まずにこのクラスが何をするかを理解しようとするのは冒険的だと見なされます。」このメソッドのコメントも良い例を示しています。学術論文へのリンクが含まれており、元々説明されていたアルゴリズムにどのような変更が加えられたかが強調されています。</p><p>開発者は紙に基づいてコードを理解するので、まったく同じ用語を使用すると便利です。数学表記は簡潔なので、通常は「適切なスタイル」とは見なされない名前になることもありますが、論文の文脈では非常に明確になります。学術論文の数式は、Elasticsearch で<a href="https://github.com/elastic/elasticsearch/blob/4f22f437ee50cacb94b37b457be1da0b8ba0e8ce/server/src/main/java/org/elasticsearch/node/ResponseCollectorService.java#L151">rS や muBarSInverse</a>のような難解な変数名に遭遇する数少ない例の 1 つです。</p><p>
<em>著者が推奨する論文の読み方は、大きなコーヒーを飲みながら読むことです。</em></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt12d81453c706f7cb/6a17d80e0b0bede6badd3424/d03a8e2a50e173b15a4ec3732810c63ff53321f6-1440x1081.jpg" alt="elastic-blog-academicpaper.jpg" /><h2>著者にメールを送ることができます</h2><p>難しい論文に取り組むとき、誤解しているのか、それとも単なるタイプミスなのかわからず、数式について頭を悩ませるのに何時間も費やすことがあります。これがオープンソース プロジェクトであれば、GitHub または StackOverflow で質問することができます。しかし、学術論文はどこで入手できるのでしょうか?著者は忙しそうなので、あなたのメールにイライラするかもしれません。</p><p>それどころか、多くの学者は自分のアイデアが実践されていると聞くことを喜び、メールで質問に喜んで答えてくれます。彼らが精通している製品に取り組んでいる場合は、そのアプリケーションが彼らの Web サイトに掲載される可能性もあります。</p><p>また、ソフトウェア開発で使用したのと同じツールの多くを使用して、研究者が論文を公開して議論する傾向も高まっています。論文にソフトウェア パッケージが付属している場合は、 <a href="https://github.com/facebookresearch/faiss/issues/1928">Github でよくある質問</a>への回答が見つかることがあります。「理論計算機科学」や「Cross Validated」などの Stack Exchange コミュニティにも、<a href="https://cstheory.stackexchange.com/questions/49296/problem-in-the-paper-stable-minimum-space-partitioning-in-linear-time">人気のある論文に関する詳細な議論</a>が含まれています。一部の会議では、すべての論文レビューをオンラインで公開し始めています。これらのレビューには著者との<a href="https://openreview.net/forum?id=H1eA7AEtvS">双方向の議論</a>が含まれており、アプローチに関する役立つ洞察が得られる可能性があります。</p><h2>つづく</h2><p>この投稿では、学術論文の選び方の基本に焦点を当て、 </p><p>正しく実装しますが、アルゴリズムを実際に展開するすべての側面をカバーしているわけではありません。たとえば、アルゴリズムが複雑なシステムの 1 つのコンポーネントにすぎない場合、そのコンポーネントへの変更がエンドツーエンドの改善につながることをどのように保証すればよいでしょうか。また、アルゴリズムを統合するために、元の論文でカバーされていない大幅な変更や拡張が必要な場合はどうなるでしょうか?これらは重要なトピックであり、今後の投稿でさらに詳しく共有したいと考えています。</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/implementing-academic-papers-lessons-learned-from-elasticsearch-and-lucene</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/implementing-academic-papers-lessons-learned-from-elasticsearch-and-lucene</guid>
    <category><![CDATA[MLの調査]]></category>
    <category><![CDATA[Lucene]]></category>
    <dc:creator><![CDATA[Julie Tibshirani]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbd7e961f594005e7/6a17d80f033c8d981f6bb009/d240bfef29e9d432069059b312dd044eb76eec6c-1440x840.png" length="0" type="image/png"/>
    <pubDate>Wed, 29 Sep 2021 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>