データナード

機械学習と自然言語処理についての備忘録 (旧ナード戦隊データマン)

Semantic Retrievalとは

Semantic Retrievalは、情報検索(IR)タスクの一つで、コーパスからクエリに類似するすべての文を探すタスクです。最近の手法は、主にエンコードされた対象の探索をANN(近似最近傍法)によって行い、その検索精度を評価します。ANNの手法が固定だと仮定すると、主に比較されるのはエンコーダ部分の手法となります。

関連論文

タスクの正式な説明

タスクに関する正式な説明は [1907.04307] Multilingual Universal Sentence Encoder for Semantic Retrieval に書かれています。

The SR task is to identify all sentences in the retrieval corpus that are semantically similar to a query sentence. The task is related to paraphrase identification (Dolan et al., 2004) and Semantic Textual Similarity (STS) (Ceret al., 2017), but with the identification of meaning similarity being assessed in the context of a retrieval task. - https://arxiv.org/abs/1907.04307

概要

  • 従来のテキストベース情報検索システムは、単語やフレーズによって対象をインデックス化しますが、これは離散的なシステムと呼ばれます。この離散的なシステムにおいて、連続空間で類似性を測定するためにEmbeddingを使用するような連続空間モデルを使うような改善手法もありましたが、このような連続空間モデルは通常、検索によって得た上位候補をリランクするために使用されてきました。
  • Semantic Retrieval (SR) に対する最近の手法では、従来の離散的システムを置き換える方法として連続検索(continuous retrieval) を提案しています。言い換えれば、SRタスクは現在のところ、近似最近傍探索(ANN)を使って従来型の離散的インデックスを置き換えることにより、エンドツーエンド検索の問題を中心に考えられてきています。
  • ドキュメントは、ANNで検索可能にするためにベクトルに変換されますが、この変換はエンコーダによって行われます。
  • 検索の質はANN・類似度関数・エンコーダに依存しますが、ANNや類似度関数が固定である場合、比較されるのはエンコーダの性能です。

基本的な手法は以下の記事でコードと共に紹介しました。

datanerd.hateblo.jp

主要なコードは以下の部分です:

import faiss
import laserencoder

enc = laserencoder.Encoder()


def indexing(infile="./sep_target.txt"):
    with open(infile) as f:
        text = f.read()
        xb = enc.encode(text)
        d = 1024
        quantizer = faiss.IndexFlatL2(d)
        index = faiss.IndexIVFFlat(quantizer, d, 1014)
        index.train(xb)
        index.add(xb)
        faiss.write_index(index, "index.faiss")


if __name__ == "__main__":
    indexing()

laserencoderは単に私がlaserをon the flyで使うために作ったモジュールですが、本質的に意味があるのは

  • エンコーダで対象をベクトル化する。
  • ANNを使う。

という2つの部分です。例えば、ANN部分と類似度関数をfaissというライブラリで固定すると、エンコーダの部分をどうにかすれば検索の質が上がる可能性があると考えることができます。

データセット

SRタスクで使われているデータセットには、以下があります。

Note: このブログで"paraphrase retrieval"と呼んでいたものは、一般に"semantic retrieval"と呼ばれるようです。ただし、"semantic retrieval" は現在のところ、Google AIの人たちが論文内やtensorflow-hub内で使っている用語のようなので、一般的に多く認知されているタスクなのかは不明です。

評価方法

評価ではMAP@100が使われます。

f:id:mathgeekjp:20200325110311g:plain

 Q_i はテストクエリの集合, R_i Q_i に関連する既知の候補の数、 p q_i の precision@j、 r は j 番目の結果が  q_i に関連する場合は 1、そうでない場合は 0。

ANN探索

  • SRタスクにおいてNN探索の精度は通常関心がないため、近似探索で量子化手法を使うことで高速化するのが一般的なようです。
  • モデリングに焦点を当てるために、ANNアルゴリズムの選択によって生じうる交絡効果を避ける必要があります。

エンコーダの比較

[1811.08008] End-to-End Retrieval in Continuous Space では、いくつかの手法やエンコーダが比較されています。

  • identity
  • tfidf
  • okapi bm25
  • word2vec
  • glove
  • skip thought
  • dual encoder

f:id:mathgeekjp:20200325112037g:plain

  • 連続検索に効果があるかを検証するために、離散検索の手法であるtfidfやbm25が比較されています。
  • 結果的には、連続検索の手法が離散検索を上回っており、dual encoderは比較されている中で良い成果を上げています。
  • 容易に実行可能な方法としては、Universal Sentence Encoderを使う方法があります。これは、tensorflow-hubで公開されています。

https://tfhub.dev/google/collections/universal-sentence-encoder/1

考察

  • リランキングとretrievalは異なるタスクとして考えられます。
  • 従来の検索タスクの問題は、LTRのようなリランキング手法が多く検証されてきた印象がありますが、リランキング前に行う検索については、単語やngramでインデクシングする方法が中心的に使われてきていました。
  • 従来のインデクシング方法を「離散検索」とし、ANNを使った方法を「連続検索」とすることで区別できることがわかります。
  • 連続検索の利点は、精度が上がることがまず挙げられます。
  • エンコーダ自体が更新された場合、どのようにインデックスを更新すれば効率がよく安全なのかは、むしろソフトウェアの設計上の問題かもしれません。
  • 「類似する文章であるかどうかを判定する(STS)」「同義文を識別する (paraphrase identification)」というタスクよりも、SRタスクのほうがシステム上の要件が厳しいと考えられます。SRタスクではシステム内の膨大なドキュメントリストから検索を行わなければならず、しかも実用上の問題から、その検索速度についても要求され得るものです。

参考

  1. [1811.08008] End-to-End Retrieval in Continuous Space
  2. [1907.04307] Multilingual Universal Sentence Encoder for Semantic Retrieval
  3. TensorFlow Hub