103 lines
6.1 KiB
Markdown
103 lines
6.1 KiB
Markdown
|
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.
|