以下、実施形態のデータ管理システム、データ管理方法およびプログラムを、図面を参照して詳細に説明する。
実施形態のデータ管理システムは、大規模データを効率よく管理・検索するためのシステムである。データベース管理システムにみられるような大規模データを管理する従来のシステムは、一般的に、下位層としてディスクアクセスなどを最適化するデータ配置機構、上位層として検索条件に基づいて大規模データを高速検索するための索引機構が搭載されている。索引のアルゴリズムには、Bツリーなどの木構造アルゴリズムや、一般的なハッシュアルゴリズムが主に用いられている。
データベースで利用できる検索条件は、多くの場合、実数・整数・文字列・日付などの基本型(以下、これらを総称して「DB基本型」と呼ぶ)に関する四則演算・集合演算などで構成された論理式である。ベクトルやビット列(すなわち二値ベクトル)同士の類似性については、一部の例外を除き、通常、検索条件として用いることができない。その背景には、ベクトルの類似度計算を含む検索条件を効率化する索引が考案されていないことがある。
上述の一部の例外とは、低次元ベクトルを対象とした類似度計算である。多くの著名なデータベース管理システムでは、主に時空間データを管理する用途を想定して、2〜4次元程度の低次元のベクトルの類似度計算を検索条件に含めることができるようになっている。この類似度計算の実現には、空間木(空間分割法)と呼ばれる索引手法が用いられており、これにより高速な検索が可能である。ただしベクトルが低次元でない場合は、索引サイズの肥大化によって高速化の効果が失われ、実行時間が通常の線形検索と変わらなくなることが知られている。実施形態で想定する特徴ベクトルは、例えば機械学習用途を想定した数百〜数億次元の高次元ベクトルであるため、空間木による方法を用いても高速な検索は実現できない。
しかし、高次元ベクトルの完全一致を高速照合することは可能である。この場合、2つのベクトルの各次元の要素に対する等号条件をANDで結合した条件で検索することと等価である。すなわち、この検索条件はスカラ演算のみで構成されており、ベクトルの類似度計算は含まれていないため、Bツリーなどの索引を利用できる。
以上のように、従来の一般的なデータベース管理システムは、DB基本型で構成された検索条件での大規模データの高速検索が可能であるが、低次元でないベクトル間の類似度計算を含むベクトル近傍検索を高速実行することはできない。そこで、以下に示す実施形態では、ベクトル近傍検索の計算量を削減することでベクトル近傍検索の高速実行を可能とし、データ検索の実行時間を短縮できる新規なデータ管理システムを提案する。
なお、ベクトル間の類似度を表す指標としては内積と距離がある。ベクトル間の内積値を求める内積計算とベクトル間の距離を求める距離計算は、意味としても計算量としてもほぼ同じである。2つのベクトルが類似している場合、内積値は大きくなるが、距離は小さくなるという点が異なるだけである。つまり、ベクトル間の内積値が大きいことと、ベクトル間の距離が小さいことは、ともにベクトル間の類似度が高いことを意味する。以下では、ベクトル間の類似度を距離で表すものとして説明するが、距離を内積に置き換えてもよい。この場合、ベクトル間の距離が小さいほど、つまり、ベクトル間の類似度が高いほど、内積値が大きくなるものと考えればよい。
ベクトル近傍検索の計算量を削減する方法として、LSH(Locality-Sensitive Hashing)を用いることが考えられる。LSHは、与えられたベクトル群を、離散値のみを取る縮約ベクトル空間に写像する技術である(例えば、下記の参考文献1参照)。このLSHによる写像は、写像前の空間におけるベクトル間の距離の相対的な大きさが、写像後の空間においてもよく保存されているという性質がある。したがって、写像前のベクトル空間でベクトル間距離を計算する代わりに、写像後のベクトル空間でベクトル間距離を計算することで、計算を効率化することができる。ただし、距離の大小関係を完全に保存するわけではないため、得られるのは近似解である。
参考文献1:Anshumali Shrivastava and Ping Li,“Asymmetric LSH(ALSH) for Sublinear Time Maximum Inner Product Search(MIPS)”,Advances in Neural Information Processing Systems,2014.
LSHアルゴリズムとしては、これまでに、例えば、下記の参考文献2に示されるSimHash(Random projection)や、下記の参考文献3に示されるSpectral Hashingなど、様々なアルゴリズムが考案されている。
参考文献2:Moses S.Charikar,“Similarity Estimation Techniques from Rounding Algorithms”,Proceedings of the 34th Annual ACM Symposium on Theory of Computing,pp.380?388,doi:10,1145/509907,509965.
参考文献3:Yair Weiss,Antonio Torralba and Rob Fergus,“Spectral Hashing”,Advances in neural information processing systems,2009.
LSHアルゴリズムは、大きく、ビットワイズ方式と直積量子化(Product Quantization)方式とに二分できる。ビットワイズ方式のアルゴリズムは、与えられたベクトルに対する写像結果として二値ベクトルを出力する。一方、直積量子化方式のアルゴリズムは、与えられたベクトルに対する写像結果として整数ベクトル(整数の要素からのみ構成される多値ベクトル)を出力する。また、直積量子化方式のアルゴリズムの場合、ベクトルの各次元ごとに、距離に対する重みに相当する情報(各次元の変化に対してベクトルの距離がどれくらい変化するか)も合わせて生成される。
上述のように、LSHによって写像されたベクトルを用いることで、ベクトル間距離の計算を効率化することができる。特に二値ベクトルの場合、距離計算処理に、xorなどのビット演算命令、あるいはpopcountなどの専用CPU命令を用いることができるため、大幅な計算量削減が可能である。
しかし、LSHを用いたとしても、ベクトル間距離の計算そのものを回避することはできない。従来のデータベース管理システムでは、上述のように、低次元でないベクトルの距離計算を伴う検索処理に対して有効な索引アルゴリズムが考案されていないため、線形検索を行う必要があり、計算量オーダーをサブリニアにすることができない。その結果、検索対象となる事例ベクトルの数が例えば1億など大規模な場合には、大きな検索時間を要することとなる。そこで、低次元でないベクトルの距離計算を伴う検索処理に対して有効な索引アルゴリズムを導入した新規なデータ管理システムを提案する。
ここで、実施形態の基本原理を説明する。実施形態のデータ管理システムは、まず事前処理として、各事例ベクトルのそれぞれについて、事例ベクトルに類似するベクトル、つまり事例ベクトルに対する距離が所定値以下のベクトル(以下、これを「周辺ベクトル」と呼ぶ)群を生成するとともに、周辺ベクトルから事例ベクトルを特定するための索引情報を構築し、事例ベクトルを含むデータと索引情報とをデータベースに保存する。そして、検索時には、索引情報に基づいて、クエリベクトルと完全一致する周辺ベクトルに対応する事例ベクトルを特定し、特定した事例ベクトルに基づいて、検索要求に対する検索結果を出力する。
事前処理で事例ベクトルに類似する周辺ベクトルを合理的に生成するには、取り扱うベクトルの次元数および各要素値集合のカーディナリティがいずれも小さい必要がある。この条件が満たされなければ、周辺ベクトル数が爆発し、結果として検索時間を短縮できない。この条件を達成するために、上述したLSHを用いる。LSHにより生成されるベクトルの要素は、ビットワイズ方式の場合は二値、直積量子化方式の場合は多値を持つ離散値を取り、LSHの設定にもよるが、多くの場合、要素値集合のカーディナリティおよび次元数が小さい離散ベクトル(縮約ベクトル)が生成される。したがって、基本原理として説明した上述の方法を実行する前に、LSHを用いて事例ベクトル群およびクエリベクトルを縮約ベクトルに変換しておき、これらを用いて、基本原理として説明した上述の方法による検索を行えばよい。ただし、LSHを用いるため、検索結果は近似解となる。
なお、事例ベクトル群やクエリベクトルが元々上記条件を満たすベクトルであるならば、LSHを用いたベクトル変換を事前に行う必要はなく、基本原理として説明した上述の方法のみを実行すればよい。
また、基本原理として説明した上述の方法では、事例ベクトルに対する距離が所定値以下の周辺ベクトルを生成したが、クエリベクトルに対する距離が所定値以下の周辺ベクトルを生成する構成としてもよい。この場合、検索時に、クエリベクトルに対する距離が所定値以下の周辺ベクトルを生成して、周辺ベクトルと完全一致する事例ベクトルを特定し、特定した事例ベクトルに基づいて、検索要求に対する検索結果を出力する。
以下では、ベクトル間距離の計算が検索条件に含まれるクエリを処理してメディア検索を行うデータ管理システムへの適用例について具体的に説明する。メディア検索の応用題材としては、顔画像(映像含む)検索を取り上げる。顔画像検索は、システムに予め登録された画像・映像などのメディア群の中から、クエリとして与えられた画像・映像に含まれる顔と似た顔を含む画像・映像の箇所を見つけ出す処理である。なお、ここでは応用題材として顔画像検索を取り上げるが、実施形態のデータ管理システムは、例えば、音楽検索、物体画像検索、シーン画像検索、テキスト意味検索、センサパタン検索、株価パタン検索、電力使用パタン検索など、様々なメディア検索やセンサデータ検索に応用することができる。
<第1実施形態>
まず、第1実施形態のデータ管理システムについて説明する。本実施形態では、写像処理にはビットワイズLSHを用いるものとし、写像後の二値ベクトル(ハッシュ)間の距離としてハミング距離を用いるものとする。ただし、上述したように、取り扱う事例ベクトルおよびクエリベクトルが元々低次元の二値ベクトルであるならば、ビットワイズLSHによる写像は不要であり、後述の事例ハッシュ(縮約事例ベクトル)として事例ベクトルをそのまま用い、クエリハッシュ(縮約クエリベクトル)としてクエリベクトルをそのまま用いればよい。また、この場合、後述の周辺ハッシュ(縮約周辺ベクトル)として、事例ベクトルを元に生成される周辺ベクトルを用いればよい。
図1は、第1実施形態のデータ管理システムの概要を示すシステム構成図である。本実施形態のデータ管理システムは、図1に示すように、データ登録器100と、索引構築器200と、検索器300と、データベース400とを備える。
データ登録器100は、顔を含む画像や映像などのメディアデータ群10を外部から受け取り、受け取ったメディアデータ群10を対象として顔に関する解析を行い、顔特徴に関する特徴ベクトル(事例ベクトル)群を含むデータテーブル20をデータベース400内に生成する。
索引構築器200は、索引構築命令文30を外部から受け取ると、受け取った索引構築命令文30に対応するデータテーブル20をデータベース400から取り出し、索引構築命令文30の命令に従って、顔特徴ベクトルの索引として用いる索引情報40をデータベース400内に生成する。
検索器300は、顔特徴に関するクエリベクトルを含む拡張SQL50(検索要求の一例)を外部から受け取ると、データベース400から該当するデータテーブル20および索引情報40を取得し、拡張SQL50に含まれるクエリベクトルと類似する顔特徴ベクトルが含まれる検索結果データセット60を出力する。
まず、データ登録器100の詳細を説明する。図2は、データ登録器100がデータベース400内に生成するデータテーブル20の具体例を示す図である。データ登録器100が外部から受け取るメディアデータ群10に含まれるメディアデータは、dir/a.jpg、dir/b.jpg、dir/a.mpgの3種類のファイルであるものとする。このうち、dir/a.jpg、dir/b.jpgは静止画ファイルであり、dir/a.mpgは動画ファイルである。
データ登録器100は、外部からメディアデータ群10を受け取ると、このメディアデータ群10に含まれるメディアデータそれぞれについて、以下に示す処理を実行する。
図3は、メディアデータが静止画である場合のデータ登録器100による処理手順の一例を示すフローチャートである。データ登録器100は、メディアデータが静止画である場合、例えば以下のステップS101〜ステップS105の処理を実行して、メディアデータをデータテーブル20に登録する。
ステップS101:データ登録器100は、入力された静止画に対して顔領域抽出処理を行う。この結果、入力された静止画から、顔が写っている可能性の高い画像領域(顔画像領域)がすべて抽出される。なお、顔領域抽出処理は既存技術を用いればよいため、ここでは詳細な説明を省略する。
ステップS102:データ登録器100は、ステップS101で抽出した顔画像領域を順に取り出す。
ステップS103:データ登録器100は、ステップS102で取り出した顔画像領域に対して特徴生成処理を行って特徴ベクトル(事例ベクトル)を得る。なお、特徴生成処理には既存技術を用いればよいため、ここでは詳細な説明を省略する。
ステップS104:データ登録器100は、ステップS103で得られた特徴ベクトル、入力された静止画に与えられたメディアデータ名、顔画像領域の座標の3つの情報を含むレコードをデータテーブル20に追加する。
ステップS105:データ登録器100は、ステップS101で抽出した顔画像領域をすべて取り出したか否かを判定する。そして、判定の結果がNoであればステップS102に戻って以降の処理を繰り返し、判定の結果がYesであれば処理を終了する。
図4は、メディアデータが動画である場合のデータ登録器100による処理手順の一例を示すフローチャートである。データ登録器100は、メディアデータが動画である場合、例えば以下のステップS201〜ステップS212の処理を実行して、メディアデータをデータテーブル20に登録する。
ステップS201:データ登録器100は、入力された動画から先頭フレーム画像を取り出す。
ステップS202:データ登録器100は、ステップS201で取り出した先頭フレーム画像に対して顔領域抽出処理および特徴生成処理を行う。この結果、顔が写っている可能性の高い画像領域(顔画像領域)が確信度付ですべて抽出され、それぞれの顔画像領域から特徴ベクトルが得られる。
ステップS203:データ登録器100は、入力された動画から次のフレーム画像を取り出す。
ステップS204:データ登録器100は、ステップS203で取り出したフレーム画像に対して、ステップS202と同様の顔領域抽出処理および特徴生成処理を行う。
ステップS205:データ登録器100は、当該フレームについて、前フレームとの間で顔追跡処理を行う。顔追跡処理とは、フレーム間で画像と領域座標が類似する顔画像領域のペアを見つけ出し、これらを同一被写体と解釈する処理である。なお、顔追跡処理は既存技術を用いればよいため、ここでは詳細な説明を省略する。
ステップS206:データ登録器100は、ステップS205の顔追跡処理の結果、同一被写体と判定された顔画像領域を同一グループとして束ねる。
ステップS207:データ登録器100は、次のフレームがあるか否かを判定する。そして、判定の結果がYesであればステップS203に戻って以降の処理を繰り返し、NoであればステップS208に進む。
ステップS208:データ登録器100は、以上の処理により生成されたグループを順に取り出す。
ステップS209:データ登録器100は、ステップS208で取り出したグループに含まれるフレームのうち、最も早く出現したフレームの出現時刻である第1出現時刻と、最も遅く出現したフレームの出現時刻である第2出現時刻とを取得する。
ステップS210:データ登録器100は、ステップS208で取り出したグループに含まれるフレームのうち最も確信度の高いフレームの出現時刻である第3出現時刻と、特徴ベクトルと、顔画像領域の座標とを取得する。
ステップS211:データ登録器100は、ステップS209で取得した第1出現時刻および第2出現時刻と、ステップS210で取得した第3出現時刻、特徴ベクトル、および顔画像領域の座標と、入力された動画に与えられたメディアデータ名との6つの情報を含むレコードをデータテーブル20に追加する。
ステップS212:データ登録器100は、生成されたグループをすべて取り出したか否かを判定する。そして、判定の結果がNoであればステップS208に戻って以降の処理を繰り返し、判定の結果がYesであれば処理を終了する。
次に、索引構築器200の詳細を説明する。索引構築器200がデータベース400内に生成する索引情報40は、特徴ベクトルを列に持つデータテーブル20に対するベクトル近傍検索を高速化するための補助情報である。索引構築器200は、入力された索引構築命令文30のタイプに応じて、LSH即値索引情報とLSH近傍展開索引情報との2種類の索引情報40を生成することができる。この索引情報40には、後述するテーブルデータとデータベース索引(Bツリーなど)が含まれる。
索引構築器200は、データテーブル20の特徴ベクトルを格納する同一の行に対してハッシュのビット長の指定が異なる複数の索引構築命令文30を実行することにより、複数の索引情報40を構築することができる。例えば、ビット長が短いハッシュを用いた索引情報40とビット長が長いハッシュを用いた索引情報40との2種類を構築しておけば、精度より速度を重視した検索を行う場合は前者の索引情報40を用い、速度より精度を重視した検索を行う場合は後者の索引情報40を用いるといったように、検索時に用途に応じた使い分けができるようになる。
図5は、索引構築器200の構成例を示すブロック図である。索引構築器200は、図5に示すように、索引構築命令タイプ分類器210と、LSH即値索引情報生成器220と、LSH近傍展開索引情報生成器230とを備える。
索引構築命令タイプ分類器210は、索引構築器200に入力された索引構築命令文30を、そのタイプに応じて、LSH即値索引情報作成器220とLSH近傍展開索引情報生成器230とのいずれかに受け渡すスイッチャである。
索引構築器200に入力される索引構築命令文30は、例えば、以下のような構成の命令文である。ただしxxxx部には何らかの値が入る。
Table:xxxx,Column:xxxx,Algo:xxxx,BitLen:xxxx,HammingDist:xxxx
上記構成の索引構築命令文30は、Table項目で、索引情報40の対象となるデータテーブル20のテーブル名が指定され、Column項目で、索引情報40の対象となるデータテーブル20内の列名が指定される。この列名が示すデータテーブル20内の列には、特徴ベクトルが格納されている必要がある。
また、Algo項目では、索引情報40の生成に用いるLSHアルゴリズムのアルゴリズム名が指定される。アルゴリズム名は、システム内に実装されているLSHアルゴリズムの中から選ばれる。例えば、システム内にSimHashという名前のLSHアルゴリズムとSpectralHashという名前のLSHアルゴリズムのみが実装されているとすれば、これらのいずれかのアルゴリズム名が指定される。本実施形態では、上述したように、ビットワイズLSHを用いるため、ビットワイズLSHのアルゴリズム名が指定される。
Bitlen項目では、Algo項目で選んだLSHアルゴリズムが出力するハッシュのビット長が指定される。HammingDist項目では、LSH近傍展開索引情報生成器230において扱われるハミング距離の上限(後述の周辺ハッシュの範囲)が指定される。例えばHammingDist項目で“2”が指定されている場合、LSH近傍展開索引情報生成器230において扱われるハミング距離は“0”と“1”と“2”である。なお、HammingDist項目は省略してもよい。
索引構築命令タイプ分類器210は、以上のように構成される索引構築命令文30が索引構築器200に入力されると、この索引構築命令文30を、LSH即値索引情報生成器220とLSH近傍展開索引情報生成器230のいずれかに渡す。例えば、索引構築命令タイプ分類器210は、索引構築器200に入力された索引構築命令文30にHammingDist項目がなければ、この索引構築命令文30をLSH即値索引情報生成器220に渡し、HammingDist項目があれば、この索引構築命令文30をLSH近傍展開索引情報生成器230に渡す。
LSH即値索引情報生成器220は、索引構築命令タイプ分類器210から索引構築命令文30を受け取った場合に、この索引構築命令文30に従って、LSH即値テーブルと、このLSH即値テーブルのHashValue列に対するデータベース索引とを含むLSH即値索引情報40Aを生成する。
図6は、LSH即値テーブルの一例を示す図である。LSH即値テーブルは、図6に示すように、HashValue列(型:blob)のみからなるテーブルデータである。LSH即値索引情報生成器220は、索引構築命令文30で指定されたデータテーブル20の各レコードに対して、指定された列に格納される特徴ベクトルを順に取り出し、指定されたLSHアルゴリズムを用いて、指定された出力ビット長のハッシュを生成し、得られた各ハッシュのみを持つレコードをLSH即値テーブルに登録する。
なお、ハッシュは本質的には二値ベクトルであるが、本実施形態ではハッシュをブール値の配列として保存するのではなく、二進数と見立てて整数として保存する。すなわち、LSH即値テーブルのHashValue列は、整数または整数配列(計算機アーキテクチャのビット数上限を超えた場合の処置)を格納するblobである。これにより、保存領域サイズを削減することができる。
なお、このLSH即値テーブルをデータテーブル20に組み込む構成としてもよい。このような構成とすることにより、検索全体の処理においてサブクエリ処理を1回減らすことができる。LSH即値テーブルをデータテーブル20に組み込むためには、上述のデータ登録器100がデータテーブル20を生成する際に、このデータテーブル20にハッシュを格納する列を予め用意しておく必要がある。また、上述したように、データテーブル20の特徴ベクトルを格納する同一の行に対して複数の索引情報40を構築できるようにするためには、データテーブル20内にビット長が異なる複数種類のハッシュを格納する複数の列を確保しておく必要がある。このような構成とした場合、LSH即値索引情報生成器220は、特徴ベクトルを元に生成したハッシュをLSH即値テーブルに登録する代わりに、データテーブル20の該当する列に格納すればよい。
LSH即値索引情報生成器220は、以上のようなLSH即値テーブルの生成と合せて、LSH即値テーブルのHashValue列に対するデータベース索引を構築し、これらをLSH即値索引情報40Aとしてデータベース400内に保存する。
図7は、LSH即値索引情報生成器220による処理手順の一例を示すフローチャートである。LSH即値索引情報生成器220は、索引構築命令タイプ分類器210から索引構築命令文30を受け取ると、例えば以下のステップS301〜ステップS307の処理を実行し、LSH即値テーブルとデータベース索引とを含むLSH即値索引情報40Aをデータベース400に保存する。
ステップS301:LSH即値索引情報生成器220は、データベース400内に、名前:HashValue・型:blobの列のみを持つテーブル(空のLSH即値テーブル)を生成する。なお、テーブル名の形式は「AAAA_BBBB_CCCC_DDDD」とする。ただし、AAAAは処理対象のデータテーブル20のテーブル名、BBBBは処理対象の列の列名、CCCCはLSHアルゴリズムのアルゴリズム名、DDDDはビット長とする。例えば、aTable_feat_SimHash_64といったテーブル名が生成したテーブルに与えられる。
ステップS302:LSH即値索引情報生成器220は、索引構築命令文30で指定されたデータテーブル20から、索引構築命令文30で指定された列の特徴ベクトルを順に取り出す。
ステップS303:LSH即値索引情報生成器220は、ステップS302で取り出した特徴ベクトルに対して、索引構築命令文30で指定されたLSHアルゴリズムを用いて、索引構築命令文30で指定された出力ビット長のハッシュを生成する。
ステップS304:LSH即値索引情報生成器220は、HashValue列の値としてステップS303で得られた事例ハッシュを持つレコードを、LSH即値テーブルに追加する。
ステップS305:LSH即値索引情報生成器220は、処理対象のデータテーブル20から特徴ベクトルをすべて取り出したか否かを判定する。そして、判定の結果がNoであればステップS302に戻って以降の処理を繰り返し、YesであればステップS306に進む。
ステップS306:LSH即値索引情報生成器220は、以上の処理を経て生成されたLSH即値テーブルのHashValue列に対するデータベース索引(Bツリーなど)を構築し、データベース400に保存する。
ステップS307:LSH即値索引情報生成器220は、ハッシュの生成に用いたLSHアルゴリズムのモデルパラメタセットなど(例えばSimHashにおける射影ベクトル群など)があれば、テーブル名と同じファイル名(例えばaTable_feat_SimHash_64)でデータベース400に保存する。
LSH近傍展開索引情報生成器230は、索引構築命令タイプ分類器210から索引構築命令文30を受け取った場合に、この索引構築命令文30に従って、LSH近傍展開テーブルと、このLSH近傍展開テーブルのHashValue列およびHammingDistance列に対するデータベース複合索引(コンポジットインデックス)とを含むLSH近傍展開索引情報40Bを生成する。
図8は、LSH近傍展開テーブルの一例を示す図である。LSH近傍展開テーブルは、図8に示すように、HashValue列(型:blob)、HammingDistance列(型:integer)およびDataRowID列(型:integer)からなるテーブルデータである。LSH近傍展開索引情報生成器230は、索引構築命令文30で指定されたデータテーブル20から特徴ベクトルを取り出し、各特徴ベクトル(事例ベクトル)について、索引構築命令文30で指定されたLSHアルゴリズムおよびビット長に従ってハッシュ(縮約事例ベクトル)を生成する。これを「事例ハッシュ」と呼ぶ。次に、LSH近傍展開索引情報生成器230は、生成した各事例ハッシュについて、索引構築命令文30で指定されたハミング距離以内のハッシュ(縮約周辺ベクトル)群を生成する。ここで生成されるハッシュを「周辺ハッシュ」と呼ぶ。そして、LSH近傍展開索引情報生成器230は、例えば、周辺ハッシュと、周辺ハッシュの事例ハッシュからのハミング距離と、事例ハッシュの元になる事例ベクトルが属するデータテーブル20のレコードの行IDとの3つ組からなるレコードを、LSH近傍展開テーブルに登録する。
なお、本実施形態では、後述のデータベース索引LSH検索処理において、検索条件として用いるハミング距離を0から順次インクリメントして検索結果を追加する処理を行う。このため、LSH近傍展開テーブルの第2列にHammingDistance列を設け、周辺ハッシュの事例ハッシュからのハミング距離をこのHammingDistance列に格納している。しかし、検索時にLSH近傍展開テーブルの距離上限を検索条件として用いて検索を行う構成とすることも可能である。この場合、LSH近傍展開テーブルにHammingDistance列を設ける必要はない。このような構成とした場合は、後述のデータベース索引LSH検索処理において、出力する検索結果データセットの件数をハミング距離を利用して制御することはできなくなるが、LSH近傍展開テーブルのサイズを小さくできる効果がある。また、このような構成とした場合は、LSH近傍展開テーブルのHashValue列およびHammingDistance列に対するデータベース複合索引を構築する代わりに、LSH近傍展開テーブルのHashValue列に対するデータベース索引を構築すればよい。
また、図8に示したLSH近傍展開テーブルには、HashValue列に格納される周辺ハッシュの値として重複した値が多く含まれているため、正規化を行うことでコンパクト化することができる。
図9は、図8に示したLSH近傍展開テーブルを2つに分割することで正規化した例を示す図である。LSH近傍展開テーブルを図9のような構成とした場合、後述のデータベース索引LSH検索処理において、HashValueとHammingDistanceに関する検索条件を用いて図9(a)のテーブルの行IDを確定し、当該行IDを元に生成した図9(b)のテーブルのTable1_RowIDに関する検索条件を用いてDataRowIDを見つければよい。なお、図9(b)のテーブルの第1列であるTable1_RowIDが図9(a)のテーブルの対応する行の行IDを格納しており、このリンクを用いて図9(a)のテーブルと図9(b)のテーブルとを結合(JOIN)すれば、図8に示したLSH近傍展開テーブルになる。
また、図9(a)のテーブルと図9(b)のテーブルのそれぞれを、連想配列を用いて実装してもよい。連想配列として実装する場合、図9(a)の連想配列のキーはHashValueとHammingDistanceを組み合わせたものであり、値は1つ以上の行IDである。また、図9(b)の連想配列のキーはTable1_RowIDであり、値は1つ以上のDataRowIDである。
図10は、LSH近傍展開テーブルのHashValue列およびHammingDistance列に対するデータベース複合索引の一例を示す図である。このデータベース複合索引は、図10に示すように、HashValueおよびHammingDistanceの値に沿って分岐する木構造となっており、葉に該当するLSH近傍展開テーブルの行IDが記載されている。このデータベース複合索引を用いることで、検索時間を0(N)から0(log(N))に短縮させることができる。
なお、データベース複合索引の構成を少し変更することで、LSH近傍展開テーブルを不要とすることもできる。具体的には、データベース複合索引の葉に、LSH近傍展開テーブルの行IDを格納する代わりにDataRowIDの値を格納する構成とする。これにより、DataRowIDしか検索できなくなるが、LSH近傍展開テーブルをデータベース400に保存しておく必要がなくなる。この場合、LSH近傍展開索引情報40Bはデータベース複合索引のみとなる。
図11は、LSH近傍展開索引情報生成器230による処理手順の一例を示すフローチャートである。LSH近傍展開索引情報生成器230は、索引構築命令タイプ分類器210から索引構築命令文30を受け取ると、例えば以下のステップS401〜ステップS410の処理を実行し、LSH近傍展開テーブルとデータベース複合索引とを含むLSH近傍展開索引情報40Bをデータベース400に保存する。
ステップS401:LSH近傍展開索引情報生成器230は、データベース400内に、名前:HashValue・型:blobの列と、名前:HammingDistance・型:integerの列と、名前:DataRowID・型:integerの列とを持つテーブル(空のLSH近傍展開テーブル)を生成する。なお、テーブル名の形式は「AAAA_BBBB_CCCC_DDDD」とする。ただし、AAAAは処理対象のデータテーブル20のテーブル名、BBBBは処理対象の列の列名、CCCCはLSHアルゴリズムのアルゴリズム名、DDDDはビット長とする。例えば、aTable_feat_PQ_3といったテーブル名が生成したテーブルに与えられる。
ステップS402:LSH近傍展開索引情報生成器230は、索引構築命令文30で指定されたデータテーブル20から、索引構築命令文30で指定された列の特徴ベクトルを順に取り出す。
ステップS403:LSH近傍展開索引情報生成器230は、ステップS402で取り出した特徴ベクトル(事例ベクトル)に対して、索引構築命令文30で指定されたLSHアルゴリズムを用いて、索引構築命令文30で指定されたビット長の事例ハッシュを生成する。
ステップS404:LSH近傍展開索引情報生成器230は、ステップS403で得られた事例ハッシュからの距離が指定距離以下の周辺ハッシュをすべて生成する。
ステップS405:LSH近傍展開索引情報生成器230は、ステップS404で得られた周辺ハッシュを順に取り出す。
ステップS406:LSH近傍展開索引情報生成器230は、ステップS405で取り出した周辺ハッシュ、この周辺ハッシュの事例ハッシュからのハミング距離、事例ハッシュの元になる事例ベクトルが属するデータテーブル20内のレコードの行IDの3つ組からなるレコードを、LSH近傍展開テーブルに追加する。
ステップS407:LSH近傍展開索引情報生成器230は、ステップS404で得られた周辺ハッシュをすべて取り出したか否かを判定する。そして、判定の結果がNoであればステップS405に戻って以降の処理を繰り返し、YesであればステップS408に進む。
ステップS408:LSH近傍展開索引情報生成器230は、処理対象のデータテーブル20から特徴ベクトルをすべて取り出したか否かを判定する。そして、判定の結果がNoであればステップS402に戻って以降の処理を繰り返し、YesであればステップS409に進む。
ステップS409:LSH近傍展開索引情報生成器230は、以上の処理を経て生成されたLSH近傍展開テーブルのHashValue列およびHammingDistance列に対するデータベース複合索引(コンポジットインデックス)を構築し、データベース400に保存する。
ステップS410:LSH近傍展開索引情報生成器230は、事例ハッシュの生成に用いたLSHアルゴリズムのモデルパラメタセットなどがあれば、テーブル名と同じファイル名(例えばaTable_feat_PQ_3)でデータベース400に保存する。
ここで、上記ステップS404における周辺ハッシュの生成方法の具体例について説明する。以下では、周辺ハッシュの起点となる事例ハッシュのビット列が“010”であるものとし、ハミング距離2以内の周辺ハッシュを列挙するという設定例で説明する。
まず、ハミング距離0の周辺ハッシュは、事例ハッシュと同じハッシュである。すなわち、事例ハッシュのビット列が“010”であれば、この事例ハッシュに対してハミング距離0の周辺ハッシュは“010”のみである。
次に、ハミング距離1の周辺ハッシュは、事例ハッシュの任意のビットを1つだけ反転させたものである。事例ハッシュのビット長が3であれば、反転させるビットの選択方法は、第1ビットのみ、第2ビットのみ、第3ビットのみの3種類である。事例ハッシュのビット列が“010”であれば、各選択方法でビット反転を行った結果は“110”、“000”および“011”である。これら3つのハッシュが、事例ハッシュ“010”に対してハミング距離が1の周辺ハッシュである。
次に、ハミング距離2の周辺ハッシュは、事例ハッシュの任意のビットを2つ反転させたものである。事例ハッシュのビット長が3であれば、反転させるビットの選択方法は、第1ビット+第2ビット、第1ビット+第3ビット、第2ビット+第3ビットの3種類である。事例ハッシュのビット列が“010”であれば、各選択方法でビット反転を行った結果は“100”、“111”および“001”である。これら3つのハッシュが、事例ハッシュ“010”に対してハミング距離が2の周辺ハッシュである。
以上をまとめると、事例ハッシュ“010”に対するハミング距離0の周辺ハッシュは“010”、ハミング距離1の周辺ハッシュは“110”、“000”および“011”、ハミング距離2の周辺ハッシュは“100”、“111”および“001”である。このように、低コストな処理で周辺ハッシュをすべて生成することができる。
なお、以上の方法により事例ハッシュに対する周辺ハッシュを生成する際、ビットの重要度などを元に、反転を許可するビットを制限する仕組みを備えてもよい。例えば、上記参考文献3のように主成分分析をベースとしたハッシュ生成法の場合、各ビットに対応する固有値から当該ビットの弁別性(重要度)を割り出すことができる。事例ハッシュにおける弁別性の高いビットを反転して生成した周辺ハッシュは、弁別性が失われた周辺ハッシュとなるため、このような周辺ハッシュをLSH近傍展開テーブルに追加してもヒットする確率が低いと考えられる。したがって、このような弁別性の高いビットは反転させないように制限を加えるようにしてもよい。このように、反転を許可するビットを制限することにより、LSH近傍展開テーブルの記憶領域サイズを小さくすることができる。
LSH近傍展開テーブルは、検索キーとなる列と検索結果となる列が決まっているため、連想配列(キーバリューストア、C++標準ライブラリであればstd::mapやstd::unordered_mapなど)で簡潔に実装することができる。
すなわち、検索結果はDataRowIDであるため、連想配列の値としてDataRowIDの可変長の連続メモリ配置型配列(C++標準ライブラリであればstd::vectorなど)を用いる。検索条件はHashValueとHammingDistanceのANDであるため、これら2つの値を用いてユニークになる連想配列のキーを生成する。図8に例示したLSH近傍展開テーブルの場合、HashValue列は二進数表記で“000”〜“111”の値を取り、HammingDistanceは“0”〜“1”の値を取るので、キー値を以下の算出式で決定するなどが考えられる。
キー値=HashValue列の値×2+HammingDistance列の値
図12は、連想配列と連続メモリ配置型配列を説明する図である。連想配列は、キーから値へ対応付ける方法として、図12(a)に示すように、データベース索引のように木やハッシュなどのデータ構造を内部に持つ。上記のキーが定義域においてほぼ充当されているならば、連想配列の代わりに、図12(b)に示すような連続メモリ配置型配列(C++標準ライブラリであればstd::vectorなど)を用いてもよい。連続メモリ配置型配列として確保する要素数は、HashValueとHammingDistanceの全組合せ数とする。連続メモリ配置型配列を用いたデータ構造は、連想配列を用いたデータ構造と比べ、キーの充当率が高い場合に限りメモリ使用量が低減され、さらに処理速度が高速化される。
次に、検索器300の詳細を説明する。この検索器300の機能概要および特徴は以下の通りである。この検索器300では、拡張SQL50を用いて、ベクトル類似性に関する0個以上の条件を含む論理条件でのレコード検索ができる。これにより、データベース利用者は、一般的なデータ照合と特徴ベクトル類似性判定とを条件として結び付けた論理式での検索が行えるようになる。
また、ベクトル類似性判定(ベクトル近傍検索)の処理は、検索対象のレコード数に応じて、5種類の方式を内部的に切り替えることができる。この切り替えは事前に設定されたシステム設定に基づいて行われる。5種類の方式には速度、精度、件数制御の有無について長短がある。これら5種類の方式の1つであるデータベース索引LSH検索は、クエリに対して、検索時にベクトル距離計算を行わずデータベース索引のみを用いてベクトル類似性判定(ベクトル近傍検索)を実現する方式である。この方式は、検索時間を大幅に削減する効果を持つ。
図13は、検索器300の構成例を示すブロック図である。検索器300は、拡張SQL50を入力として受け取り、拡張SQL50に従った検索処理を実行して検索結果データセット60を出力するものであり、図13に示すように、検索条件処理部310と、検索出力部320とを備える。検索条件処理部310は、内部に様々な検索条件に対する処理を行う機能モジュールを持つ。このうち、特に本実施形態に特徴的なベクトル類似性に関する検索条件に対する処理を行う機能モジュールがベクトル類似性判定処理部330である。また、それ以外の検索条件に対する処理を行う機能モジュールを、他の検索条件処理部340と総称する。検索条件処理部310は、これらベクトル類似性判定処理部330の検索結果と他の検索条件処理部340との集合演算を行い、検索条件全体の処理を完成させる。検索出力部320は、検索条件処理部310の処理の結果に基づいてデータベース400からレコードを取り出し、検索結果データセット60として出力する。
なお、検索器300による検索処理の大半は従来のSQLの検索処理と同様であり、検索条件処理部310がSQLにおけるfrom命令部(データソースの特定処理)およびwhere命令部(検索条件処理)にあたり、検索出力部320がSQLにおけるselect命令部にあたる。本実施形態における固有の処理は、検索条件処理部310の中の1つであるベクトル類似性判定処理部330が実行する処理である。このため、以下ではベクトル類似性判定処理部330を中心に説明し、従来技術をそのまま適用できる部分については適宜説明を省略する。
まず、検索器300が入力として受け取る拡張SQL50について説明する。拡張SQL50は、従来のSQLに、ベクトル類似性に関する条件にあたるvnn関数を記述できるよう拡張した問合せ言語である。vnn関数は、以下の例のように、where命令内で一般的なDB基本型データへの条件群と組合せ可能な項として用いる。
select * from aTable where vnn(feat_simhash_64,(10,20,30),10) and annualIncome > 10000000
vnn関数の仕様は以下の通りである。
入力:vnn関数が検索対象とするデータセットを入力とする。この入力は、検索条件処理部310が内部的に生成してvnn関数を呼び出す際に渡す。通常の構文であれば、from命令で指定されたテーブルの全レコード群である。
第1引数:第1引数は、事例ベクトル(検索対象とする特徴ベクトル)を格納する列名と、その列に適用されているLSHアルゴリズムのアルゴリズム名と、その列に適用されているLSHアルゴリズムの出力ビット長(後述の第3実施形態ではより一般化してオプションパラメタとしている)とをアンダースコアで結んだテキストである。
第2引数:第2引数は、クエリベクトルである。
第3引数:第3引数は、出力上位件数(出力対象とするベクトルの上位件数)である。ただし、クエリベクトルとの距離の小さいベクトルを上位とみなすものとする。
出力:検索条件処理部310(from,whereなどの処理)に対して、引数で示された条件に合致する検索結果を返す。
なお、ここでは出力条件にあたる第3引数として出力上位件数を与えるものとしているが、これに代えて距離上限を第3引数として与えるようにしてもよい。
図14は、ベクトル類似性判定部330の入出力関係を示す図である。ベクトル類似性判定部330は、図14に示すように、検索対象データセット70を入力として受け取り、vnn関数で表現された検索条件に基づくベクトル類似性判定(ベクトル近傍検索)処理を行って、検索結果80を返す。本実施形態では、ベクトル類似性判定部330による検索方式として、厳密検索(Strict Search)と、線形LSH検索(Linear LSH Search)と、データベース索引LSH検索(DB-Indexed LSH Search)と、データベース索引LSH検索+厳密検索と、データベース索引LSH検索+線形LSH検索との5種類が用意されている。
厳密検索は、元のクエリベクトルをそのまま用いて、クエリベクトルに類似する事例ベクトルを線形検索する検索方式である。線形LSH検索は、LSH即値索引情報40Aを用いて、クエリハッシュに完全一致する事例ハッシュに対応する事例ベクトルを線形検索する検索方式である。データベース索引LSH検索は、LSH近傍展開索引情報40Bを用いて、クエリハッシュに完全一致する周辺ハッシュに対応する事例ベクトルを検索する検索方式である。データベース索引LSH検索+厳密検索は、データベース索引LSH検索により件数を絞り込んだ後に厳密検索を行う2段階絞込方式の検索方式である。データベース索引LSH検索+線形LSH検索は、データベース索引LSH検索により件数を絞り込んだ後に線形LSH検索を行う2段階絞込方式の検索方式である。これら5種類の方式による検索は、それぞれ、図13に示した厳密検索器331、線形LSH検索器332、データベース索引LSH検索器333、データベース索引LSH検索+厳密検索器334およびデータベース索引LSH検索+線形LSH検索器335により行われる。
また、本実施形態では、ベクトル類似性判定処理部330が、事前に与えられた検索方式設定情報90(図13参照)に基づいて、上記の5種類の検索方式のいずれかを検索対象のレコード数に応じて選択するものとする。検索方式設定情報90は、以下のような複数行からなる文法となっている。件数条件が上から照合され、マッチした検索方式が採用される。
件数条件:検索方式
件数条件:検索方式
・・・
otherwise:検索方式
件数条件には、“<=NNNN”(ただしNNNNは任意の正数)または“otherwise”を記述することができる。“<=NNNN”は検索対象となる事例ベクトルの数がNNNN件以下の場合にマッチする。“otherwise”はあらゆる件数にマッチする。“otherwise”は検索方式設定情報90内に必ず1行含まれている必要がある。
検索方式には、“Strict”(厳密検索)、“LinearLSH”(線形LSH検索)、“DBIndexedLSH”(データベース索引LSH検索)、“DBIndexedLSH:NNNN/Strict”(データベース索引LSH検索+厳密検索)および“DBIndexedLSH:NNNN/LinearLSH”(データベース索引LSH検索+線形LSH検索)の5種類を記述することができる。NNNNには任意の正数を記述することができる。
検索方式設定情報90の記述例を以下に示す。以下に例示する検索方式設定情報90は、検索対象となる事例ベクトルの数が10000件以下なら厳密検索方式が採用され、100000件以下なら線形LSH検索が採用され、それより多い件数ならデータベース索引LSH検索+線形LSH検索方式が採用されることを示している。
<=10000:Strict
<=100000:LinearLSH
Otherwise:DBIndexedLSH:100000/LinearLSH
図15は、ベクトル類似性判定部330による処理手順の一例を示すフローチャートである。ベクトル類似性判定部330は、検索対象データセット70を入力として受け取ると、例えば以下のステップS501〜ステップS507の処理を実行して、検索結果80を出力する。
ステップS501:ベクトル類似性判定部330は、入力された検索対象データセット70のレコード件数(検索対象となる事例ベクトルの数)をカウントする。
ステップS502:ベクトル類似性判定部330は、検索方式設定情報90を参照し、件数条件がステップS501でカウントしたレコード件数とマッチする検索方式を取得する。取得した検索方式がStrictであればステップS503に進み、LinearLSHであればステップS504に進み、DBIndexedLSHであればステップS505に進み、DBIndexedLSH:NNNN/Strict(ただしNNNNは任意の正数)であればステップS506に進み、DBIndexedLSH:NNNN/LinearLSH(ただしNNNNは任意の正数)であればステップS507に進む。
ステップS503:ベクトル類似性判定部330は、厳密検索器331を用いて検索結果80を取得し、取得した検索結果80を出力する。
ステップS504:ベクトル類似性判定部330は、線形LSH検索器332を用いて検索結果80を取得し、取得した検索結果80を出力する。
ステップS505:ベクトル類似性判定部330は、データベース索引LSH検索器333を用いて検索結果80を取得し、取得した検索結果80を出力する。
ステップS506:ベクトル類似性判定部330は、データベース索引LSH検索+厳密検索器334を用いて検索結果80を取得し、取得した検索結果80を出力する。
ステップS507:ベクトル類似性判定部330は、データベース索引LSH検索+線形LSH検索器335を用いて検索結果80を取得し、取得した検索結果80を出力する。
なお、以上の例では検索対象となる事例ベクトルの数に応じて検索方式を切り替えるようにしているが、切り替えるべき検索方式の指定として、ビット長など様々なパラメタ設定も含ませるといった拡張を行うようにしてもよい。例えば16ビットなど短いビット長(すなわち1件当たりの処理時間は小さいが低精度)の線形LHS検索で事例ベクトルの数を100000件に絞り込んだ後、4096ビットなど長いビット長(すなわち1件当たりの処理時間は大きいが高精度)の線形LHS検索で順位付けするなどのプランを作ることができる。その場合の検索方式設定情報90の記述例を以下に示す(@以降にパラメタ設定が列挙される)。
<=100000:LinearLSH@4096
otherwise:LinearLSH@16:100000/LinearLSH@4096
以下では、それぞれの検索方式による検索処理の具体例を説明する。
図16は、厳密検索器331による処理手順の一例を示すフローチャートである。厳密検索器331は、例えば以下のステップS601〜ステップS608の処理を実行して、検索結果80を出力する。
ステップS601:厳密検索器331は、空の検索結果リストを生成する。
ステップS602:厳密検索器331は、vnn関数の第2引数として指定されたクエリベクトルを得る。
ステップS603:厳密検索器331は、検索対象データセット70からレコードを順に取り出す。
ステップS604:厳密検索器331は、ステップS603で取り出したレコードにおいてvnn関数の第1引数として指定された事例ベクトルを格納する列に格納されている事例ベクトル群とクエリベクトルとのユークリッド距離を算出する。
ステップS605:厳密検索器331は、ステップS603で取り出したレコードの行IDとステップS604で算出したユークリッド距離との組を検索結果リストに追加する。ただし、検索結果リストの要素がユークリッド距離昇順で並ぶような位置に挿入する。
ステップS606:厳密検索器331は、検索結果リストに含まれる要素数がvnn関数の第3引数として指定された出力上位件数よりも多い場合、出力上位件数以降の要素群を破棄する。
ステップS607:厳密検索器331は、検索対象データセット70からレコードをすべて取り出したか否かを判定する。そして、判定の結果がNoであればステップS603に戻って以降の処理を繰り返し、YesであればステップS608に進む。
ステップS608:厳密検索器331は、検索結果リストに含まれる行IDの集合を検索結果80として出力し、処理を終了する。
図17は、線形LSH検索器332による処理手順の一例を示すフローチャートである。線形LSH検索器332は、例えば以下のステップS701〜ステップS709の処理を実行して、検索結果80を出力する。
ステップS701:線形LSH検索器332は、空の検索結果リストを生成する。
ステップS702:線形LSH検索器332は、vnn関数の引数として指定されたクエリベクトル、LSHアルゴリズムのアルゴリズム名および出力ビット長を取得して、クエリベクトルのハッシュ(縮約クエリベクトル)を生成する。以下、これを「クエリハッシュ」と呼ぶ。
ステップS703:線形LSH検索器332は、検索対象データセット70のテーブル名、vnn関数の引数として指定された事例ベクトルを格納する列、LSHアルゴリズムのアルゴリズム名および出力ビット長を取得して、これらを元に決定されるテーブル名を持つLSH即値テーブルを取得する。
ステップS704:線形LSH検索器332は、ステップS703で取得したLSH即値テーブルを用いて、検索対象データセット70の各レコードに対応する事例ハッシュを順に取り出す。
ステップS705:線形LSH検索器332は、ステップS704で取り出した事例ハッシュとステップS702で生成したクエリハッシュとのハミング距離を算出する。
ステップS706:線形LSH検索器332は、ステップS704で取り出した事例ハッシュに対応する検索対象データセット70のレコードの行IDとステップS705で算出したハミング距離との組を検索結果リストに追加する。ただし、検索結果リストの要素がハミング距離昇順で並ぶような位置に挿入する。
ステップS707:線形LSH検索器332は、検索結果リストに含まれる要素数がvnn関数の第3引数として指定された出力上位件数よりも多い場合、出力上位件数以降の要素群を破棄する。
ステップS708:線形LSH検索器332は、検索対象データセット70の各レコードに対応する事例ハッシュをすべて取り出したか否かを判定する。そして、判定の結果がNoであればステップS704に戻って以降の処理を繰り返し、YesであればステップS709に進む。
ステップS709:線形LSH検索器332は、検索結果リストに含まれる行IDの集合を検索結果80として出力し、処理を終了する。
なお、上記のステップS702において生成するクエリハッシュは本質的には二値ベクトルであるが、LSH即値テーブルでの保存形式に合わせて、二進数と見立て整数として扱う。これにより、記憶領域を節約できるほか、整数同士の比較となるため照合処理が高速になる。
図18は、データベース索引LSH検索器333による処理手順の一例を示すフローチャートである。データベース索引LSH検索器333は、例えば以下のステップS801〜ステップS810の処理を実行して、検索結果80を出力する。
ステップS801:データベース索引LSH検索器333は、空の検索結果セットを生成する。
ステップS802:データベース索引LSH検索器333は、vnn関数の引数として指定されたクエリベクトル、LSHアルゴリズムのアルゴリズム名および出力ビット長を取得して、クエリハッシュを生成する。
ステップS803:データベース索引LSH検索器333は、検索対象データセット70のテーブル名、vnn関数の引数として指定された事例ベクトルを格納する列、LSHアルゴリズムのアルゴリズム名および出力ビット長を取得して、これらを元に決定されるテーブル名を持つLSH近傍展開テーブルを取得する。
ステップS804:データベース索引LSH検索器333は、ハミング距離条件変数に0を割り当てる。
ステップS805:データベース索引LSH検索器333は、ステップS803で取得したLSH近傍展開テーブルに対して、HammingDistance列の値がハミング距離条件変数の現在値と一致し、かつ、HashValue列の値がステップS802で生成したクエリハッシュと一致するレコード群を検索し、得られた行IDのセットを検索結果セットに追加する。
ステップS806:データベース索引LSH検索器333は、検索結果セットから重複要素を除去する。
ステップS807:データベース索引LSH検索器333は、検索結果セットの要素数がvnn関数の第3引数として指定された出力上位件数以上となっているか否かを判定する。そして、判定の結果がNoであればステップS808に進み、YesであればステップS810に進む。
ステップS808:データベース索引LSH検索器333は、ハミング距離条件変数の値を1追加する。
ステップS809:データベース索引LSH検索器333は、ハミング距離条件変数の値がLSH近傍展開テーブルの距離上限以下か否かを判定する。そして、判定の結果がYesであればステップS805に戻って以降の処理を繰り返し、NoであればステップS810に進む。
ステップS810:データベース索引LSH検索器333は、検索結果セットを検索結果80として出力し、処理を終了する。
なお、上記のステップS802において生成するクエリハッシュは本質的には二値ベクトルであるが、LSH近傍展開テーブルでの保存形式に合わせて、二進数と見立て整数として扱う。これにより、記憶領域を節約できるほか、整数同士の比較となるため照合処理が高速になる。また、LSH近傍展開テーブルの距離上限が100などの大きな値の場合は、上記のステップS808での増分値を10など大きめの値とし、ステップS805でのハミング距離条件に範囲を設けるようにしてもよい。こうすれば反復回数が減るため、検索処理全体を高速化できる。
図19は、データベース索引LSH検索+厳密検索器334による処理手順の一例を示すフローチャートである。データベース索引LSH検索+厳密検索は、データベース索引LSH検索により検索を行った後、その結果について厳密検索による検索を行う2段階絞込方式である。データベース索引LSH検索+厳密検索器334は、例えば以下のステップS901〜ステップS904の処理を実行して、検索結果80を出力する。
ステップS901:データベース索引LSH検索+厳密検索器334は、検索方式設定情報90に記載された検索方式名「DBIndexedLSH:NNNN/Strict」のNNNN部を読み取る。これが、データベース索引LHS検索における出力上位件数目標である。
ステップS902:データベース索引LSH検索+厳密検索器334は、出力上位件数目標の設定でデータベース索引LHS検索器333を呼び出し、検索結果セットを得る。
ステップS903:データベース索引LSH検索+厳密検索器334は、データベース索引LHS検索器333から取得した検索結果セットを検索対象データセット70として厳密検索器331を呼び出し、検索結果リストを得る。
ステップS904:データベース索引LSH検索+厳密検索器334は、厳密検索器331から取得した検索結果リストに含まれる行IDの集合を検索結果80として出力し、処理を終了する。
図20は、データベース索引LSH検索+線形LSH検索器335による処理手順の一例を示すフローチャートである。データベース索引LSH検索+線形LSH検索は、データベース索引LSH検索により検索を行った後、その結果について線形LSH検索による検索を行う2段階絞込方式である。データベース索引LSH検索+線形LSH検索器335は、例えば以下のステップS1001〜ステップS1004の処理を実行して、検索結果80を出力する。
ステップS1001:データベース索引LSH検索+線形LSH検索器335は、検索方式設定情報90に記載された検索方式名「DBIndexedLSH:NNNN/Strict」のNNNN部を読み取る。これが、データベース索引LHS検索における出力上位件数目標である。
ステップS1002:データベース索引LSH検索+線形LSH検索器335は、出力上位件数目標の設定でデータベース索引LHS検索器333を呼び出し、検索結果セットを得る。
ステップS1003:データベース索引LSH検索+線形LSH検索器335は、データベース索引LHS検索器333から取得した検索結果セットを検索対象データセット70として線形LSH検索器332を呼び出し、検索結果リストを得る。
ステップS1004:データベース索引LSH検索+線形LSH検索器335は、線形LSH検索器332から取得した検索結果リストに含まれる行IDの集合を検索結果80として出力し、処理を終了する。
ここで、上述した5種類の検索方式の選択基準について説明する。データ件数をN、特徴ベクトルの次元数をDとするとき、厳密検索、線形LSH検索、データベース索引LSH検索の3つ検索方式の計算コスト(積算相当回数)は以下となる。
厳密検索:N×D
線形LSH検索:N(LSHアルゴリズムの出力ビット長を64以下とした場合)
データベース索引LSH検索:α(データベース索引コスト)
ここで、αはNよりはるかに小さいため、上記3つの検索方式の中ではデータベース索引LSH検索が最も低コストである。
精度については、厳密検索が最も高く、次に線形LSH検索が高く、データベース索引LSH検索が最も低い。近似的手法であるLSHを用いない厳密検索が最も高精度なのは当然だが、仮に同じLSHアルゴリズムを用いていても、線形LSH検索よりもデータベース索引LSH検索のほうが精度が低くなる理由は、データベース索引LSH検索では大きなビット長、ハミング距離を扱えないためである。データベース索引LSH検索は、ハミング距離以下のすべてのハッシュをレコードとして展開するLSH近傍展開テーブルを内部参照する。ハミング距離をH、ビット長をLとするとき、レコード数Sは下記式(1)で表される。
この式(1)から分かるように、大きなハミング距離、ビット長のLSHを扱うと、レコード数が爆発するという問題がある。このため、小さなハミング距離、ビット長のLSHを扱うことになるが、その場合、距離分解能が低下し、実際に出力する件数を要求された出力件数に正確に合わせることが困難となる。この問題は、線形LSH検索、データベース索引LSH検索など、LSHを用いるいずれの検索手法でも起こりえるが、特に小さなハミング距離、ビット長のLSHしか扱えないデータベース索引LSH検索において顕著である。この欠点を解決するには、データベース索引LSH検索+厳密検索や、データベース索引LSH検索+線形LSH検索のように、出力件数を制御しやすい検索方式を2段階目に持つ2段階絞込方式を用いるようにし、1段階目のデータベース索引LSH検索では多めの出力件数で出力し、2段階目の検索で出力件数を要求に正確に合わせるようにすることが有効である。
以上のことから、検索速度を許容範囲内に収めつつなるべく高い精度を得るためには、検索対象データセット70の件数が小規模の場合は厳密検索、検索対象データセット70の件数が中規模の場合は線形LSH検索、検索対象データセット70の件数が大規模の場合は、データベース索引LSH検索+厳密検索、あるいはデータベース索引LSH検索+線形LSH検索を用いることが有効である。
以上、具体的な例を挙げながら詳細に説明したように、本実施形態のデータ管理システムでは、事前処理によってLSH近傍展開索引情報40Bを含む索引情報40を生成し、検索時にはこの索引情報40を用いて、クエリベクトルに完全一致する周辺ベクトルに対応する事例ベクトルを特定するといった計算量の少ない方法でデータテーブル20に対するベクトル近傍検索を行うようにしている。したがって、従来の類似検索において計算量の多くを占めていたベクトル近傍検索の計算量を削減して、データ検索の実行時間を短縮することができる。
<第2実施形態>
次に、第2実施形態のデータ管理システムについて説明する。本実施形態は、検索時にクエリベクトルに対する距離が所定値以下の周辺ベクトルを生成し、周辺ベクトルと完全一致する事例ベクトルを見つける構成とすることで、メモリ使用量の削減およびそれに伴うLSHの精度向上を実現したシステムである。
上述した第1実施形態では、データベース索引LSH検索を実現するために、内部でLSH近傍展開テーブルやデータベース複合索引を用いている。これらの構造データは、上述したように、ハッシュのビット長およびハミング距離上限が大きいとサイズが肥大化する。しかし、データベース400の記憶領域として用いるディスクなどの記憶容量には限界があるため、大きなビット長およびハミング距離上限は扱えない場合がある。そして、十分に大きなビット長やハミング距離が扱えない場合、検索精度の低下を起こす可能性がある。
本実施形態では、第1実施形態のように検索対象となる各事例ベクトルのハッシュ(二値ベクトル)である事例ハッシュの近傍にあるハッシュ(二値ベクトル)である周辺ハッシュ群を列挙する代わりに、クエリベクトルのハッシュ(二値ベクトル)の近傍にあるハッシュ(二値ベクトル)群を周辺ハッシュ群として列挙する方式を取る。この方式の場合、1つのベクトルに対して列挙したハッシュ群を記憶するだけでよいため、記憶容量の限界という問題は解消され、検索精度の低下を起こすリスクが回避される。ただし、第1実施形態と比較してクエリが複雑となるため、第1実施形態よりも検索速度は低下する。
本実施形態のデータ管理システムにおける基本的な枠組みは第1実施形態と同様である。ただし、本実施形態では、検索時にLSH近傍展開索引情報40Bを用いないため、索引構築器200(図5参照)は、LSH即値索引情報40Aを生成するLSH即値索引情報生成器220のみを備えた構成となる。また、検索時にクエリハッシュを起点とした周辺ハッシュを生成するため、検索器300のベクトル類似性判定処理部330における検索方式が第1実施形態とは異なる。以下では、第1実施形態からの主な変更点となる本実施形態の検索方式について説明する。
図21は、本実施形態の検索器300Aの構成例を示すブロック図である。第1実施形態との違いは、ベクトル類似性判定処理部330Aが、図13に示したデータベース索引LSH検索器333、データベース索引LSH検索+厳密検索器334およびデータベース索引LSH検索+線形LSH検索器335に代えて、クエリ摂動型LSH検索器336、クエリ摂動型LSH検索+厳密検索器337およびクエリ摂動型LSH検索+線形LSH検索器338を備える点である。
クエリ摂動型LSH検索+厳密検索器337およびクエリ摂動型LSH検索+線形LSH検索器338については、2段階絞込方式の前段の検索方式がデータベース索引LSH検索からクエリ摂動型LSH検索に代わる他は第1実施形態のデータベース索引LSH検索+厳密検索器334およびデータベース索引LSH検索+線形LSH検索器335と同様である。このため、以下では、クエリ摂動型LSH検索+厳密検索器337およびクエリ摂動型LSH検索+線形LSH検索器338の説明は省略し、クエリ摂動型検索を行うクエリ摂動型LSH検索器336についてのみ説明する。
図22は、クエリ摂動型LSH検索器336による処理手順の一例を示すフローチャートである。クエリ摂動型LSH検索器336は、例えば以下のステップS1101〜ステップS1112の処理を実行して、検索結果80を出力する。
ステップS1101:クエリ摂動型LSH検索器336は、空の検索結果セットを生成する。
ステップS1102:クエリ摂動型LSH検索器336は、vnn関数の引数として指定されたクエリベクトル、LSHアルゴリズムのアルゴリズム名および出力ビット長を取得して、クエリハッシュを生成する。
ステップS1103:クエリ摂動型LSH検索器336は、検索対象データセット70のテーブル名、vnn関数の引数として指定された事例ベクトルを格納する列、LSHアルゴリズムのアルゴリズム名および出力ビット長を取得して、これらを元に決定されるテーブル名を持つLSH即値テーブルを取得する。
ステップS1104:クエリ摂動型LSH検索器336は、ハミング距離条件変数に0を割り当てる。
ステップS1105:クエリ摂動型LSH検索器336は、ステップS1102で生成したクエリハッシュからの距離がハミング距離条件変数の現在地と一致する周辺ハッシュをすべて生成する。
ステップS1106:クエリ摂動型LSH検索器336は、ステップS1105で生成した周辺ハッシュを順に取り出す。
ステップS1107:クエリ摂動型LSH検索器336は、ステップS1103で取得したLSH即値テーブルから、ステップS1106で取り出した周辺ハッシュと同じ値を持つレコード群をすべて取り出し、各レコードの行IDを検索結果セットに追加する。
ステップS1108:クエリ摂動型LSH検索器336は、ステップS1105で生成した周辺ハッシュをすべて取り出したか否かを判定する。そして、判定の結果がNoであればステップS1106に戻って以降の処理を繰り返し、判定の結果がYesであればステップS1109に進む。
ステップS1109:クエリ摂動型LSH検索器336は、検索結果セットから重複要素を除去する。
ステップS1110:クエリ摂動型LSH検索器336は、検索結果セットの要素数がvnn関数の第3引数として指定された出力上位件数以上となっているか否かを判定する。そして、判定の結果がNoであればステップS1111に進み、YesであればステップS1112に進む。
ステップS1111:クエリ摂動型LSH検索器336は、ハミング距離条件変数の値を1追加する。
ステップS1112:クエリ摂動型LSH検索器336は、検索結果セットを検索結果80として出力し、処理を終了する。
以上説明したように、本実施形態のデータ管理システムでは、クエリベクトルに類似する周辺ベクトルを生成し、この周辺ベクトルに完全一致する事例ベクトルを特定するといった計算量の少ない方法でデータテーブル20に対するベクトル近傍検索を行うようにしている。したがって、第1実施形態と同様に、従来の類似検索において計算量の多くを占めていたベクトル近傍検索の計算量を削減して、データ検索の実行時間を短縮することができる。
また、本実施形態では、第1実施形態と比較して記憶容量に対する制約が緩和されることで、比較的大きなビット長およびハミング距離上限を扱うことが可能になるため、ビット長およびハミング距離上限の制限に伴って検索精度の低下を起こすといったリスクが回避される。
<第3実施形態>
次に、第3実施形態のデータ管理システムについて説明する。本実施形態は、ベクトルの写像に用いるLSHの方式が第1実施形態とは異なる。すなわち、第1実施形態では写像処理にビットワイズLSHを用いていたが、本実施形態では、写像処理に直積量子化LSHを用いる。
直積量子化LSHは、与えられたベクトルを整数ベクトル(整数の要素からのみ構成される多値ベクトル)に変換する。この整数ベクトルに対して第1実施形態で示したような索引手法を導入することで、検索時におけるベクトル距離計算を排除することができる。なお、第1実施形態と同様に、取り扱う事例ベクトルおよびクエリベクトルが元々低次元の整数ベクトルであるならば、直積量子化LSHによる写像は不要であり、後述の事例ハッシュとして事例ベクトルをそのまま用い、クエリハッシュとしてクエリベクトルをそのまま用いればよい。また、この場合、後述の周辺ハッシュとして、事例ベクトルを元に生成される周辺ベクトルを用いればよい。
直積量子化LSHの代表的なアルゴリズムは、下記の参考文献4に記載されている。直積量子化LSHとしては、この参考文献4に記載のアルゴリズムを含め、様々なアルゴリズムが提案されている。
参考文献4:Herve Jegou,Matthijs Douze and Cordelia Schmid,“Product quantization for nearest neighbor search”,Pattern Analysis and Machine Intelligence,IEEE Transactions on 33.1(2011):117-128.
直積量子化LSHによるハッシュ生成の代表的な手順は以下の通りである。
(1)まず、与えられた事例ベクトル群が属する空間から、(好ましくは互いに排他的な)部分空間を複数取得する。
(2)各部分空間において、事例ベクトル群を予め定めた数のクラスタに分類する。
(3)各事例ベクトルについて、各部分空間のクラスタ番号を並べた整数ベクトルを生成する。これが写像後のベクトルである。
(4)各クラスタの分布などを用いて、写像後のベクトル間の差異から、写像前のベクトルの距離を近似的に算出するための距離モデルを生成する。
上記の手順(4)で生成される距離モデルはアルゴリズムによって異なるが、いずれの距離モデルであっても、ハッシュである2つの整数ベクトルが与えられたときに、元のベクトル空間での距離を概算できる性質を持つ。また多くのアルゴリズムでは、クラスタ番号が隣接する場合、元のベクトル空間におけるクラスタの分布領域も近接している。次元数は変えず、元のベクトル空間において格子状に並んだ最近傍の点で代表させる格子ベクトル量子化は、最も単純な直積量子化LSHアルゴリズムである。
本実施形態のデータ管理システムにおける基本的な枠組みは第1実施形態と同様である。本実施形態の第1実施形態からの変更点は、整数ベクトルをハッシュとして扱うこと、および、ベクトル間距離としてハミング距離を用いる代わりに直積量子化LSHが提供する距離モデルによって概算できる距離を用いるようにすることである。以下では、これらの変更点について説明する。
図23は、本実施形態の索引構築器200Bの構成例を示すブロック図である。本実施形態の索引構築器200Bは、図23に示すように、第1実施形態の索引構築器200におけるLSH即値索引情報生成器220(図5参照)に代えてPQLSH即値索引情報生成器240を備えるとともに、第1実施形態の索引構築器200におけるLSH近傍展開索引情報生成器230(図5参照)に代えてPQLSH近傍展開索引情報生成器250を備える。
PQLSH即値索引情報生成器240は、索引構築命令タイプ分類器210から索引構築命令文30を受け取った場合に、この索引構築命令文30に従って、PQLSH即値テーブルと、このPQLSH即値テーブルのHashValue列に対するデータベース索引とを含むPQLSH即値索引情報40Cを生成する。PQLSH即値索引情報生成器240が生成するPQLSH即値索引情報40Cは、PQLSH即値テーブルのHashValue列に格納される値が二値ベクトルではなく直積量子化LSHアルゴリズムを用いて生成された整数ベクトルとなる点を除き、第1実施形態で説明したLSH即値索引情報40Aと同様である。このため、PQLSH即値索引情報生成器240については詳細な説明を省略する。
PQLSH近傍展開索引情報生成器250は、索引構築命令タイプ分類器210から索引構築命令文30を受け取った場合に、この索引構築命令文30に従って、PQLSH近傍展開テーブルと、このPQLSH近傍展開テーブルのHashValue列およびDistance列に対するデータベース複合索引(コンポジットインデックス)とを含むPQLSH近傍展開索引情報40Dを生成する。
図24は、PQLSH近傍展開テーブルの一例を示す図である。PQLSH近傍展開テーブルは、図24に示すように、HashValue列(型:blob)、Distance列(型:real)およびDataRowID列(型:integer)からなるテーブルデータである。この図24に示す例では、要素値{0,1,2}を取る長さ2の整数ベクトルのハッシュを用い、距離上限を1.0とした。Distance列の値は、直積量子化LSHアルゴリズムの提供する距離モデルによって概算される距離である。本例では、ハッシュの第1要素値が1変化すると距離が0.4、第2要素値が1変化すると距離が1.0変化するという距離モデルを用いるものとした。
PQLSH近傍展開索引情報生成器250は、索引構築命令文30で指定されたデータテーブル20から特徴ベクトルを取り出し、各特徴ベクトル(事例ベクトル)について、索引構築命令文30で指定されたLSHアルゴリズムおよび距離モデルを用いて整数ベクトルである事例ハッシュを生成する。次に、PQLSH近傍展開索引情報生成器250は、生成した各事例ハッシュについて、索引構築命令文30で指定された距離以下の周辺ハッシュ群を生成する。そして、PQLSH近傍展開索引情報生成器250は、例えば、周辺ハッシュと、周辺ハッシュの事例ハッシュからの距離と、事例ハッシュの元になる事例ベクトルが属するデータテーブル20のレコードの行IDとの3つ組からなるレコードを、PQLSH近傍展開テーブルに登録する。
なお、PQLSH近傍展開テーブルのHashValue列およびDistance列に対するデータベース複合索引は、図10に示した第1実施形態のデータベース複合索引とほとんど同じであり、図10のHammingDistanceの値に沿った分岐が、Distanceの値に沿った分岐に変わるだけである。
図25は、PQLSH近傍展開索引情報生成器250による処理手順の一例を示すフローチャートである。PQLSH近傍展開索引情報生成器250は、索引構築命令タイプ分類器210から索引構築命令文30を受け取ると、例えば以下のステップS1201〜ステップS1210の処理を実行し、PQLSH近傍展開テーブルとデータベース複合索引とを含むPQLSH近傍展開索引情報40Dをデータベース400に保存する。
ステップS1201:PQLSH近傍展開索引情報生成器250は、データベース400内に、名前:HashValue・型:blobの列と、名前:Distance・型:realの列と、名前:DataRowID・型:integerの列とを持つテーブル(空のPQLSH近傍展開テーブル)を生成する。なお、テーブル名の形式は「AAAA_BBBB_CCCC_DDDD」とする。ただし、AAAAは処理対象のデータテーブル20のテーブル名、BBBBは処理対象の列の列名、CCCCは直積量子化LSHアルゴリズムのアルゴリズム名、DDDDはモデル(アルゴリズムに関する設定や分析結果)名とする。例えば、aTable_feat_PQ_confAといったテーブル名が生成したテーブルに与えられる。
ステップS1202:PQLSH近傍展開索引情報生成器250は、索引構築命令文30で指定されたデータテーブル20から、索引構築命令文30で指定された列の特徴ベクトルを順に取り出す。
ステップS1203:PQLSH近傍展開索引情報生成器250は、ステップS1202で取り出した特徴ベクトル(事例ベクトル)に対して、索引構築命令文30で指定された直積量子化LSHアルゴリズムおよびモデルを用いて、事例ハッシュを生成する。
ステップS1204:PQLSH近傍展開索引情報生成器250は、ステップS1203で得られた事例ハッシュからの距離が指定距離以下の周辺ハッシュをすべて生成する。ただし、起点となる事例ハッシュと各周辺ハッシュとの距離は、直積量子化LSHアルゴリズムのモデルを用いて概算する。
ステップS1205:PQLSH近傍展開索引情報生成器250は、ステップS1204で得られた周辺ハッシュを順に取り出す。
ステップS1206:PQLSH近傍展開索引情報生成器250は、ステップS1205で取り出した周辺ハッシュ、起点となった事例ハッシュからの距離、事例ハッシュの元になる事例ベクトルが属するデータテーブル20内のレコードの行IDの3つ組からなるレコードを、PQLSH近傍展開テーブルに追加する。
ステップS1207:PQLSH近傍展開索引情報生成器250は、ステップS1204で得られた周辺ハッシュをすべて取り出したか否かを判定する。そして、判定の結果がNoであればステップS1205に戻って以降の処理を繰り返し、YesであればステップS1208に進む。
ステップS1208:PQLSH近傍展開索引情報生成器250は、処理対象のデータテーブル20から特徴ベクトルをすべて取り出したか否かを判定する。そして、判定の結果がNoであればステップS1202に戻って以降の処理を繰り返し、YesであればステップS1209に進む。
ステップS1209:PQLSH近傍展開索引情報生成器250は、以上の処理を経て生成されたPQLSH近傍展開テーブルのHashValue列およびDistance列に対するデータベース複合索引(コンポジットインデックス)を構築し、データベース400に保存する。
ステップS1210:PQLSH近傍展開索引情報生成器250は、事例ハッシュの生成に用いた直積量子化LSHアルゴリズムのモデルを、テーブル名と同じファイル名(例えばaTable_feat_PQ_confA)でデータベース400に保存する。
なお、上記のステップS1204で周辺ハッシュを生成する方法は第1実施形態と似た方法を用いるが、本実施形態では、ハッシュのどの要素を変更するかだけでなく、どれだけ値を変更するかも決定する必要がある。これには、例えばダイクストラ法などの最良優先探索などを用いればよい。
図26は、本実施形態の検索器300Bの構成例を示すブロック図である。第1実施形態との違いは、ベクトル類似性判定処理部330Bが、図13に示した線形LSH検索器332、データベース索引LSH検索器333、データベース索引LSH検索+厳密検索器334およびデータベース索引LSH検索+線形LSH検索器335に代えて、線形PQLSH検索器351、データベース索引PQLSH検索器352、データベース索引PQLSH検索+厳密検索器353およびデータベース索引PQLSH検索+線形PQLSH検索器354を備える点である。
線形PQLSH検索器351は、扱うベクトルが第1実施形態からの実装変更に伴って二値ベクトルから整数ベクトルに変わる他は、第1実施形態の線形LSH検索器332と同様である。また、データベース索引PQLSH検索+厳密検索器353およびデータベース索引PQLSH検索+線形PQLSH検索器354については、2段階絞込方式の前段の検索方式がデータベース索引LSH検索からデータベース索引PQLSH検索に代わる他は、第1実施形態のデータベース索引LSH検索+厳密検索器334およびデータベース索引LSH検索+線形LSH検索器335と同様である。このため、以下では、線形PQLSH検索器351、データベース索引PQLSH検索+厳密検索器353およびデータベース索引PQLSH検索+線形PQLSH検索器354の説明は省略し、データベース索引PQLSH検索を行うデータベース索引PQLSH検索器352についてのみ説明する。なお、線形LSH検索については、第1実施形態から変更せずにそのまま用いることも可能である。
図27は、データベース索引PQLSH検索器352による処理手順の一例を示すフローチャートである。データベース索引PQLSH検索器352は、例えば以下のステップS1301〜ステップS1310の処理を実行して、検索結果80を出力する。
ステップS1301:データベース索引PQLSH検索器352は、空の検索結果セットを生成する。
ステップS1302:データベース索引PQLSH検索器352は、vnn関数の引数として指定されたクエリベクトル、直積量子化LSHアルゴリズムのアルゴリズム名およびオプションパラメタを取得して、クエリハッシュを生成する。
ステップS1303:データベース索引PQLSH検索器352は、検索対象データセット70のテーブル名、vnn関数の引数として指定された事例ベクトルを格納する列、直積量子化LSHアルゴリズムのアルゴリズム名およびオプションパラメタを取得して、これらを元に決定されるテーブル名を持つPQLSH近傍展開テーブルを取得する。
ステップS1304:データベース索引PQLSH検索器352は、距離条件変数に0を割り当てる。
ステップS1305:データベース索引PQLSH検索器352は、ステップS1303で取得したPQLSH近傍展開テーブルに対して、Distance列の値が距離条件変数の現在値以下であり、かつ、HashValue列の値がステップS1302で生成したクエリハッシュと一致するレコード群を検索し、得られた行IDのセットを検索結果セットに追加する。
ステップS1306:データベース索引PQLSH検索器352は、検索結果セットから重複要素を除去する。
ステップS1307:データベース索引PQLSH検索器352は、検索結果セットの要素数がvnn関数の第3引数として指定された出力上位件数以上となっているか否かを判定する。そして、判定の結果がNoであればステップS1308に進み、YesであればステップS1310に進む。
ステップS1308:データベース索引PQLSH検索器352は、距離条件変数を一定量追加する。
ステップS1309:データベース索引PQLSH検索器352は、ハミング距離条件変数の値がPQLSH近傍展開テーブルの距離上限以下か否かを判定する。そして、判定の結果がYesであればステップS1305に戻って以降の処理を繰り返し、NoであればステップS1310に進む。
ステップS1310:データベース索引PQLSH検索器352は、検索結果セットを検索結果80として出力し、処理を終了する。
以上、具体的な例を挙げながら詳細に説明したように、本実施形態のデータ管理システムでは、事前処理によってPQLSH近傍展開索引情報40Dを含む索引情報40を生成し、検索時にはこの索引情報40を用いて、クエリベクトルに完全一致する周辺ベクトルに対応する事例ベクトルを特定するといった計算量の少ない方法でデータテーブル20に対するベクトル近傍検索を行うようにしている。したがって、第1実施形態と同様に、従来の類似検索において計算量の多くを占めていたベクトル近傍検索の計算量を削減して、データ検索の実行時間を短縮することができる。
<補足説明>
上述した実施形態のデータ管理システムは、一例として、一般的なコンピュータとしてのハードウェアを用いた実行環境で動作するプログラムによる実装が可能である。この場合、本実施形態のデータ管理システムにおける上述の各機能的な構成要素(データ登録器100、索引構築器200(索引構築器200B)、検索器300(検索器300A、検索器300B))は、ハードウェアとソフトウェア(プログラム)との協働により実現される。また、データベース400は、プログラムによってアクセス可能な任意のメモリ資源によって実現される。
図28は、データ管理システムのハードウェア構成例を示すブロック図である。データ管理システムは、例えば図28に示すように、CPU(Central Processing Unit)1001などのプロセッサ回路、ROM(Read Only Memory)1002やRAM(Random Access Memory)1003などの記憶装置、表示パネルや各種操作デバイスが接続される入出力I/F1004、ネットワークに接続して通信を行う通信I/F1005、各部を接続するバス1006などを備えた、通常のコンピュータを利用したハードウェア構成とすることができる。
また、上述した構成のハードウェア上で実行されるプログラムは、例えば、インストール可能な形式または実行可能な形式のファイルでCD−ROM(Compact Disk Read Only Memory)、フレキシブルディスク(FD)、CD−R(Compact Disk Recordable)、DVD(Digital Versatile Disc)などのコンピュータで読み取り可能な記録媒体に記録されてコンピュータプログラムプロダクトとして提供される。また、上述した構成のハードウェア上で実行されるプログラムを、インターネットなどのネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成してもよい。また、上述した構成のハードウェア上で実行されるプログラムをインターネットなどのネットワーク経由で提供または配布するように構成してもよい。また、上述した構成のハードウェア上で実行されるプログラムを、ROM1002などに予め組み込んで提供するように構成してもよい。
上述した構成のハードウェア上で実行されるプログラムは、実施形態のデータ管理システムの各機能的な構成要素を含むモジュール構成となっており、例えば、CPU1001(プロセッサ回路)が上記記録媒体からプログラムを読み出して実行することにより、上述した各部がRAM1003(主記憶)上にロードされ、RAM1003(主記憶)上に生成されるようになっている。なお、実施形態のデータ管理システムの各機能的な構成要素やデータベース400は、複数のコンピュータに跨って実現される構成であってもよい。また、上述の機能的な構成要素の一部または全部を、ASIC(Application Specific Integrated Circuit)やFPGA(Field-Programmable Gate Array)などの専用のハードウェアを用いて実現することも可能である。
以上、本発明の実施形態を説明したが、ここで説明した実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。ここで説明した新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。ここで説明した実施形態やその変形は、発明の範囲や要旨に含まれるとともに、請求の範囲に記載された発明とその均等の範囲に含まれる。