(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024093565
(43)【公開日】2024-07-09
(54)【発明の名称】生成方法、探索方法、および生成装置
(51)【国際特許分類】
G06F 16/13 20190101AFI20240702BHJP
【FI】
G06F16/13
【審査請求】未請求
【請求項の数】8
【出願形態】OL
(21)【出願番号】P 2022210037
(22)【出願日】2022-12-27
(71)【出願人】
【識別番号】318010018
【氏名又は名称】キオクシア株式会社
(74)【代理人】
【識別番号】110002147
【氏名又は名称】弁理士法人酒井国際特許事務所
(72)【発明者】
【氏名】立野 賢登
(57)【要約】
【課題】高速な探索動作を可能にすること。
【解決手段】生成方法は、複数の第1ノードのうちの1つを第2ノードとして設定することと、有向グラフに基づき1以上の第3ノードのうちから(M-1)個(ただしMは2以上の整数)の第4ノードを選択することと、第1記憶領域に前記第2ノードおよび前記(M-1)個の第4ノードのそれぞれにかかる情報片をライトすることと、を含む。複数の第1ノードは有向グラフに含まれ、探索範囲である複数のベクトルに対応する。1以上の第3ノードのそれぞれは複数の第1ノードのうちの第2ノードの出隣接ノードである。情報片は有向グラフに対応したインデックス情報のうちの1つの第1ノードにかかる要素であって1つの第1ノードのベクトル値および1つの第1ノードの全ての出隣接ノードのIDを含む。
【選択図】
図7
【特許請求の範囲】
【請求項1】
有向グラフに含まれる複数の第1ノードであって探索範囲に含まれる複数のベクトルに対応した複数の第1ノードのうちの1つを第2ノードとして設定することと、
前記有向グラフに基づき、それぞれは前記複数の第1ノードのうちの前記第2ノードの出隣接ノードである1以上の第3ノードのうちから(M-1)個(ただしMは2以上の整数)の第4ノードを選択することと、
第1記憶領域に前記第2ノードおよび前記(M-1)個の第4ノードのそれぞれにかかる情報片をライトすることと、前記情報片は前記有向グラフに対応したインデックス情報のうちの1つの第1ノードにかかる要素であって前記1つの第1ノードのベクトル値および前記1つの第1ノードの全ての出隣接ノードのIDを含み、前記第1記憶領域はそれぞれがストレージデバイスへのアクセスの単位である複数の第2記憶領域のうちの1つである、
を含む生成方法。
【請求項2】
複数回の第1動作を実行することをさらに含み、前記複数回の第1動作のそれぞれは、前記設定すること、前記選択すること、および前記ライトすることを含み、
前記複数回の第1動作のうちの2回目以降に実行される第1動作である第2動作における前記設定することは、
前記第2動作よりも前に実行された何れかの第1動作における前記選択することにおいて前記1以上の第3ノードのうちの前記(M-1)個の第4ノードが選択された後の残りの1以上の第1ノードである1以上の第5ノードと、前記複数の第1ノードのうちの前記(M-1)個の第4ノードの1以上の出隣接ノードと、のうちから前記第2ノードを設定する、
ことである、
請求項1に記載の生成方法。
【請求項3】
前記複数回の第1動作のそれぞれにおいて、前記複数の第2記憶領域のうちのそれぞれ異なる第2記憶領域に前記第2ノードおよび前記(M-1)個の第4ノードのそれぞれにかかる前記情報片をライトすること、
をさらに含む請求項2に記載の生成方法。
【請求項4】
前記第3ノードの数は2以上であり、
前記Mは3以上であり、
前記選択することは、複数の差分ベクトルのうちの2つが成す角度に基づいて前記(M-1)個の第4ノードを選択することであり、
前記複数の差分ベクトルのそれぞれは、前記第2ノードと2以上の第3ノードのうちのひとつとの差分ベクトルである、
請求項1から請求項3の何れか一項に記載の生成方法。
【請求項5】
複数のサンプルクエリを生成することと、
前記有向グラフに基づき前記複数のサンプルクエリのそれぞれに最も近い第1ノードの探索を行うことと、
前記探索において通過した合計回数を前記1以上の第3ノードのそれぞれについて取得することと、
前記1以上の第3ノードのうちの前記合計回数が多い上位の(M-1)個の第3ノードを前記(M-1)個の第4ノードとして選択することと、
を含む、
請求項1から請求項3の何れか一項に記載の生成方法。
【請求項6】
前記有向グラフに基づき前記1以上の第3ノードのそれぞれについて入次数を特定することと、
前記1以上の第3ノードのうちの前記入次数が多い上位の(M-1)個の第3ノードを前記(M-1)個の第4ノードとして選択することと、
を含む、
請求項1から請求項3の何れか一項に記載の生成方法。
【請求項7】
クエリを受け付けることと、
前記受け付けたクエリに最も近い第1ノードの候補を有向グラフに沿って設定することと、前記有向グラフは探索範囲である複数のベクトルに対応した複数の第1ノードを含み、前記有向グラフにかかるインデックス情報が第1メモリに格納され、前記インデックス情報は複数の第1情報片を含み、前記複数の第1情報片のそれぞれは1つの第1ノードのベクトル値および前記1つの第1ノードの全ての出隣接ノードのIDを含み、複数の第1記憶領域のうちの1以上の第2記憶領域のそれぞれに前記複数の第1ノードのうちの何れか1つである第2ノードにかかる第1情報片と前記第2ノードの出隣接ノードにかかる第1情報片とが格納されるように前記インデックス情報が構成され、前記複数の第1記憶領域のそれぞれは前記第1メモリに対するアクセスの単位であり、
前記候補を前記有向グラフに沿って設定する毎に、
前記候補の第1ノードである第3ノードにかかる第1情報片である第2情報片が前記第1メモリよりも動作が高速な第2メモリに設けられたキャッシュ領域に格納されている場合には前記第2情報片を前記キャッシュ領域から取得することと、
前記第2情報片が前記キャッシュ領域に格納されていない場合には前記複数の第1記憶領域のうちの前記第2情報片が格納された第3記憶領域から前記第2情報片を含む複数の第3情報片を取得し、取得した前記複数の第3情報片を前記キャッシュ領域に格納することと、
前記第2情報片に基づいて新たな候補の第1ノードを設定することと、
を含む探索方法。
【請求項8】
有向グラフを受信するインタフェースと、
前記有向グラフに含まれる複数の第1ノードであって探索範囲に含まれる複数のベクトルに対応した複数の第1ノードのうちの1つを第2ノードとして設定することと、
前記有向グラフに基づき、それぞれは前記複数の第1ノードのうちの前記第2ノードの出隣接ノードである1以上の第3ノードのうちから(M-1)個(ただしMは2以上の整数)の第4ノードを選択することと、
第1記憶領域に前記第2ノードおよび前記(M-1)個の第4ノードのそれぞれにかかる情報片をライトすることと、前記情報片は前記有向グラフに対応したインデックス情報のうちの1つの第1ノードにかかる要素であって前記1つの第1ノードのベクトル値および前記1つの第1ノードの全ての出隣接ノードのIDを含み、前記第1記憶領域はそれぞれがストレージデバイスへのアクセスの単位である複数の第2記憶領域のうちの1つである、
を実行するように構成されたプロセッサと、
を備える生成装置。
【発明の詳細な説明】
【技術分野】
【0001】
本実施形態は、生成方法、探索方法、および生成装置に関する。
【背景技術】
【0002】
グラフベースの近似最近傍探索アルゴリズムの一つとして、DiskANN(Disk-based Approximate Nearest Neighbor search)というアルゴリズムが知られている。DiskANNによれば、探索の範囲である多次元ベクトル群のうちのそれぞれの多次元ベクトルをノードと見なして有向グラフが作成され、この有向グラフの構造に基づいて生成されたインデックス情報がストレージデバイスに格納される。そして、ストレージデバイス内の当該インデックス情報に基づき、有向グラフに沿った探索動作が行われる。
【先行技術文献】
【非特許文献】
【0003】
【非特許文献1】Suhas Jayaram Subramanya, Devvrit, Rohan Kadekodi, Ravishankar Krishaswamy, and Harsha Vardhan Simhadri, “DiskANN: Fast Accurate Billion-point Nearest Neighbor Search on a Single Node”, [online], November 2019, NeurIPS, [retrieved on 2022-12-11], retrieved from the Internet: <URL: https://suhasjs.github.io/files/diskann_neurips19.pdf>
【非特許文献2】Shengwen Liang, Ying Wang, Youyou Lu, Zhe Yang, Huawei Li, and Xiaowei Li, “Cognitive SSD: A Deep Learning Engine for In-Storage Data Retrieval”, [online], 2019, USENIX Annual Technical Conference, [retrieved on 2022-12-11], retrieved from the Internet: <URL: https://www.usenix.org/system/files/atc19-liang.pdf>
【発明の概要】
【発明が解決しようとする課題】
【0004】
一つの実施形態は、高速な探索動作を可能にするインデックス情報の生成方法、当該インデックス情報を用いた探索方法、および生成装置を提供することを目的とする。
【課題を解決するための手段】
【0005】
一つの実施形態によれば、有向グラフに含まれる複数の第1ノードであって探索範囲に含まれる複数のベクトルに対応した複数の第1ノードのうちの1つを第2ノードとして設定することと、有向グラフに基づき1以上の第3ノードのうちから(M-1)個(ただしMは2以上の整数)の第4ノードを選択することと、第1記憶領域に前記第2ノードおよび前記(M-1)個の第4ノードのそれぞれにかかる情報片をライトすることと、を含む。前記複数の第1ノードは前記有向グラフに含まれ、探索範囲である複数のベクトルに対応する。前記1以上の第3ノードのそれぞれは前記複数の第1ノードのうちの前記第2ノードの出隣接ノードである。前記情報片は前記有向グラフに対応したインデックス情報のうちの1つの第1ノードにかかる要素であって前記1つの第1ノードのベクトル値および前記1つの第1ノードの全ての出隣接ノードのIDを含む。前記第1記憶領域はそれぞれがストレージデバイスへのアクセスの単位である複数の第2記憶領域のうちの1つである。
【図面の簡単な説明】
【0006】
【
図1】実施形態の探索装置の構成の一例を示す模式的な図。
【
図2】実施形態の探索装置が探索を実行する際にSSDおよびDRAMに格納されている情報の一例を説明するための模式的な図。
【
図3】実施形態のデータセットから生成された有向グラフの一例を説明するための図。
【
図4】実施形態の生成装置の構成の一例を示す模式的な図。
【
図5】実施形態の生成装置のDRAMに格納されている情報の一例を説明するための模式的な図。
【
図6】実施形態の生成装置が備えるプロセッサが実現する機能の一例を示す模式的な図。
【
図7】実施形態の生成装置の動作の一例を示すフローチャート。
【
図8】有向グラフGFから実施形態の生成装置によってインデックス情報が生成される過程の具体例を説明するための模式的な図。
【
図9】有向グラフGFから実施形態の生成装置によってインデックス情報が生成される過程の具体例を説明するための模式的な図。
【
図10】実施形態の第1動作が複数回繰り返されることで生成されたインデックス情報の一例を示す図。
【
図11】実施形態の探索装置による探索動作の一例を示すフローチャート。
【
図12】変形例1の上位隣接ノード選択部の機能の詳細の一例を示す模式的な図。
【
図13】変形例1のコサイン類似度計算部による選択方法の一例を説明するための模式的な図。
【
図14】変形例1の上位隣接ノード選択部の動作の一例を示すフローチャート。
【
図15】変形例2の上位隣接ノード選択部の機能の詳細の一例を示す模式的な図。
【
図16】変形例2の上位隣接ノード選択部の動作の一例を示すフローチャート。
【
図17】変形例3の上位隣接ノード選択部の機能の詳細の一例を示す模式的な図。
【
図18】変形例3の上位隣接ノード選択部の動作の一例を示すフローチャート。
【発明を実施するための形態】
【0007】
以下に添付図面を参照して、実施形態にかかる生成方法、探索方法、および生成方法を詳細に説明する。なお、この実施形態により本発明が限定されるものではない。
【0008】
(実施形態)
まず、実施形態の探索方法が実行される装置(探索装置と表記する)の例を説明する。
図1は、実施形態の探索装置の構成の一例を示す模式的な図である。
【0009】
図1に示す例では、探索装置2は、プロセッサ21、インタフェース22、SSD(Solid State Drive)23、DRAM(Dynamic Random Access Memory)24、およびバス25を備える。プロセッサ21、インタフェース22、SSD23、およびDRAM24は、バス25に電気的に接続される。
【0010】
インタフェース22は、探索装置2に対して情報を入出力するための装置である。インタフェース22は、ネットワークを介した通信のためのインタフェース、記憶装置が接続され得るインタフェース、キーボードなどの入力装置が接続され得るインタフェース、などを含む。探索装置2は、インタフェースを介してクエリの入力を受け付けることができる。
【0011】
SSD23は、探索装置2におけるストレージデバイスとして機能する相対的に大容量の不揮発性メモリである。なお、探索装置2に適用可能なストレージデバイスはSSDに限定されない。探索装置2は、ストレージデバイスとして、磁気ディスク装置を備えてもよい。
【0012】
DRAM24は、ストレージデバイスよりもアクセス動作が高速なメモリである。DRAM24は、キャッシュ領域、バッファ領域、またはワーク領域、などとして機能する。なお、探索装置2に適用可能なストレージデバイスよりもアクセス動作が高速なメモリはDRAMに限定されない。
【0013】
プロセッサ21は、コンピュータプログラムを実行することができる演算装置であり、コンピュータプログラムによって規定された機能を実現する。プロセッサ21は、例えばCPU(Central Processing Unit)である。探索装置2においては、プロセッサ21は、探索プログラム(後述する探索プログラムSPG)に基づき、DiskANNに従った探索動作を実行する。探索プログラムSPGは、例えば、SSD23または探索装置2の外部の装置に格納されている。プロセッサ21は、オペレーティングシステムが提供する環境下で、SSD23または探索装置2の外部の装置からDRAM24に探索プログラムSPGをロードする。そして、プロセッサ21は、DRAM24にロードされた探索プログラムSPGを実行する。
【0014】
なお、プロセッサ21はCPUでなくてもよい。DiskANNに従った探索動作(例えば後述の
図11に示す動作)のうちの一部または全部は、FPGA(Field-Programmable Gate Array)またはASIC(Application Specific Integrated Circuit)などのハードウェア回路によって実現されてもよい。
【0015】
図2は、実施形態の探索装置2が探索を実行する際にSSD23およびDRAM24に格納されている情報の一例を説明するための模式的な図である。
【0016】
SSD23には、探索範囲とされるデータセットDSであるデータDの群が格納される。各データDは、N(ただしNは1以上の整数)個の要素を有する。換言すると、各データDは、N次元のベクトルである。各データDは、画像、文書、またはこれら以外の任意の種類のデータ、またはこれらのデータから生成されたデータである。一例では、各データDは、画像から抽出されたN個の特徴量である。全データDおよび後述されるクエリで要素数Nは共通である。
【0017】
探索動作の前には、データセットDSのうちの各データDをノードと見なした有向グラフが生成され、有向グラフに対応したインデックス情報IDXが生成される。そして、インデックス情報IDXはストレージデバイス(
図2に示される例ではSSD23)に格納される。
【0018】
DRAM24には、データセットDSのうちの各データDが圧縮されて生成された圧縮データDcの群が格納される。圧縮データDcの群を、圧縮データセットDScと表記する。
【0019】
DRAM24にはインデックス情報IDXの少なくとも一部がキャッシュデータとして格納され得るキャッシュ領域241がアロケートされている。
【0020】
また、DRAM24には探索プログラムSPGがロードされる。プロセッサ21は、DRAM24にロードされた探索プログラムSPGに従って探索動作を実行する。
【0021】
探索動作では、プロセッサ21は、データセットDSのうちの外部から入力されたクエリまでの距離が最も近いデータD(換言するとノード)の探索を行う。
【0022】
本明細書において距離は、データ間の類似度を表す尺度である。距離は、数学的には、例えばユークリッド距離である。なお、距離の数学的な定義はユークリッド距離に限定されない。また、距離の評価に使用される指標は、ユークリッド距離などに限らず、距離に対応する限り任意の指標が使用され得る。
【0023】
また、探索動作では、プロセッサ21は、データセットDSから生成された有向グラフによって規定された経路に沿って探索を行う。
【0024】
図3は、実施形態のデータセットDSから生成された有向グラフGFの一例を説明するための図である。
【0025】
データセットDSに含まれる各データDにはノードIDが割り当てられている(assigned)。ノードIDは、ノードを特定可能な識別情報の一例である。各データDにノードIDを割り当てる方法は特定の方法に限定されない。以降、X(ただしXは数値情報)というノードIDが与割り当てられたデータDを、ノードNDX、と表記することがある。また、データDをノードと表記することがある。
【0026】
図3の中段には、データセットDSから生成された有向グラフGFが描画されている。この例では、ノードND1には、ノードND20をヘッドとするエッジ、ノードND7をヘッドとするエッジ、ノードND13をヘッドとするエッジ、およびノードND12をヘッドとするエッジが接続される。ノードND20には、ノードND3をヘッドとするエッジ、ノードND6をヘッドとするエッジ、ノードND15をヘッドとするエッジ、およびノードND11をヘッドとするエッジが接続される。ノードND7には、ノードND10をヘッドとするエッジ、ノードND19をヘッドとするエッジ、ノードND16をヘッドとするエッジ、およびノードND5をヘッドとするエッジが接続される。ノードND13には、ノードND8をヘッドとするエッジ、ノードND21をヘッドとするエッジ、ノードND4をヘッドとするエッジ、およびノードND2をヘッドとするエッジが接続される。ノードND12には、ノードND14をヘッドとするエッジ、ノードND17をヘッドとするエッジ、ノードND9をヘッドとするエッジ、およびノードND18をヘッドとするエッジが接続される。
【0027】
本明細書では、ノードNDAとノードNDBとがノードNDBをヘッドとするエッジで接続されている場合、ノードNDAをノードNDBの入隣接ノード(in-neighbor)と表記する。ノードNDBをノードNDAの出隣接ノード(out-neighbor)、または隣接ノードNBRと表記する。ノードNDBの入隣接ノードの数を入次数(in-degree)と表記する。ノードNDAの出隣接ノードの数を出次数(out-degree)と表記する。
【0028】
なお、
図3に示す例では有向グラフGFは樹状形状を有する。有向グラフGFの形状は樹状に限定されない。複数のノードで入次数または出次数が共通していなくてもよい。複数のノードが円形に接続されていてもよい。
【0029】
探索動作においては、プロセッサ21は、有向グラフGFに従って、任意の探索アルゴリズムに基づいてクエリに最も近いノードを探索する演算を行う。探索のための演算アルゴリズムとしては、Greedy searchやBeam searchなどを含む任意のアルゴリズムが採用され得る。一例を簡単に説明すると、プロセッサ21は、複数のノードの間で探索対象ノードをグラフGFに沿って順次、切り替える。探索対象ノードを切り替える毎に、プロセッサ21は、探索対象ノードの各隣接ノードNBRとクエリとの距離を算出する。そして、プロセッサ21は、現時点でクエリに近い1つまたは複数の探索対象ノードの1以上の隣接ノードNBRのうちのクエリに最も近いノードを次の新たな探索対象ノードとして設定する。プロセッサ21は、クエリに最も近いと推測されるデータDに到達するまで、順次、有向グラフGFに沿った探索対象ノードの切り替えを行う。このグラフGFに沿って探索対象ノードを切り替える処理を、「ホップ動作」と表記することがある。
【0030】
プロセッサ21は、探索対象ノードの各隣接ノードNBRを特定するために、有向グラフGFに対応したインデックス情報IDXを参照する。つまり、インデックス情報IDXは、有向グラフGFの構造を導き出すことが可能なデータ構造を有する。
【0031】
プロセッサ21は、探索プログラムSPGに従った制御下でインデックス情報IDXを参照する際には、オペレーティングシステムに対し、SSD23からのリードのためのIO要求を発行する。具体的には、探索プログラムSPGに従った制御下のプロセッサ21から見たSSD23の記憶領域は、共通のサイズを有する複数の単位記憶領域に細分化されている。IO要求は、複数の単位記憶領域のうちの所望の1つに対するアクセス(リードまたはライト)を行う要求である。つまり、単位記憶領域は、SSD23へのアクセスの単位と考えることができる。単位記憶領域は、ページ、クラスタ、またはセクタなどであってもよいし、これらの何れとも異なっていてもよい。プロセッサ21は、1つのIO要求によって、インデックス情報IDXのうちの目的の単位記憶領域に格納された情報を取得することができる。
【0032】
以降では、説明を簡単にするために、探索プログラムSPGに従った制御下における動作の主体としてのプロセッサ21を、探索プログラムSPG、と表記する。
【0033】
図3には、インデックス情報IDXの一例として、インデックス情報IDX_orgが描画されている。インデックス情報IDX_orgは、複数のインデックス要素がノードIDの順に配列されたデータ構造を有する。各インデックス要素は、1つのノードのベクトル値と、当該1つのノードの全ての隣接ノードNBRのノードIDと、を含む情報である。各インデックス要素は、インデックス情報IDX_orgの情報片である。
【0034】
さらに、この例においては、インデックス要素のサイズが単位記憶領域のサイズの1/3であることとしている。よって、1回のIO要求によって、SSD23から、同一の単位記憶領域に格納された3個のインデックス要素が一括にリードされる。
【0035】
探索プログラムSPGは、IO要求によって、或る探索対象ノードのインデックス要素が格納された単位記憶領域から探索対象ノードのインデックス要素を含む複数(
図3の例では3個)のインデックス要素を一括に取得する。この場合、探索プログラムSPGは、一括に取得した複数のインデックス要素の全てのインデックス要素をキャッシュ領域241に格納する。そして、探索プログラムSPGは、ホップ動作によって探索対象ノードが切り替わった際に、キャッシュ領域241に切り替え後の探索対象ノードのインデックス要素が存在する場合には、SSD23からではなくキャッシュ領域241からそのインデックス要素を取得する。
【0036】
しかしながら、
図3に示したインデックス情報IDX_orgによれば、複数のインデックス要素がノードIDの順に配列されており、この複数のインデックス要素の配列の順は、有向グラフGFにおけるノード間の接続とはほとんど関連性がない。換言すると、IO要求によってSSD23から複数のインデックス要素が取得された場合、その複数のインデックス要素の間には有向グラフGFにおけるノード間の接続とはほとんど関連性がない。つまり、たとえ或る探索対象ノードのインデックス要素以外のインデックス要素をキャッシュ領域241に格納したとしても、探索対象ノードの切り替え後に切り替え後の探索対象ノードのインデックス要素がキャッシュヒットする可能性が著しく低い。キャッシュヒットの可能性が著しく低いため、キャッシュ領域241(即ちDRAM24)よりも動作の速度が遅いSSD23に対するリードがホップ動作毎に発生し、クエリの入力から探索動作の完了までに多くの時間を要する。
【0037】
実施形態によれば、キャッシュヒット率が向上するように、有向グラフGFにおける接続関係の点で関連性の高い複数のインデックス要素が同じ単位記憶領域にライトされるように、インデックス情報IDX_argdが生成される。そして、探索装置2のSSD23には、インデックス情報IDX_argdが格納され、探索プログラムSPGは、SSD23内のインデックス情報IDX_argdに基づいて探索動作を実行する。
【0038】
次に、インデックス情報IDX_argdの生成方法を実現する装置(生成装置1と表記する)について説明する。
【0039】
図4は、実施形態の生成装置1の構成の一例を示す模式的な図である。
【0040】
生成装置1は、プロセッサ11、第1インタフェース12、第2インタフェース13、DRAM14、およびバス15を備える。第1インタフェース12、プロセッサ11、DRAM14、および第2インタフェース13はバス15に電気的に接続される。
【0041】
第1インタフェース12は、生成装置1の外部の装置からデータを受け付ける回路である。この例では、第1インタフェース12は、外部の装置とネットワーク3を介した通信を行うための装置であり、例えば、第1インタフェース12は、EthernetTM
のアダプタ、またはWi-FiTMのアダプタ、などである。
【0042】
第2インタフェース13は、外部の装置にデータを出力する回路である。この例では、第2インタフェース13は、記憶装置4に接続するためのアダプタである。記憶装置4の種類は特定の種類に限定されない。記憶装置4は、例えば、SSD、HDD(Hard Disk Drive)、またはUFS(Universal Flash Storage)などであってもよい。
【0043】
プロセッサ11は、インデックス情報IDX_argdを生成する機能を有する演算装置である。プロセッサ11は、例えばCPUであってもよい。プロセッサ11がCPUである場合、プロセッサ11は、所定のプログラムを実行することによって、インデックス情報IDX_argdを生成する機能を実現する。具体的には、プロセッサ11は、所定の位置から生成プログラムGPGを取得して、取得した生成プログラムGPGをDRAM14にロードする(
図5参照)。そして、プロセッサ11は、DRAM14にロードされた探索プログラムSPGを実行する。プロセッサ11は、探索プログラムSPGに従った制御下で、インデックス情報IDX_argdを生成する。
【0044】
なお、インデックス情報IDX_argdを生成するプロセッサ11の機能の一部または全部は、FPGAまたはASICなどのハードウェア回路によって実現されてもよい。
【0045】
なお、
図4に示す例では、生成装置1は、外部の装置からネットワーク3および第1インタフェース12を介してデータを受け付けて、外部の装置(ここでは記憶装置4)に第2インタフェース13を介してデータを出力する。データの受け付けおよびデータの出力は、同一のインタフェースを介して実行されてもよい。また、生成装置1は、記憶装置を備え、その記憶装置からデータを取得したり、またはその記憶装置にデータを出力したりしてもよい。
【0046】
また、
図4に示す例では、生成装置1は探索装置2と異なる装置であることとしている。探索装置2において生成プログラムGPGが実行されることで、探索装置2が生成装置1として機能してもよい。
【0047】
図6は、実施形態の生成装置1が備えるプロセッサ11が実現する機能の一例を示す模式的な図である。
【0048】
プロセッサ11は、プライマリノード設定部101、隣接ノード抽出部102、上位(high-order)隣接ノード選択部103、ストレージライト部104、およびノードID再割当部105として機能する。
【0049】
プライマリノード設定部101は、グラフGFおよび開始点(entry point)を受け付ける。
図4に示した構成例に従えば、プライマリノード設定部101には、ネットワーク3および第1インタフェース12を介してグラフGFおよび開始点が入力される。
【0050】
なお、プライマリノード設定部101は、グラフGFの構造を示す情報であれば、任意の情報をグラフGFとして受け付け得る。例えば、グラフGFとしてインデックス情報IDX_orgがプライマリノード設定部101に入力されてもよい。
【0051】
開始点は、グラフGFによって定義された複数のノードのうちの任意の方法で選択されたノードである。開始点のノードにかかるインデックス要素は、後段の処理によって、インデックス情報IDX_argdの先頭に配置される。探索動作の際には、開始点が最初の探索対象ノードとして用いられる。
【0052】
プライマリノード設定部101は、開始点および後段の処理によって自身に入力される1以上の上位隣接ノードNBRhの隣接ノードNBR、および非選択隣接ノードNBRのそれぞれをプライマリノードNDpとして設定する。プライマリノードNDpは、そのインデックス要素が1つの単位記憶領域の先頭にライトされるノードである。プライマリノード設定部101によって設定されたプライマリノードNDpは、隣接ノード抽出部102、上位隣接ノード選択部103、およびストレージライト部104に入力される。
【0053】
隣接ノード抽出部102は、グラフGFから、プライマリノードNDpの全ての隣接ノードNBRを抽出する。隣接ノード抽出部102によって抽出された全ての隣接ノードNBRは上位隣接ノード選択部103に入力される。
【0054】
上位隣接ノード選択部103は、入力されたプライマリノードNDpおよび隣接ノードNBRに基づき、隣接ノードNBRのうちから上位隣接ノードNBRhを選択する。上位隣接ノードNBRhは、そのインデックス要素がプライマリノードNDpのインデックス要素と同じ単位記憶領域にライトされるノードである。例えば、単位記憶領域はM個(ただしMは2以上の整数)のインデックス要素の格納が可能なサイズを有する場合には、上位隣接ノード選択部103は、1つのプライマリノードNDpに対し、(M-1)個の上位隣接ノードNBRhを選択する。そして、後段のストレージライト部104によって、当該1つのプライマリノードNDpのインデックス要素と、(M-1)個の上位隣接ノードNBRhのそれぞれのインデックス要素と、を含む合計でM個のインデックス要素が、1つの単位記憶領域にライトされる。
【0055】
上位隣接ノード選択部103によって選択された上位隣接ノードNBRhはストレージライト部104に入力される。上位隣接ノード選択部103によって選択された上位隣接ノードNBRhの隣接ノードNBR、およびプライマリノードNDpの隣接ノードNBRのうちの、上位隣接ノード選択部103によって選択されなかった残りの隣接ノードNBRはプライマリノード設定部101に入力される。
【0056】
ストレージライト部104は、プライマリノードNDpのインデックス要素を、上位隣接ノードNBRhのインデックス要素とともに1つの単位記憶領域にライトする。このライトの処理によって、プライマリノードNDpにかかるインデックス要素および上位隣接ノードNBRhにかかるインデックス要素は、記憶装置4のうちの格納先の単位記憶領域に対応したエリアにライトされる。ストレージライト部104が、各単位記憶領域に対応したエリアへのライトを繰り返すことで、記憶装置4にインデックス情報IDX_argd’が完成する。
【0057】
インデックス情報IDX_argd’は、これまでの処理によってノードIDの順と異なる順で配列された状態となっている。ノードID再割当部105は、インデックス情報IDX_argd’におけるインデックス要素の並び順に対応するように、データセットDSのうちの各データDに対し、ノードIDを再割り当て(reassign)する。これによって、インデックス情報IDX_argdの生成が終了する。
【0058】
なお、プライマリノード設定部101、隣接ノード抽出部102、上位隣接ノード選択部103、ストレージライト部104、およびノードID再割当部105のうちの一部または全部は、ハードウェア回路によって実現されてもよい。
【0059】
続いて、実施形態の生成装置1の動作を説明する。
【0060】
図7は、実施形態の生成装置1の動作の一例を示すフローチャートである。
【0061】
プライマリノード設定部101は、有向グラフGFと開始点とを受け付けると(S101)、開始点をプライマリノードNDpとして設定する(S102)。隣接ノード抽出部102は、プライマリノードNDpに接続された全ての隣接ノードNBRを有向グラフGFから抽出する(S103)。
【0062】
上位隣接ノード選択部103は、プライマリノードNDpの全ての隣接ノードNBRのうちの(M-1)個の隣接ノードNBRを上位隣接ノードNBRhとして選択する(S104)。S104において、Mは、単位記憶領域あたりにライト可能なインデックス要素の数である。なお、(M-1)個の隣接ノードNBRの選択方法は特定の方法に限定されない。また、隣接ノードNBRの数が(M-1)個に満たない場合の選択方法は特定の方法に限定されない。
【0063】
ストレージライト部104は、プライマリノードNDpのインデックス要素と、S104の処理によって選択された(M-1)個の上位隣接ノードNBRhのインデックス要素と、を1つの単位記憶領域にライトする(S105)。ストレージライト部104は、プライマリノードNDpにかかるインデックス要素を当該1つの単位記憶領域の先頭にライトし、当該1つの単位記憶領域のうちの残った領域に(M-1)個の上位隣接ノードNBRhのインデックス要素をライトする。
【0064】
S105において、ストレージライト部104が複数の単位記憶領域のうちのまだライトが行われていない単位記憶領域を選択する限り、ライト先の単位記憶領域の選択方法は特定の方法に限定されない。
【0065】
プライマリノード設定部101は、上位隣接ノードNBRhとして選択されなかった隣接ノードNBRおよび上位隣接ノードNBRhの隣接ノードNBRを次のプライマリノードNDpとして設定する。その前に、プライマリノード設定部101は、上位隣接ノードNBRhとして選択されなかった隣接ノードNBRまたは上位隣接ノードNBRhの隣接ノードNBRがプライマリノードNDpとして設定されずに残っているか否かを判定する(S106)。
【0066】
上位隣接ノードNBRhとして選択されなかった隣接ノードNBRまたは上位隣接ノードNBRhの隣接ノードNBRが残っている場合(S106:Yes)、プライマリノード設定部101は、上位隣接ノードNBRhとして選択されなかった隣接ノードNBRまたは上位隣接ノードNBRhの隣接ノードNBRの全てを新たなプライマリノードNDpとして設定する(S107)。なお、残っている隣接ノードNBRのうちから新たなプライマリノードNDpとして設定されるノードを選択する方法は特定の方法に限定されない。
【0067】
S107の処理の後、S103の処理が再び実行される。つまり、S107からS103に戻ってS106に至るまでの一連の処理はループ処理を構成する。このループ処理を、第1動作と表記する。S107の処理において複数のノードがプライマリノードNDpとして設定された場合、複数のプライマリノードNDpのそれぞれに対して第1動作が実行される。
【0068】
複数回繰り返される第1動作のうちの或る第1動作におけるS104の処理において、上位隣接ノードNBRhとして選択可能な隣接ノードNBRの数が不足した場合、上位隣接ノード選択部103は、便宜的に、残っている非選択隣接ノードNBRのうちから上位隣接ノードNBRhを選択してもよい。または、S104の処理において、上位隣接ノードNBRhとして選択可能な隣接ノードNBRの数が不足した場合、上位隣接ノード選択部103は、(M-1)個に満たない数のノードを上位隣接ノードNBRhとして選択してもよい。
【0069】
こうして、1回の第1動作によって、プライマリノードNDpを含む複数のノードのインデックス要素がいずれかの単位記憶領域にライトされ、次の第1動作においては、まだインデックス要素のライトが成されていないノードのうちから複数のノードのインデックス要素が別の単位記憶領域にライトされる。全てのノードにかかるインデックス要素がライト済みとなり、これによってS106の判定処理においてNoと判定されるまで、第1動作が繰り返される。
【0070】
S106の判定処理においてNoと判定された場合、記憶装置4内にインデックス情報IDX_argd’が完成する。ノードID再割当部105は、データセットDSを構成する各データDに対してノードIDを再割り当てして(S108)、実施形態の生成装置1の動作が完了する。
【0071】
図8、
図9、および
図10は、有向グラフGFから実施形態の生成装置1によってインデックス情報IDX_argdが生成される過程の具体例を説明するための模式的な図である。ここでは一例として、ノードND1が開始点として設定されていることとする。また、単位記憶領域には3個のインデックス要素が格納されることとする。つまりMは3である。ここでは、
図7のフローチャートにおける各処理と対応付けて説明する。
【0072】
図8に示すように、生成装置1は、まず、S102の処理によって、ノードND1をプライマリノードNDpとして設定する。そして、生成装置1は、S103およびS104の処理によって、プライマリノードNDpとして設定されたノードND1の隣接ノードNBRであるノードND20、ノードND7、ノードND13、およびノードND12のうちから、2個の上位隣接ノードNBRhとして、ノードND7およびノードND12を選択する。なお、ここでは単位記憶領域あたりに3個のインデックス要素のライトが可能としている(つまりMは3)。よって、或る単位記憶領域に対し、先頭にプライマリノードNDpであるノードND1のインデックス要素がライトされ、その単位記憶領域内のノードND1のインデックス要素がライトされた領域に後続する領域に、ノードND7のインデックス要素とノードND12のインデックス要素とがライトされる。
【0073】
続いて、生成装置1は、上位隣接ノードNBRhとして選択されなかったノードND20およびノードND13と、上位隣接ノードNBRhとして選択されたノードND7およびノードND12のいずれかの隣接ノードであるノードND10、ノードND19、ノードND16、ノードND5、ノードND14、ノードND17、ノードND9、およびノードND18、のうちから1つのノードを順にプライマリノードNDpとして設定して(S107)、第1動作を繰り返す。つまり、
図9に示すように、ノードND20、ノードND13、ノードND10、ノードND19、ノードND16、ノードND5、ノードND14、ノードND17、ノードND9、およびノードND18は、プライマリノードNDpとされる。
【0074】
図9に示す例では、複数回実行される第1動作のうちのノードND20がプライマリノードNDpとして設定された第1動作においては、生成装置1は、S103およびS104の処理によって、ノードND20の隣接ノードNBRであるノードND3、ノードND6、ノードND15、およびノードND11のうちから、2個の上位隣接ノードNBRhとして、ノードND3およびノードND15を選択する。上位隣接ノードNBRhとして選択されなかったノードND6およびノードND11のそれぞれは、以降の第1動作においてプライマリノードNDpとして設定される。
【0075】
また、
図9に示す例では、複数回実行される第1動作のうちのノードND13がプライマリノードNDpとして設定された第1動作においては、生成装置1は、S103およびS104の処理によって、ノードND13の隣接ノードNBRであるノードND8、ノードND21、ノードND4、およびノードND2のうちから、2個の上位隣接ノードNBRhとして、ノードND21およびノードND2を選択する。上位隣接ノードNBRhとして選択されなかったノードND8およびノードND2のそれぞれは、以降の第1動作においてプライマリノードNDpとして設定される。
【0076】
図10は、実施形態の第1動作が複数回繰り返されることで生成されたインデックス情報IDX_argd’の一例を示す図である。本図には、比較のために、インデックス情報IDX_orgが描画されている。
【0077】
インデックス情報IDX_orgによれば、各ノードのインデックス要素がノードIDの順に配列されている。これに対し、インデックス情報IDX_argd’によれば、或るノードのインデックス要素と、当該ノードの隣接ノードNBRのインデックス要素と、が同じ単位記憶領域にライトされるよう、各インデックス要素が配列されている。
【0078】
例えば
図10に示す例では、ノードND1のインデックス要素と、ノードND1の隣接ノードNBRであるノードND7およびノードND12のそれぞれのインデックス要素と、が同じ単位記憶領域にライトされる。よって、例えば、探索プログラムSPGが、ノードND1が探索対象ノードであるときにノードND1のインデックス要素をSSD23から取得するためのIO要求を発行すると、ノードND1のインデックス要素に加えて、ノードND1の隣接ノードであるノードND7およびノードND12のそれぞれのインデックス要素を一括に取得することができる。そして、探索プログラムSPGは、ノードND1、ノードND7およびノードND12のそれぞれのインデックス要素をキャッシュ領域241に格納する。探索プログラムSPGは、ノードND20、ノードND7、ノードND13、およびノードND12のうちの1つを、ノードND1の次の探索対象ノードとして設定する。仮に探索プログラムSPGがノードND7またはノードND12を探索対象ノードとして設定した場合、探索プログラムSPGは、キャッシュ領域241から探索対象ノードのインデックス要素を取得することができる。
【0079】
このように、実施形態の生成装置1は、或るノードのインデックス要素と、当該ノードの隣接ノードNBRのインデックス要素と、を同じ単位記憶領域にライトする。よって、探索装置2が生成装置1によって生成されたインデックス情報IDX_argdを用いて探索動作を行った場合、ホップ動作毎に、次の探索対象ノードとなり得るノードのインデックス要素をキャッシュ領域241に格納することができる。これによって、インデックス情報IDX_orgが使用された場合に比べてキャッシュヒット率を高くすることができる。
【0080】
探索装置2のSSD23には、生成装置1によって生成されたインデックス情報IDX_argdが格納される。そして、探索装置2は、インデックス情報IDX_argdに基づき、探索動作を実行する。
【0081】
図11は、実施形態の探索装置2による探索動作の一例を示すフローチャートである。
【0082】
探索プログラムSPGは、クエリを受け付けると(S201)、開始点を探索対象ノードとして設定する(S202)。そして、探索プログラムSPGは、探索対象ノードのインデックス要素がキャッシュ領域241に格納されているか否かを判定する(S203)。
【0083】
探索対象ノードのインデックス要素がキャッシュ領域241に格納されていない場合(S203:No)、探索プログラムSPGは、オペレーティングシステムにIO要求を発行することによって、探索対象ノードのインデックス要素が格納された単位記憶領域から当該単位記憶領域に格納されている全てのインデックス要素のセットを取得する(S204)。そして、探索プログラムSPGは、インデックス要素のセットの全てのインデックス要素をキャッシュ領域241に格納する(S205)。
【0084】
探索対象ノードのインデックス要素がキャッシュ領域241に格納されている場合(S203:Yes)、探索プログラムSPGは、探索対象ノードのインデックス要素をキャッシュ領域241から取得する(S206)。
【0085】
S205の処理またはS206の処理の後、探索プログラムSPGは、探索対象ノードのインデックス要素から探索対象ノードの全ての隣接ノードNBRを抽出する(S207)。
【0086】
探索プログラムSPGは、取得した探索対象ノードおよび各隣接ノードNBRの情報などを使用して、近似最近傍探索の演算を行う(S208)。近似最近傍探索の演算としては、例えばGreedy searchやBeam searchなどの次回の探索対象ノードの決定手法および、この演算に必要となる圧縮データDcを使用したクエリとの距離計算などを含む既存の任意の演算方法が採用され得る。
【0087】
近似最近傍探索の演算の結果、クエリの最近傍点候補となるノードが決定せず、探索対象ノードが新たに発生した場合(S209:No)、探索プログラムSPGは、隣接ノードNBRのうちのクエリに最も近い隣接ノードNBRを新たな探索対象ノードとして設定する(S210)。つまり、探索プログラムSPGは、探索対象ノードの切り替えを実行する。S210の後、探索プログラムSPGは、S203からの一連の処理を再び実行する。
【0088】
近似最近傍探索の演算の結果、クエリの最近傍点候補となるノードが決定した場合(S209:Yes)、探索プログラムSPGは、クエリの最近傍点候補として決定したノードを探索動作の結果として出力する(S211)。そして、探索動作が終了する。
【0089】
以上述べたように、実施形態によれば、生成装置1は、データセットDSを構成する複数のデータDに対応する有向グラフGFに含まれるノードのうちの1つをプライマリノードNDpとして設定する(例えば
図7のS102またはS107参照)。そして、生成装置1は、有向グラフGFに基づき、プライマリノードNDpとして設定されたノードの1以上の隣接ノードNBRのうちから(M-1)個の上位隣接ノードNBRhを選択する(例えば
図7のS103およびS104参照)。そして、生成装置1は、プライマリノードNDpとして設定されたノードのインデックス情報および上位隣接ノードNBRhとして選択された(M-1)個のノードのそれぞれのインデックス情報を1つの単位記憶領域にライトする(例えば
図7のS105参照)。単位記憶領域は、ストレージデバイス(例えばSSD23)へのアクセスの単位である。
【0090】
よって、生成装置1によって生成されたインデックス情報IDX_argdを用いた探索動作においてインデックス要素の取得の際のキャッシュヒット率を向上させることができる。その結果、探索動作に要する時間が短縮される。つまり、実施形態によれば、高速な探索動作を可能にするインデックス情報IDXを得ることが可能である。
【0091】
なお、実施形態によれば、生成装置1は、複数回の第1動作を実行する(例えば
図7のS107からS103に戻ってS106に至るまでの一連の処理参照)。各第1動作は、プライマリノードNDpの設定の処理と、(M-1)個の上位隣接ノードNBRhの選択の処理と、プライマリノードNDpとして設定されたノードのインデックス情報および上位隣接ノードNBRhとして選択された(M-1)個のノードのそれぞれのインデックス情報の1つの単位記憶領域へのライトの処理と、を含む。生成装置1は、複数回の第1動作のうちの2回目以降に実行される第1動作においては、以前の何れかの第1動作において上位隣接ノードNBRhとして選択されなかった隣接ノードNBRと、上位隣接ノードNBRhとして選択された隣接ノードNBRの隣接ノードNBRとの全てをプライマリノードNDpとして設定し、それぞれのプライマリノードNDpに対して第1動作を順次行う(例えば
図7のS107参照)。
【0092】
また、実施形態によれば、生成装置1は、複数回の第1動作のそれぞれにおいてそれぞれ異なる単位記憶領域に、プライマリノードNDpとして設定されたノードのインデックス情報および上位隣接ノードNBRhとして選択された(M-1)個のノードのそれぞれのインデックス情報をライトする。
【0093】
また、実施形態によれば、探索装置2のSSD23には、有向グラフGFに対応したインデックス情報IDX_argdが格納される。インデックス情報IDX_argdは、SSD23の複数の単位記憶領域のうちの少なくとも1つの単位記憶領域に、或るノードのインデックス要素と、当該ノードの隣接ノードNBRのインデックス要素と、が格納されるように構成されている。探索装置2において、探索対象ノードを有向グラフGFに沿って設定する際に、探索対象ノードのインデックス要素がキャッシュ領域241に格納されている場合には、探索プログラムSPGは、探索対象ノードのインデックス要素をキャッシュ領域241から取得する(例えば
図11のS206参照)。探索対象ノードのインデックス要素がキャッシュ領域241に格納されていない場合には、探索プログラムSPGは、複数の単位記憶領域のうちの探索対象ノードのインデックス要素が格納されている単位記憶領域から探索対象ノードのインデックス要素を含むインデックス要素のセットを取得し(例えば
図11のS204参照)、取得したインデックス要素のセットをキャッシュ領域241に格納する(例えば
図11のS205参照)。そして、探索プログラムSPGは、探索対象ノードのインデックス要素に基づいて新たな探索対象ノードを設定する(例えば
図11のS210参照)。
【0094】
よって、探索プログラムSPGは、ホップ動作毎に、次に探索対象ノードとして選択され得るノードのインデックス要素を予めキャッシュ領域241に格納でき、これによってキャッシュヒット率が向上する。よって、探索動作に要する時間が短縮される。
【0095】
以下に、実施形態に適用され得るいくつかの変形例を説明する。以下では、上記の実施形態と同じ事項については簡略的に説明するか、または説明を省略する。
【0096】
(変形例1)
変形例1によれば、生成装置1が備えるプロセッサ11は、インデックス情報IDX_argdを生成する機能のうち、上位隣接ノード選択部103に替えて、上位隣接ノード選択部103aを備える。
【0097】
図12は、変形例1の上位隣接ノード選択部103aの機能の詳細の一例を示す模式的な図である。
【0098】
上位隣接ノード選択部103aは、コサイン類似度計算部111を備える。コサイン類似度計算部111は、プライマリノードNDpと複数の隣接ノードNBRとに基づき、隣接ノードNBR毎に差分ベクトルを計算する。そして、コサイン類似度計算部111は、差分ベクトル間で成す角度に基づいて(M-1)個の上位隣接ノードNBRhを選択する。
【0099】
なお、コサイン類似度計算部111は、Mが3以上であるときに、換言すると、2個以上の上位隣接ノードNBRhを選択するときに、差分ベクトル間で成す角度に基づく上位隣接ノードNBRhの選択を行う。コサイン類似度計算部111は、角度の指標の一例として、コサイン類似度を使用する。なお、上位隣接ノードNBRhの選択に使用される角度の指標はコサイン類似度に限定されない。
【0100】
図13は、変形例1のコサイン類似度計算部111による選択方法の一例を説明するための模式的な図である。本図に示す例では、ノードND30がプライマリノードNDpとして設定されており、ノードND31~ND38の合計8個のノードがノードND30の隣接ノードNBRとして定義されている。
【0101】
コサイン類似度計算部111は、ノードND31とノードND30との差分ベクトル、ノードND32とノードND30との差分ベクトル、ノードND33とノードND30との差分ベクトル、ノードND34とノードND30との差分ベクトル、ノードND35とノードND30との差分ベクトル、ノードND36とノードND30との差分ベクトル、ノードND37とノードND30との差分ベクトル、およびノードND38とノードND30との差分ベクトルを計算する。
【0102】
各差分ベクトルは、ノードND30からひとつの隣接ノードNBRに向かうエッジを表す。コサイン類似度計算部111は、差分ベクトル間のコサイン類似度に基づき、ノードND30から(M-1)個の上位隣接ノードNBRhへの(M-1)個のエッジの向きができるだけ偏らないように、(M-1)個の上位隣接ノードNBRhを選択する。
【0103】
図13に示す例では、Mは5であることとしている。そして、ノードND31、ノードND33、ノードND35、およびノードND37が、上位隣接ノードNBRhとして選択されている。本図からは、ノードND30からノードND31へのエッジ、ノードND30からノードND33へのエッジ、ノードND30からノードND35へのエッジ、およびノードND30からノードND37へのエッジの向きが分散していることが読み取れる。
【0104】
図14は、変形例1の上位隣接ノード選択部103aの動作の一例を示すフローチャートである。本図に示す一連の動作は、例えば
図7のS104の処理において実行される。
【0105】
まず、コサイン類似度計算部111は、入力された隣接ノードNBR毎に隣接ノードNBRとプライマリノードNDpとの差分ベクトルを計算する(S301)。そして、コサイン類似度計算部111は、プライマリノードNDpに最も近い隣接ノードNBRを、上位隣接ノードNBRhとして選択する(S302)。
【0106】
続いて、コサイン類似度計算部111は、入力された隣接ノードNBRのうちのプライマリノードNDpとして設定されておらず上位隣接ノードNBRhとしても選択されていない1つの隣接ノードNBRを対象ノードとして設定する(S303)。コサイン類似度計算部111は、選択済みの全ての上位隣接ノードNBRhについて、設定した対象ノードにかかる差分ベクトルの上位隣接ノードNBRhにかかる差分ベクトルに対するコサイン類似度の平均値を算出する(S304)。
【0107】
コサイン類似度計算部111は、入力された隣接ノードNBRのうちのプライマリノードNDpおよび上位隣接ノードNBRhとして設定されていない隣接ノードNBRのうちに、まだ対象ノードとして設定されたことがない隣接ノードNBRがあるか否かを判定する(S305)。まだ対象ノードとして設定されたことがない隣接ノードNBRがある場合(S305:Yes)、コサイン類似度計算部111は、まだ対象ノードとして設定されたことがない隣接ノードNBRのうちの1つの隣接ノードNBRを新たな対象ノードとして設定する(S306)。そして、コサイン類似度計算部111は、S304からの一連の処理を再び実行する。
【0108】
まだ対象ノードとして設定されたことがない隣接ノードNBRがない場合(S305:No)、コサイン類似度計算部111は、コサイン類似度の平均値が最小値をとる隣接ノードNBRを上位隣接ノードNBRhとして選択する(S307)。
【0109】
コサイン類似度計算部111は、選択済みの上位隣接ノードNBRhの数が(M-1)個に達したか否かを判定する(S308)。選択済みの上位隣接ノードNBRhの数が(M-1)個に達していなければ(S308:No)、コサイン類似度計算部111は、対象ノードの選択履歴をリセットし(S309)、S303からの一連の処理を再び実行する。
【0110】
選択済みの上位隣接ノードNBRhの数が(M-1)個に達した場合(S308:Yes)、上位隣接ノード選択部103aは、上位隣接ノードNBRhの選択の動作を終了する。
【0111】
なお、
図14は、上位隣接ノードNBRhにかかる差分ベクトルの向きができるだけ偏らないように(M-1)個の上位隣接ノードNBRhを選択する方法の一例である。コサイン類似度計算部111による差分ベクトル間の角度に基づく(M-1)個の上位隣接ノードNBRhの選択方法はこれに限定されない。
【0112】
このように、変形例1によれば、生成装置1は、それぞれは隣接ノードNBRのうちの1つとプライマリノードNDpとの差分ベクトルである複数の差分ベクトルのうちの2つが成す角度に基づいて(M-1)個の上位隣接ノードNBRhを選択する。
【0113】
上位隣接ノードNBRhにかかる差分ベクトルの向きができるだけ偏らないように(M-1)個の上位隣接ノードNBRhが選択されれば、各ホップ動作において、探索対象ノードから見たクエリがどの方位にあっても、できるだけクエリにより近づくようにホップ動作の経路を選択することが可能となる。
【0114】
(変形例2)
変形例2によれば、生成装置1が備えるプロセッサ11は、インデックス情報IDX_argdを生成する機能のうち、上位隣接ノード選択部103に替えて、上位隣接ノード選択部103bを備える。
【0115】
図15は、変形例2の上位隣接ノード選択部103bの機能の詳細の一例を示す模式的な図である。
【0116】
上位隣接ノード選択部103bは、サンプルクエリ生成部121、探索・カウント部122、および通過ノード比較部123を備える。
【0117】
サンプルクエリ生成部121は、探索動作の試行のためのクエリ(サンプルクエリと表記する)を複数、生成する。複数のサンプルクエリの生成方法は特定の方法に限定されない。複数のサンプルクエリは、データセットDSが存在する空間全体に一定の距離を置いて分散するように生成することが望ましい。この結果、複数のサンプルクエリそれぞれの距離は遠くなる。
【0118】
探索・カウント部122は、有向グラフGFと開始点とを用いて、サンプルクエリ生成部121が生成した複数のサンプルクエリのそれぞれについて、探索動作を実行する。探索・カウント部122は、有向グラフGFを表す情報として、インデックス情報IDX_orgを使用してもよい。探索・カウント部122は、複数のサンプルクエリのそれぞれについての探索動作によって有向グラフGFに従って探索対象ノードが通過した経路に基づき、各ノードの通過回数をカウントする。各ノードの通過回数のカウント値は通過ノード比較部123に入力される。
【0119】
通過ノード比較部123は、プライマリノードNDpの1以上の隣接ノードNBRのうちの通過回数が多い上位の(M-1)個の隣接ノードNBRを(M-1)個の上位隣接ノードNBRhとして選択する。
【0120】
図16は、変形例2の上位隣接ノード選択部103bの動作の一例を示すフローチャートである。本図に示す一連の動作は、例えば
図7のS104の処理において実行される。
【0121】
まず、サンプルクエリ生成部121は、複数のサンプルクエリを生成する(S401)。探索・カウント部122は、サンプルクエリ毎に探索動作を実行し、隣接ノードNBR毎に通過回数をカウントする(S402)。通過ノード比較部123は、プライマリノードNDpの1以上の隣接ノードNBRのうちの通過回数が多い上位の(M-1)個の隣接ノードNBRを(M-1)個の上位隣接ノードNBRhとして選択する(S403)。そして、上位隣接ノード選択部103bは、上位隣接ノードNBRhの選択の動作を終了する。
【0122】
なお、本図に示す一連の動作のうち、S402、S403の処理は必ずしもプライマリノードNDp毎に実行されなくてもよい。例えば、探索・カウント部122は、複数のサンプルクエリのそれぞれについて探索動作を実行し、有向グラフGFに含まれる全ノードのそれぞれについて通過回数をカウントする。そして、複数のサンプルクエリの全てについて探索動作と通過回数のカウントとが完了すると、探索・カウント部122は、ノード毎のカウント値を記憶しておく。そして、
図7のS104の処理においては、探索・カウント部122は探索動作を実行することなく、既に記憶したノード毎のカウント値のうちの隣接ノードのカウント値を通過ノード比較部123に入力してもよい。
【0123】
このように、変形例2によれば、生成装置1は、複数のサンプルクエリを生成し、複数のサンプルクエリのそれぞれに最も近いノードを探索する探索動作を行う。そして、生成装置1は、複数のサンプルクエリにかかる探索動作によって通過した合計回数が最も多い(M-1)個の隣接ノードNBRを(M-1)個の上位隣接ノードNBRhとして選択する。
【0124】
上記の構成により、探索対象ノードとして設定される可能性が高い隣接ノードNBRのインデックス要素が優先的にプライマリノードNDpのインデックス要素と同じ単位記憶領域にライトされる。よって、キャッシュヒット率がさらに向上し、探索動作に要する時間がさらに短縮される。
【0125】
(変形例3)
変形例3によれば、生成装置1が備えるプロセッサ11は、インデックス情報IDX_argdを生成する機能のうち、上位隣接ノード選択部103に替えて、上位隣接ノード選択部103cを備える。
【0126】
図17は、変形例3の上位隣接ノード選択部103cの機能の詳細の一例を示す模式的な図である。
【0127】
上位隣接ノード選択部103cは、入次数比較部131を備える。
【0128】
入次数比較部131は、有向グラフGFと開始点とを用いて、各隣接ノードNBRの入次数の比較に基づき、(M-1)個の上位隣接ノードNBRhを選択する。
【0129】
図18は、変形例3の上位隣接ノード選択部103cの動作の一例を示すフローチャートである。本図に示す一連の動作は、例えば
図7のS104の処理において実行される。
【0130】
まず、入次数比較部131は、有向グラフGFに基づき、隣接ノードNBR毎に入次数を特定する(S501)。そして、入次数比較部131は、入次数が多い上位の(M-1)個の隣接ノードNBRを(M-1)個の上位隣接ノードNBRhとして選択する(S502)。そして、上位隣接ノード選択部103cは、上位隣接ノードNBRhの選択の動作を終了する。
【0131】
このように、変形例3によれば、生成装置1は、有向グラフGFに基づき、隣接ノードNBRのそれぞれについて入次数を特定する。そして、生成装置1は、入次数が多い上位の(M-1)個の隣接ノードNBRを、(M-1)個の上位隣接ノードNBRhとして選択する。
【0132】
入次数が多いノードほど探索動作において探索対象ノードとして設定される可能性が高いと考えられる。変形例3によれば、入次数が多い隣接ノードNBRのインデックス要素が優先的にプライマリノードNDpのインデックス要素と同じ単位記憶領域にライトされる。よって、キャッシュヒット率がさらに向上し、探索動作に要する時間がさらに短縮される。
【0133】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0134】
1 生成装置、2 探索装置、3 ネットワーク、4 記憶装置、11 プロセッサ、12 第1インタフェース、13 第2インタフェース、14 DRAM、15 バス、21 プロセッサ、22 インタフェース、23 SSD、24 DRAM、25 バス、101 プライマリノード設定部、102 隣接ノード抽出部、103,103a,103b,103c 上位隣接ノード選択部、104 ストレージライト部、105 ノードID再割当部、111 コサイン類似度計算部、121 サンプルクエリ生成部、122 探索・カウント部、123 通過ノード比較部、131 入次数比較部、241 キャッシュ領域、GPG 生成プログラム、SPG 探索プログラム、GF 有向グラフ。