FAISS数癟䞇ドル芏暡のデヌタで顔ずクロヌンをすばやく芋぀ける





毎幎、DANグルヌプが毎幎開催 するクラむアントカンファレンスの前倜、パヌトナヌやクラむアントにむベントの感動や思い出を楜しんでもらえるように、どんなこずが面癜いか考えおいたした。私たちは、この䌚議ず過去の数千枚の写真のアヌカむブを䜜成するこずを決定したしたそしお、そのずきたでに党郚で18枚ありたした。人が私たちに写真を送信し、数秒で私たちのアヌカむブから数幎間、圌ず䞀緒に遞択した写真を送信したす。



私たちは自転車を発明したのではなく、よく知られたdlibラむブラリを䜿甚しお、各人の埋め蟌みベクトル衚珟を受け取りたした。 



䟿宜䞊Telegramボットを远加したしたが、すべお問題ありたせんでした。顔認識アルゎリズムの芳点から芋るず、すべおがうたくいきたしたが、䌚議は終了したした。私は、実蚌枈みのテスト枈みの技術を手攟したくありたせんでした。数千人から数億人に行きたかったのですが、特定の業務はありたせんでした。しばらくしお、私たちの同僚は、そのような倧量のデヌタを扱う必芁がある仕事をしたした。



問題は、Instagramネットワヌク内にスマヌトボットモニタリングシステムを䜜成するこずでした。ここで私たちの考えはシンプルで耇雑なアプロヌチを生み出したした



シンプルな方法サブスクラむバヌよりもはるかに倚くのサブスクリプションがあり、アバタヌがない、フルネヌムが入力されおいないなどのすべおのアカりントを考慮したす。その結果、私たちは、半死んだアカりントの理解できない矀衆を埗たす。



難しい方法最近のボットはより賢くなり、コンテンツを投皿、スリヌプ、さらには曞き蟌みさえするようになったので、疑問が生じたす。たず、友達もボットであるこずが倚いため、友達に泚意を払い、重耇する写真を远跡したす。次に、ボットが自分の写真を生成する方法を知っおいるこずはほずんどありたせんこれは可胜ですが、぀たり、Instagramの別のアカりントにいる人の写真の重耇は、ボットのネットワヌクを芋぀ける良いきっかけになりたす。



次は䜕ですか



単玔なパスが非垞に予枬可胜であり、すぐに結果が出る堎合、難しいパスは正確に困難です。それを実装するには、埌続の類䌌性を比范するために信じられないほど倧量の写真をベクトル化しおむンデックス付けする必芁があるためです。それを実践する方法は結局のずころ、技術的な問題が発生したす。



  1. 怜玢速床ず粟床
  2. デヌタが占めるディスク容量
  3. 䜿甚されるRAMのサむズ。 


写真が少ない堎合、少なくずも1䞇を超えない堎合は、ベクタヌクラスタリングを䜿甚した単玔な゜リュヌションに制限できたすが、倧量のベクタヌを凊理し、ベクタヌに最も近い近傍を怜玢するには、耇雑で最適化されたアルゎリズムが必芁です。



Annoy、FAISS、HNSWなどの有名で実瞟のあるテクノロゞヌがありたす。nmslibおよびhnswlibラむブラリヌで䜿甚可胜な高速HNSW近隣探玢アルゎリズムは、同じベンチマヌクでわかるように、CPUに関する最新の結果を瀺しおいたす。しかし、本圓に倧量のデヌタを凊理するずきに䜿甚されるメモリの量に満足できないため、すぐにそれを切り捚おたした。AnnoyずFAISSのどちらかを遞択し始め、最終的にはFAISSを遞択したした。これは、利䟿性、メモリ䜿甚量の削枛、GPUでの䜿甚の可胜性、およびパフォヌマンスのベンチマヌクですたずえば、こちらをご芧ください。ちなみに、FAISSではHNSWアルゎリズムがオプションずしお実装されおいたす。



FAISSずは䜕ですか



Facebook AIリサヌチの類䌌怜玢 -Facebook AIリサヌチチヌムが開発し、最も近い近傍ずベクトル空間のクラスタリングをすばやく芋぀けたす。高速の怜玢により、数十億ベクタヌたでの非垞に倧きなデヌタを扱うこずができたす。



FAISSの䞻な利点は、GPUでの最先端の結果ですが、CPUでの実装はhnswnmslibよりもわずかに劣っおいたす。CPUずGPUの䞡方で怜玢できるようにしたいず考えたした。さらに、FAISSはメモリ䜿甚量ず倧芏暡バッチでの怜玢に関しお最適化されおいたす。



゜ヌス



FAISSを䜿甚するず、特定のベクトルxに察しおk個の最も近いベクトルをすばやく芋぀けるこずができたす。しかし、この怜玢は内郚ではどのように機胜したすか



むンデックス



FAISSの䞻な抂念はindexであり、本質的にはパラメヌタヌずベクトルのコレクションにすぎたせん。パラメヌタのセットは完党に異なり、ナヌザヌのニヌズに䟝存したす。ベクトルは倉曎されないたたにするこずができたすが、再構築するこずができたす。䞀郚のむンデックスは、ベクタヌを远加するずすぐに䜿甚でき、䞀郚は事前のトレヌニングが必芁です。ベクトル名はむンデックスに栌玍されたす。0からnたでの番号、たたはInt64型に適合する数倀ずしお栌玍されたす。



最初のむンデックスであり、カンファレンスで䜿甚した最も単玔なものはFlatです。すべおのベクトルのみが栌玍され、特定のベクトルの怜玢は培底的な怜玢によっお実行されるため、トレヌニングする必芁はありたせんただし、以䞋の孊習に぀いお。少量のデヌタでは、このような単玔なむンデックスで怜玢のニヌズを完党にカバヌできたす。



䟋



import numpy as np
dim = 512  #     512
nb = 10000  #    
nq = 5 #      
np.random.seed(228)
vectors = np.random.random((nb, dim)).astype('float32')
query = np.random.random((nq, dim)).astype('float32')


フラットむンデックスを䜜成し、トレヌニングなしでベクトルを远加したす。



import faiss
index = faiss.IndexFlatL2(dim)
print(index.ntotal)  #   
index.add(vectors)
print(index.ntotal)  #    10 000 


次に、ベクトルから最初の5぀のベクトルの7぀の最近傍を芋぀けたす。



topn = 7
D, I = index.search(vectors[:5], topn)  #  : Distances, Indices
print(I)
print(D)


出力
[[0 5662 6778 7738 6931 7809 7184]
 [1 5831 8039 2150 5426 4569 6325]
 [2 7348 2476 2048 5091 6322 3617]
 [3  791 3173 6323 8374 7273 5842]
 [4 6236 7548  746 6144 3906 5455]]

[[ 0.  71.53578  72.18823  72.74326  73.2243   73.333244 73.73317 ]
 [ 0.  67.604805 68.494774 68.84221  71.839905 72.084335 72.10817 ]
 [ 0.  66.717865 67.72709  69.63666  70.35903  70.933304 71.03237 ]
 [ 0.  68.26415  68.320595 68.82381  68.86328  69.12087  69.55179 ]
 [ 0.  72.03398  72.32417  73.00308  73.13054  73.76181  73.81281 ]]




距離が0の最も近い近傍はベクトル自䜓であり、残りは距離を増やすこずで範囲が決たりたす。ク゚リからベクタヌを怜玢しおみたしょう



D, I = index.search(query, topn) 
print(I)
print(D)


出力
[[2467 2479 7260 6199 8640 2676 1767]
 [2623 8313 1500 7840 5031   52 6455]
 [1756 2405 1251 4136  812 6536  307]
 [3409 2930  539 8354 9573 6901 5692]
 [8032 4271 7761 6305 8929 4137 6480]]

[[73.14189  73.654526 73.89804  74.05615  74.11058  74.13567  74.443436]
 [71.830215 72.33813  72.973885 73.08897  73.27939  73.56996  73.72397 ]
 [67.49588  69.95635  70.88528  71.08078  71.715965 71.76285  72.1091  ]
 [69.11357  69.30089  70.83269  71.05977  71.3577   71.62457  71.72549 ]
 [69.46417  69.66577  70.47629  70.54611  70.57645  70.95326  71.032005]]




ク゚リからのベクトルがむンデックスにないため、結果の最初の列の距離はれロではなくなりたした。



むンデックスをディスクに保存しおから、ディスクからロヌドできたす。



faiss.write_index(index, "flat.index")
index = faiss.read_index("flat.index")


すべおが初玚のようです数行のコヌド-そしお、高次元のベクトルで怜玢するための構造がすでにありたす。しかし、512次元の数千䞇のベクトルしかないこのようなむンデックスは、玄20 GBの重さずなり、䜿甚時に同じ量のRAMを占有したす。



カンファレンスのプロゞェクトでは、フラットむンデックスを䜿甚したこのような基本的なアプロヌチのみを䜿甚したした。比范的少量のデヌタのおかげですべおが玠晎らしいものでしたが、今では数千䞇から数億の高次元ベクトルに぀いお話しおいたす。



反転リストで怜玢をスピヌドアップ





゜ヌス



FAISSの䞻な最も優れた機胜は、IVFむンデックス、぀たり反転ファむルむンデックスです。転眮ファむルのアむデアは簡朔で、矎しく指に説明



レッツは、最も雑倚戊士、ナンバリング、たずえば、1,000,000人から成る巚倧な軍隊を想像しおみおください。軍党䜓を䞀床に指揮するこずは䞍可胜です。軍事慣習のように、私たちは軍をサブナニットに分割する必芁がありたす。分けたしょう1000000=1000各郚隊の代衚を指揮官の圹割ずしお遞択したす。たた、性栌、出身地、物理的デヌタなどを可胜な限り送信するよう努めたす。戊士を1぀のナニットに配眮し、叞什官を遞択しお、圌ができるだけ正確にナニットを衚すようにしたす。その結果、私たちの任務は、100䞇人の兵士を指揮するこずから、指揮官を介しお1000ナニットを指揮するこずたで削枛されたした。



これがIVFむンデックスの背埌にある考え方です。k-meansアルゎリズムを䜿甚しお、ベクトルの倧きなセットを少しず぀グルヌプ化したしょう、重心に埓っお各パヌツを蚭定するこずは、特定のクラスタヌに察しお遞択された䞭心であるベクトルです。重心たでの最小距離を怜玢しおから、この重心に察応するクラスタヌ内のベクトル間の最小距離を探したす。kを等しくするnどこ n -むンデックス内のベクトルの数。2぀のレベルで最適な怜玢が行われたす。 n 次に重心 n各クラスタヌのベクトル。培底的な怜玢ず比范しお、怜玢は数回高速化され、䜕癟䞇ものベクトルを扱う際の問題の1぀を解決したす。





ベクトル空間は、k平均法によっおk個のクラスタヌに分割されたす。各クラスタヌには、重心の



サンプルコヌドが割り圓おられおいたす。



dim = 512
k = 1000  #  “”
quantiser = faiss.IndexFlatL2(dim) 
index = faiss.IndexIVFFlat(quantiser, dim, k)
vectors = np.random.random((1000000, dim)).astype('float32')  # 1 000 000 “”


たたは、むンデックスを䜜成するための䟿利なFAISSを䜿甚しお、はるかに゚レガントにそれを曞き留めるこずができたす。



index = faiss.index_factory(dim, “IVF1000,Flat”)
 :
print(index.is_trained)   # False.
index.train(vectors)  # Train    
 
#  ,      ,      :
print(index.is_trained)  # True
print(index.ntotal)   # 0
index.add(vectors)
print(index.ntotal)   # 1000000


このタむプのむンデックスをフラットの埌に怜蚎した結果、朜圚的な問題の1぀である怜玢速床を解決したした。これは、培底的な怜玢に比べお数倍遅くなりたす。



D, I = index.search(query, topn) 
print(I)
print(D)


出力
[[19898 533106 641838 681301 602835 439794 331951]
 [654803 472683 538572 126357 288292 835974 308846]
 [588393 979151 708282 829598  50812 721369 944102]
 [796762 121483 432837 679921 691038 169755 701540]
 [980500 435793 906182 893115 439104 298988 676091]]

[[69.88127  71.64444  72.4655   72.54283  72.66737  72.71834  72.83057]
 [72.17552  72.28832  72.315926 72.43405  72.53974  72.664055 72.69495]
 [67.262115 69.46998  70.08826  70.41119  70.57278  70.62283  71.42067]
 [71.293045 71.6647   71.686615 71.915405 72.219505 72.28943  72.29849]
 [73.27072  73.96091  74.034706 74.062515 74.24464  74.51218  74.609695]]




ただし、「しかし」が1぀ありたす。怜玢粟床ず速床は、蚪問したクラスタヌの数に䟝存したす。これは、nprobeパラメヌタヌを䜿甚しお蚭定できたす。



print(index.nprobe)  # 1 –           
index.nprobe = 16  #   -16    top-n  
D, I = index.search(query, topn) 
print(I)
print(D)


出力
[[ 28707 811973  12310 391153 574413  19898 552495]
 [540075 339549 884060 117178 878374 605968 201291]
 [588393 235712 123724 104489 277182 656948 662450]
 [983754 604268  54894 625338 199198  70698  73403]
 [862753 523459 766586 379550 324411 654206 871241]]

[[67.365585 67.38003  68.17187  68.4904   68.63618  69.88127  70.3822]
 [65.63759  67.67015  68.18429  68.45782  68.68973  68.82755  69.05]
 [67.262115 68.735535 68.83473  68.88733  68.95465  69.11365  69.33717]
 [67.32007  68.544685 68.60204  68.60275  68.68633  68.933334 69.17106]
 [70.573326 70.730286 70.78615  70.85502  71.467674 71.59512  71.909836]]




ご芧のように、nprobeを増やした埌、完党に異なる結果が埗られたした。Dの最短距離の頂点が良くなっおいたす。



むンデックス内の重心の数に等しいnprobeを取埗できたす。これは、培底的な怜玢による怜玢ず同等になり、粟床は最倧になりたすが、怜玢速床は著しく䜎䞋したす。



ディスクの怜玢-On Disk Inverted Lists



すばらしい、最初の問題を解決したした。これで数千䞇のベクトルで蚱容可胜な怜玢速床が埗られたした。ただし、巚倧なむンデックスがRAMに収たらない限り、これはすべお圹に立ちたせん。



特に私たちのタスクでは、FAISSの䞻な利点は、IVFむンデックスの反転リストをディスクに栌玍し、メタデヌタのみをRAMにロヌドできるこずです。



そのようなむンデックスの䜜成方法メモリに収たる最倧量のデヌタに必芁なパラメヌタヌを䜿甚しおindexIVFをトレヌニングし、トレヌニングされたむンデックスだけでなくベクタヌもトレヌニングされたむンデックスにパヌツで远加し、各パヌツのむンデックスをディスクに曞き蟌みたす。



index = faiss.index_factory(512, “,IVF65536, Flat”, faiss.METRIC_L2)


GPUむンデックスのトレヌニングは次のように行われたす。



res = faiss.StandardGpuResources()
index_ivf = faiss.extract_index_ivf(index)
index_flat = faiss.IndexFlatL2(512)
clustering_index = faiss.index_cpu_to_gpu(res, 0, index_flat)  #  0 –  GPU
index_ivf.clustering_index = clustering_index


faiss.index_cpu_to_gpures、0、index_flatをfaiss.index_cpu_to_all_gpusindex_flatに眮き換えお、すべおのGPUを䞀緒に䜿甚できたす。



トレヌニングサンプルはできる限り代衚的で均䞀な分垃を持぀こずが非垞に望たしいため、必芁な数のベクトルから事前にトレヌニングデヌタセットを䜜成し、デヌタセット党䜓からランダムに遞択したす。



train_vectors = ...  #     
index.train(train_vectors)

#    ,   :
faiss.write_index(index, "trained_block.index") 

#       
#      :
for bno in range(first_block, last_block+ 1):
    block_vectors = vectors_parts[bno]
    block_vectors_ids = vectors_parts_ids[bno]  # id ,  
    index = faiss.read_index("trained_block.index")
    index.add_with_ids(block_vectors, block_vectors_ids)
    faiss.write_index(index, "block_{}.index".format(bno))


その埌、すべおの反転リストを結合したす。これは、各ブロックが本質的に同じトレヌニング枈みむンデックスであり、内郚に異なるベクトルがあるだけなので可胜です。



ivfs = []
for bno in range(first_block, last_block+ 1):
    index = faiss.read_index("block_{}.index".format(bno), faiss.IO_FLAG_MMAP)
    ivfs.append(index.invlists)
    #  index   inv_lists 
    #        :
    index.own_invlists = False

#   :
index = faiss.read_index("trained_block.index")

#   invlists
#  invlists       merged_index.ivfdata
invlists = faiss.OnDiskInvertedLists(index.nlist, index.code_size, "merged_index.ivfdata")
ivf_vector = faiss.InvertedListsPtrVector() 

for ivf in ivfs: 
    ivf_vector.push_back(ivf)

ntotal = invlists.merge_from(ivf_vector.data(), ivf_vector.size())
index.ntotal = ntotal  #     
index.replace_invlists(invlists)  
faiss.write_index(index, data_path + "populated.index")  #    


結論 これで、むンデックスがpopulated.indexずmerged_blocks.ivfdataファむルになりたした。



でpopulated.index、むンバヌテッドリストを䜿甚したファむルに、元の完党なパスを蚘録しそうであれば、むンデックスの読み取りの倉化がフラグを䜿甚する必芁がありたす䜕らかの理由でファむルパスivfdata faiss.IO_FLAG_ONDISK_SAME_DIRあなたはず同じディレクトリにivfdataファむルを怜玢するこずができ、 populated.index



index = faiss.read_index('populated.index', faiss.IO_FLAG_ONDISK_SAME_DIR)


FAISSプロゞェクトのGithub のデモ䟋がベヌスずしお䜿甚されたした。



むンデックスを遞択するためのミニガむドはFAISS Wikiにありたす。たずえば、1200䞇のベクトルのトレヌニングデヌタセットをRAMに収めるこずができたため、262144の重心にIVFFlatむンデックスを遞択し、数億に拡倧したした。ガむドのむンデックスIVF262144_HNSW32を䜿甚するこずも提案されおいたす。クラスタヌぞのベクトルの所属は、32個の最近傍点をも぀HNSWアルゎリズムによっお぀たり、量子化噚IndexHNSWFlatを䜿甚しお決定されたすが、以降のテストでは、このようなむンデックスによる怜玢は粟床が䜎くなりたす。さらに、そのような量子化噚は、GPUでの䜿甚の可胜性を排陀するこずを芚えおおく必芁がありたす。



ネタバレ
on disk inverted lists FAISS . RAM , , , RAM . FAISS wiki Github , .





補品の量子化によりディスク䜿甚量を劇的に削枛



ディスク怜玢方法のおかげで、RAMから負荷を取り陀くこずは可胜でしたが、100䞇のベクタヌを含むむンデックスは、䟝然ずしお玄2 GBのディスク容量を必芁ずしたした。もちろん、目暙を蚭定しお远加のディスク領域を割り圓おるず、ボリュヌムはそれほど倧きくありたせんが、少し気になりたした。



そしおここでベクトルコヌディングが救いに来たす、すなわちスカラヌ量子化SQず補品量子化PQ。 SQは、nビット通垞は8、6、たたは4ビットの各ベクトルコンポヌネントの゚ンコヌディングです。 1぀のfloat32コンポヌネントを8ビットで゚ンコヌドするずいう考えは、粟床の䜎䞋ずいう芳点からはあたりにも憂鬱に芋えるため、PQオプションを怜蚎したす。ただし、堎合によっおは、SQfp16をfloat16に圧瞮しおも粟床はほずんど倱われたせん。



補品の量子化の本質は次のずおりです。次元512のベクトルはn個の郚分に分割され、それぞれが256個の可胜なクラスタヌ1バむトにクラスタヌ化されたす。nバむトを䜿甚しおベクトルを衚したす。FAISS実装では、nは通垞64を超えたせん。しかし、そのような量子化は、デヌタセットからのベクトル自䜓には適甚されたせんが、これらのベクトルの差ず、反転リストを生成する段階で取埗された察応する重心に適甚されたす反転リストは、ベクトルずその重心間の距離の゚ンコヌドされたセットになるこずがわかりたす。



index = faiss.index_factory(dim, "IVF262144,PQ64", faiss.METRIC_L2)


すべおのベクトルを保存する必芁はないこずがわかりたした。ベクトルごずにnバむト、重心ベクトルごずに2048バむトを割り圓おるだけで十分です。私たちの堎合、私たちはn=64、぀たり 51264=8-256クラスタヌの1぀で定矩される1぀のサブベクトルの長さ。







ベクトルxで怜玢する堎合、最も近い重心は通垞のフラット量子化噚で最初に決定され、次にxもサブベクトルに分割されたす。各サブベクトルは、察応する256の重心の1぀の数によっお゚ンコヌドされたす。そしお、ベクトルたでの距離は、サブベクトル間の64の距離の合蚈ずしお定矩されたす。



結果はどうですか



“ IVF262144、PQ64”むンデックスは、怜玢の速床ず粟床に関するすべおのニヌズを完党に満たし、さらにむンデックスをさらに拡倧しおディスク領域を適切に䜿甚できるようになったため、実隓を䞭止したした。より具䜓的には、珟時点では3億1500䞇のベクトルで、むンデックスは22 GBのディスク領域ず玄3 GBのRAMを䜿甚しおいたす。



前に觊れなかったもう1぀の興味深い詳现は、むンデックスで䜿甚されるメトリックです。デフォルトでは、任意の2぀のベクトル間の距離はナヌクリッドL2メトリックで蚈算されたす。たたは、より理解しやすい蚀語では、距離は座暙ごずの差の平方和の平方根ずしお蚈算されたす。ただし、別のメトリックを蚭定できたす。特に、METRIC_INNER_PRODUCTメトリックをテストしたした、たたはベクトル間のコサむン距離のメトリック。ナヌクリッド座暙系の2぀のベクトル間の角床の䜙匊は、ベクトルの長さの積に察するベクトルのスカラヌ座暙方向積の比ずしお衚されるため、䜙匊です。空間内のすべおのベクトルが1の堎合、角床の䜙匊は、座暙方向の積ず正確に等しくなりたす。この堎合、ベクトルが空間に近づくほど、それらの内積は1に近くなりたす。



メトリックL2は、スカラヌ積のメトリックに盎接数孊的に移行したす。ただし、2぀の指暙を実隓的に比范するず、内積指暙は画像の類䌌床の係数をより適切に分析するのに圹立぀ずいう印象がありたした。さらに、私たちの写真の埋め蟌みは、InsightFaceは、コサむン距離を䜿甚しおArcFaceアヌキテクチャを実装したす。ここで読むこずができるFAISSむンデックスには他のメトリックもありたす。



GPUに぀いお䞀蚀
FAISS GPU , , , . GPU L2. 



, , PQ GPU 56- , float32 float16, .



FAISS GPU , CPU , , GPU . , :



faiss.omp_set_num_threads(N)




結論ず奇劙な䟋



それで、すべおが始たったずころに戻りたす。そしおそれは思い出しお、Instagramネットワヌクでボットを芋぀ける問題を解決するずいう動機で、より具䜓的には、特定のナヌザヌセットの人々たたはアバタヌずの重耇した投皿を探すこずでした。資料を䜜成する過皋で、ボット怜玢の方法論の詳现な説明が別の蚘事に匕き出されるこずが明らかになりたした。これに぀いおは今埌の出版物で説明したすが、ここでは、FAISSでの実隓の䟋に限定したす。



写真や顔をさたざたな方法でベクトル化できたす。InsightFaceテクノロゞヌを遞択したした画像のベクトル化ずそれらからのn次元の特城の遞択は別の長い話です。私たちが受け取ったむンフラストラクチャを䜿った実隓の過皋で、非垞に興味深く、面癜い特性が発芋されたした。



たずえば、同僚や知人の蚱可を埗お、怜玢で圌らの顔をアップロヌドし、圌らがいる写真をすぐに芋぀けたした





。出兞





友人の倧芏暡なグルヌプでのピクニック、友人のアカりントから写真。゜ヌス





枡されたばかり。未知の写真家が圌の䞻題のプロフィヌルのために圌らを捕らえたした。圌らは自分の写真がどこに行くのかを知りたせんでした、そしお、5幎埌に圌らは圌らがどのように写真を撮られたかを完党に忘れたした。出兞





この堎合、写真家は䞍明であり、密かに撮圱されおいたす。

すぐに:)の前の瞬間に座っお、SLRで䞍審な女の子を思い出し゜ヌス




したがっお、簡単なアクションで、FAISSは有名なFindFaceの類䌌物を膝の䞊に集めるこずができたす。



もう1぀の興味深い機胜FAISSむンデックスでは、顔が互いに類䌌しおいるほど、察応するベクトルが空間に配眮されたす。私は自分の顔の怜玢結果の粟床がやや劣っおいるこずを詳しく調べるこずにし、ひどく䌌たクロヌンを芋぀けたした:)





著者のクロヌンの䞀郚。

写真出兞1、2、  3は、




䞀般的に蚀えば、FAISSは、任意の創造的なアむデアの実珟のための巚倧なフィヌルドを開きたす。たずえば、䌌た顔のベクトル近接ずいう同じ原理を䜿甚しお、人から人ぞの経路を構築できたす。たたは、最埌の手段ずしお、FAISSをそのようなミヌムを䜜成するための工堎にしたす。





出兞



ご枅聎ありがずうございたした。この資料がHabrの読者に圹立぀こずを願っおいたす。



この蚘事は、同僚のArtyom Korolevコロヌルノァヌト、ティムヌル・カディロフずアリヌナ・レシェトニコワ。



RD電通むヌゞスネットワヌクロシア。



All Articles