|
pONTAS de afinação FAISS |
|
================== |
|
# sobre faiss |
|
faiss é uma biblioteca de pesquisas de vetores densos na área, desenvolvida pela pesquisa do facebook, que implementa com eficiência muitos métodos de pesquisa de área aproximada. |
|
A Pesquisa Aproximada de área encontra vetores semelhantes rapidamente, sacrificando alguma precisão. |
|
|
|
## faiss em RVC |
|
No RVC, para a incorporação de recursos convertidos pelo HuBERT, buscamos incorporações semelhantes à incorporação gerada a partir dos dados de treinamento e as misturamos para obter uma conversão mais próxima do discurso original. No entanto, como essa pesquisa leva tempo se realizada de forma ingênua, a conversão de alta velocidade é realizada usando a pesquisa aproximada de área. |
|
|
|
# visão geral da implementação |
|
Em '/logs/nome-do-seu-modelo/3_feature256', onde o modelo está localizado, os recursos extraídos pelo HuBERT de cada dado de voz estão localizados. |
|
A partir daqui, lemos os arquivos npy ordenados por nome de arquivo e concatenamos os vetores para criar big_npy. (Este vetor tem a forma [N, 256].) |
|
Depois de salvar big_npy as /logs/nome-do-seu-modelo/total_fea.npy, treine-o com faiss. |
|
|
|
Neste artigo, explicarei o significado desses parâmetros. |
|
|
|
# Explicação do método |
|
## Fábrica de Index |
|
Uma fábrica de Index é uma notação faiss exclusiva que expressa um pipeline que conecta vários métodos de pesquisa de área aproximados como uma string. |
|
Isso permite que você experimente vários métodos aproximados de pesquisa de área simplesmente alterando a cadeia de caracteres de fábrica do Index. |
|
No RVC é usado assim: |
|
|
|
```python |
|
index = faiss.index_factory(256, "IVF%s,Flat" % n_ivf) |
|
``` |
|
Entre os argumentos de index_factory, o primeiro é o número de dimensões do vetor, o segundo é a string de fábrica do Index e o terceiro é a distância a ser usada. |
|
|
|
Para uma notação mais detalhada |
|
https://github.com/facebookresearch/faiss/wiki/The-index-factory |
|
|
|
## Construção de Index |
|
Existem dois Indexs típicos usados como similaridade de incorporação da seguinte forma. |
|
|
|
- Distância euclidiana (MÉTRICA_L2) |
|
- Produto interno (METRIC_INNER_PRODUCT) |
|
|
|
A distância euclidiana toma a diferença quadrática em cada dimensão, soma as diferenças em todas as dimensões e, em seguida, toma a raiz quadrada. Isso é o mesmo que a distância em 2D e 3D que usamos diariamente. |
|
O produto interno não é usado como um Index de similaridade como é, e a similaridade de cosseno que leva o produto interno depois de ser normalizado pela norma L2 é geralmente usada. |
|
|
|
O que é melhor depende do caso, mas a similaridade de cosseno é frequentemente usada na incorporação obtida pelo word2vec e modelos de recuperação de imagem semelhantes aprendidos pelo ArcFace. Se você quiser fazer a normalização l2 no vetor X com numpy, você pode fazê-lo com o seguinte código com eps pequeno o suficiente para evitar a divisão 0. |
|
|
|
```python |
|
X_normed = X / np.maximum(eps, np.linalg.norm(X, ord=2, axis=-1, keepdims=True)) |
|
``` |
|
|
|
Além disso, para a Construção de Index, você pode alterar o Index de distância usado para cálculo escolhendo o valor a ser passado como o terceiro argumento. |
|
|
|
```python |
|
index = faiss.index_factory(dimention, text, faiss.METRIC_INNER_PRODUCT) |
|
``` |
|
|
|
## FI |
|
IVF (Inverted file indexes) é um algoritmo semelhante ao Index invertido na pesquisa de texto completo. |
|
Durante o aprendizado, o destino da pesquisa é agrupado com kmeans e o particionamento Voronoi é realizado usando o centro de cluster. A cada ponto de dados é atribuído um cluster, por isso criamos um dicionário que procura os pontos de dados dos clusters. |
|
|
|
Por exemplo, se os clusters forem atribuídos da seguinte forma |
|
|index|Cluster| |
|
|-----|-------| |
|
|1|A| |
|
|2|B| |
|
|3|A| |
|
|4|C| |
|
|5|B| |
|
|
|
O Index invertido resultante se parece com isso: |
|
|
|
| cluster | Index | |
|
|-------|-----| |
|
| A | 1, 3 | |
|
| B | 2 5 | |
|
| C | 4 | |
|
|
|
Ao pesquisar, primeiro pesquisamos n_probe clusters dos clusters e, em seguida, calculamos as distâncias para os pontos de dados pertencentes a cada cluster. |
|
|
|
# Parâmetro de recomendação |
|
Existem diretrizes oficiais sobre como escolher um Index, então vou explicar de |
|
acordo. https://github.com/facebookresearch/faiss/wiki/Guidelines-to-choose-an-index |
|
|
|
Para conjuntos de dados abaixo de 1M, o 4bit-PQ é o método mais eficiente disponível no faiss em abril de 2023. |
|
Combinando isso com a fertilização in vitro, estreitando os candidatos com 4bit-PQ e, finalmente, recalcular a distância com um Index preciso pode ser descrito usando a seguinte fábrica de Indexs. |
|
|
|
```python |
|
index = faiss.index_factory(256, "IVF1024,PQ128x4fs,RFlat") |
|
``` |
|
|
|
## Parâmetros recomendados para FIV |
|
Considere o caso de muitas FIVs. Por exemplo, se a quantização grosseira por FIV for realizada para o número de dados, isso é o mesmo que uma pesquisa exaustiva ingênua e é ineficiente. |
|
Para 1M ou menos, os valores de FIV são recomendados entre 4*sqrt(N) ~ 16*sqrt(N) para N número de pontos de dados. |
|
|
|
Como o tempo de cálculo aumenta proporcionalmente ao número de n_sondas, consulte a precisão e escolha adequadamente. Pessoalmente, não acho que o RVC precise de tanta precisão, então n_probe = 1 está bem. |
|
|
|
## FastScan |
|
O FastScan é um método que permite a aproximação de alta velocidade de distâncias por quantização de produto cartesiano, realizando-as em registros. |
|
A quantização cartesiana do produto executa o agrupamento independentemente para cada dimensão d (geralmente d = 2) durante o aprendizado, calcula a distância entre os agrupamentos com antecedência e cria uma tabela de pesquisa. No momento da previsão, a distância de cada dimensão pode ser calculada em O(1) olhando para a tabela de pesquisa. |
|
Portanto, o número que você especifica após PQ geralmente especifica metade da dimensão do vetor. |
|
|
|
Para uma descrição mais detalhada do FastScan, consulte a documentação oficial. |
|
https://github.com/facebookresearch/faiss/wiki/Fast-accumulation-of-PQ-and-AQ-codes-(FastScan) |
|
|
|
## RFlat |
|
RFlat é uma instrução para recalcular a distância aproximada calculada pelo FastScan com a distância exata especificada pelo terceiro argumento da Construção de Index. |
|
Ao obter áreas k, os pontos k*k_factor são recalculados. |
|
|