Spaces:
Runtime error
Runtime error
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. | |