Ir para o conteúdo principal

Buscar no CooLWJ

选择搜索范围,输入关键词后按回车。

Idioma

O que é um banco de dados vetorial?

I. Fluxo completo de aplicação de grandes modelos

1.png

  1. Construção de clusters de IA:infraestrutura de computação, comunicação e armazenamento

  2. Dados para grandes modelos:conjuntos de dados, processamento de dados e bancos de dados vetoriais

  3. Algoritmos de grandes modelos: do NLP tradicional aos grandes modelos de linguagem pré-treinados (LLM)

  4. Treinamento de grandes modelos: métodos algorítmicos comuns e análise de estabilidade no treinamento de grandes modelos

  5. Paralelismo distribuído: paralelismo de modelo, de dados, de otimizador etc.

  6. Ajuste fino de grandes modelos: algoritmos de ajuste fino de todos os parâmetros, de poucos parâmetros e por instruções

  7. Inferência de grandes modelos: compressão por quantização, inferência com extensão de sequências longas e métodos de cache

  8. Avaliação de grandes modelos:tarefas posteriores de NLP, tarefas posteriores de CV e planos de avaliação

  9. Agentes de grandes modelos de linguagem:processo de RLHF, agentes e aprendizado ao longo da vida

II、Vetores

Quem conhece cães consegue distinguir rapidamente suas raças. Conseguimos fazer isso porque observamos suas características sob diferentes aspectos, como o tamanho do corpo.
2.pngSe usarmos um eixo de coordenadas para representar o tamanho desses cães, eles ocuparão posições diferentes. No entanto, depender apenas dessa característica não basta, pois alguns têm portes muito semelhantes.
3.pngObservamos então outra característica, como o comprimento dos pelos, e criamos mais um eixo de coordenadas; assim, conseguimos distinguir parte dos cães que têm o mesmo porte
4.pngMas ainda há uma parte que se sobrepõe, por isso é preciso continuar observando por mais ângulos, como o comprimento do nariz.
5.pngTambém podemos acrescentar mais dimensões, como o tamanho dos olhos. Não conseguimos desenhar em um espaço de quatro dimensões, mas é muito fácil representar isso numericamente nas coordenadas dos pontos: basta continuar acrescentando valores ao final.
6.pngTambém podemos observar as características de um cachorro por mais ângulos, ou dimensões, como a espessura das pernas, a curvatura dos pelos e até aspectos abstratos, como obediência, utilidade etc. Quanto mais dimensões usamos, maior é nossa capacidade de distinguir os cachorros. Ao mesmo tempo, maior também é a dimensionalidade do espaço em que se encontra o ponto de coordenadas.
7.pngNão apenas os cachorros: na verdade, quase qualquer coisa pode ser representada dessa forma. Pode ser algo concreto, ou algo abstrato, como alegria, raiva, tristeza e prazer, encontros e despedidas. Coisas diferentes apresentam comportamentos, ou valores, diferentes nas diversas dimensões de características; por isso, cada uma acaba correspondendo a um ponto de coordenadas em um espaço de características de alta dimensionalidade. Porém, em contextos mais amplos, talvez precisemos de mais dimensões de características para distinguir bem as coisas. Podem ser centenas, milhares ou até dezenas de milhares.
8.pngMas, como não conseguimos criar gráficos com mais de três dimensões, usaremos coordenadas bidimensionais para explicar.
9.pngVeremos que os pontos conceitualmente mais próximos ficam mais agrupados no espaço, enquanto aqueles conceitualmente muito diferentes ficam bem distantes entre si. Indo além, tomando a origem das coordenadas como ponto inicial e esses pontos de coordenadas como pontos finais, temos vetores com direção e magnitude.

Ao vetorizar imagens, é possível implementar a busca por imagem pesquisando vetores semelhantes
Se os vídeos forem vetorizados, a busca por vetores semelhantes permitirá recomendar vídeos semelhantes
Se os produtos forem representados como vetores, a busca por vetores semelhantes permite fazer recomendações relacionadas ao produto que o usuário está visualizando
Ao vetorizar textos, é possível, em um sistema inteligente de perguntas e respostas, encontrar perguntas semelhantes já resolvidas para servir de referência, com base na pergunta atual do usuário

III、Bancos de dados vetoriais

Com a chegada da IA, os vetores se tornarão uma forma importante de dados. Os bancos de dados tradicionais não são adequados para armazenar e recuperar dados vetoriais, por isso é necessário um banco de dados projetado especificamente para lidar com essas questões, o que talvez venha a se tornar parte da infraestrutura da camada de dados no futuro. Diferentemente dos bancos de dados tradicionais, que armazenam tabelas de dados e depois usam instruções de consulta para realizar buscas precisas, os bancos de dados vetoriais armazenam dados vetoriais, e o processo de consulta consiste em buscar no banco alguns vetores que sejam os mais semelhantes ao vetor da consulta, apresentando certo grau de imprecisão.

Diagrama de pontos de dados vetoriais no espaço tridimensional

1、Consulta vetorial

Uma das principais aplicações dos dados vetoriais é: dado um vetor de consulta, encontrar, entre muitos vetores, alguns dos mais semelhantes a ele. Esse é o chamado problema dos vizinhos mais próximos, e os algoritmos que fazem isso são chamados de algoritmos de vizinhos mais próximos. Uma das abordagens mais intuitivas talvez seja a busca por força bruta: comparar, um a um, todos os vetores com o vetor de consulta e selecionar os que apresentam maior similaridade. Existem muitos métodos específicos para comparar a similaridade entre dois vetores,Distância euclidiana e similaridade de cosseno.
10.png

  • A distância euclidiana consiste em calcular a distância em linha reta entre dois vetores. Em um sistema de coordenadas bidimensional, supondo dois vetores p e q, a distância euclidiana calcula o comprimento da linha reta que liga p a q. Em um sistema tridimensional, cada vetor contém três coordenadas, x, y e z, e a fórmula permite calcular a distância entre quaisquer dois pontos. Já em um sistema de n dimensões, há 100 coordenadas, e a fórmula permite calcular a distância entre quaisquer dois pontos. Quanto menor a distância, maior a semelhança entre esses dois vetores em determinadas dimensões
    11.png

  • Outra abordagem é a similaridade de cosseno. Além da distância, também podemos descrever a relação entre vetores pelo ângulo entre eles. Em um sistema de coordenadas bidimensional, quanto menor o ângulo, maior a relação entre os dois vetores. Podemos usar uma fórmula para calcular a similaridade de cosseno entre quaisquer dois vetores. Em um sistema de coordenadas tridimensional, o mesmo princípio também pode ser usado para calcular o ângulo e a similaridade de cosseno entre quaisquer dois vetores.
    12.png
    Porém, se houver vetores demais, esse método de força bruta, sem qualquer sofisticação técnica, resultará em um tempo de busca extremamente alto. A qualidade dessa busca, contudo, é de fato perfeita, pois ela realmente compara cada vetor. Assim, se o volume de dados no banco for relativamente pequeno e o tempo necessário para percorrer todos os vetores for aceitável, essa também pode ser uma boa abordagem. Entretanto, nas aplicações reais, o volume de dados geralmente não é tão pequeno, portanto é preciso encontrar maneiras de otimizar a busca.

2、Índice vetorial

Anteriormente, explicamos o princípio de busca dos bancos de dados vetoriais, mas, na prática, ao comparar similaridades nesses bancos, não podemos simplesmente calcular tudo pelas fórmulas, pois o volume de dados costuma ser muito grande e a dimensionalidade também é alta. Calcular pela fórmula a similaridade entre dois vetores de 1000 dimensões exige muitos cálculos e uso intensivo da CPU. Se houver cem milhões de vetores e for necessário fazer esse cálculo para cada um, o tempo e o custo computacional serão ainda maiores. Por isso, introduzimos aqui um conceito chamado índice vetorial.
O índice vetorial é semelhante ao índice de um banco de dados relacional, mas há uma diferença. Em um banco de dados vetorial, os resultados encontrados pelo índice vetorial são aproximados, em vez de 100% precisos.O índice vetorial descreve quão alto ou baixo é o grau de similaridade. Por isso, chamamos isso de busca aproximada do vizinho mais próximo(ANS). Sem um índice vetorial, buscar a similaridade de um vetor é semelhante a fazer uma varredura completa de tabela em um banco de dados relacional. Porém, além da varredura completa, há uma camada adicional de cálculo, tornando o custo muito maior do que o de uma varredura completa de tabela em um banco de dados relacional.
De acordo com a forma de implementação, os índices vetoriais ANNS podem ser divididos em quatro grandes categorias:

  • Índice baseado em árvore

  • Índice baseado em grafos

  • Índices baseados em hash

  • Índices baseados em quantização

1、Métodos baseados em árvores

A ideia principal dos métodos baseados em árvores é particionar os dados, de maneira semelhante a uma árvore binária de busca, reduzindo o espaço de busca durante a pesquisa para permitir uma recuperação rápida. Porém, esse método não é adequado para espaços de alta dimensionalidade. Os principais métodos baseados em árvores são KDTree(K-Dimensional Tree)e Annoy(Approximate Nearest Neighbors Oh Yeah).
1.1 KDTree
A construção de uma KDTree também se baseia na ideia de particionamento recursivo: primeiro, seleciona-se a dimensão com maior variância e usa-se a mediana de todos os dados nessa dimensão como ponto de divisão, separando a região hiper-retangular em duas sub-regiões; os valores menores que a mediana são colocados à esquerda, e os valores menores que a mediana são colocados à direita. As subárvores esquerda e direita são construídas recursivamente até que todos os dados tenham sido particionados.
13.png

Processo de busca baseado em KDTree:
1、Para o dado de consulta p e a dimensão de divisão d do nó atual, compare o valor da coordenada de p na dimensão d com o valor do nó. Se for maior, siga para o nó filho esquerdo;se for menor, siga para o nó filho direito;
2、Continue percorrendo até chegar a um nó folha, marque-o como visitado e calcule a distância até ele, tomando-a como a menor distância;
3、Realize o retrocesso nos nós folha; a cada retrocesso, verifique a distância entre p e o ramo ainda não visitado do nó pai.
a)Se a distância entre esse nó de ramificação e p for maior que a menor distância atual, continue retrocedendo para cima até chegar ao nó raiz;
b)Se a distância entre esse nó de ramificação e p for menor que a menor distância atual, siga essa ramificação e execute as etapas 1 e 2 até o nó folha, atualizando a menor distância entre a folha e Q.
14.png

1.2Annoy
O Annoy usa hiperplanos para dividir o espaço. Para encontrar o hiperplano, usa KMeans(k=2) para localizar dois centros de agrupamento; o plano perpendicular à linha que une esses centros é o hiperplano de divisão. O processo se repete até que o número de dados em cada subespaço fique abaixo do limite especificado.
 15.png16.png17.png

18.png

Para buscar qualquer ponto nesse espaço, pode-se percorrer a árvore binária a partir da raiz. Cada nó intermediário(os pequenos quadrados na árvore acima)define um hiperplano, que permite determinar se a busca deve continuar pelo filho esquerdo ou pelo filho direito. A busca de um ponto pode ser concluída em tempo logarítmico, correspondente à altura da árvore.

Vantagens: maior precisão com dados de baixa dimensionalidade Desvantagens: não consegue capturar plenamente a complexidade dos dados, menor precisão com dados de alta dimensionalidade

2、Métodos baseados em grafos

Os métodos baseados em grafos usam principalmente essa estrutura de dados e aproveitam a conectividade entre nós vizinhos para construir vias rápidas, transformando o problema em uma travessia do grafo. Assim, conseguem reduzir rapidamente o espaço de busca e acelerar a recuperação. Porém, grafos são estruturas de dados relativamente complexas e, para atingir a máxima velocidade de recuperação, geralmente são carregados inteiros na memória, o que gera um consumo de memória muito alto. Em compensação, a recuperação é rápida e a revocação é alta.

Atualmente, o principal algoritmo de busca em grafos de uso comum é o HNSW (Hierarchical Navigating Small World), enquanto o NSW (Navigating Small World) é seu antecessor e também merece ser conhecido.
2.1 NSW
O NSW acrescenta as seguintes convenções à construção ingênua do grafo:todos os nós devem ter nós vizinhos;os nós vizinhos devem estar conectados por arestas;a quantidade de vizinhos próximos é um hiperparâmetro definido pelo usuário. Isso serve principalmente para resolver algumas limitações do método ingênuo de construção de grafos.
19.pngProcesso de construção do grafo NSW:
Ao inserir um novo nó, primeiro encontre os m nós mais próximos dele e conecte o novo nó a esses m nós.
Processo de busca NSW:
Para o dado de consulta q, encontre aleatoriamente no grafo um nó de entrada e seus nós vizinhos, calcule as distâncias do nó de entrada e dos vizinhos até p e, se algum vizinho estiver mais perto de p do que o nó de entrada, defina o ponto de menor distância, até encontrar um ponto cujos vizinhos estejam todos mais distantes da consulta do que esse ponto.
Como mostrado na figura acima, para buscar no grafo de vizinhos já construído o nó mais próximo do nó verde de consulta, parte-se de pontos de entrada escolhidos aleatoriamente. Primeiro, os enlaces longos em vermelho levam rapidamente aos nós próximos à consulta;depois, os enlaces curtos em preto permitem encontrar o ponto que atende ao critério.
NSW também é um cálculo aproximado e não pode garantir que o resultado seja o verdadeiro vizinho mais próximo. Os pontos inseridos primeiro têm mais arestas redundantes e maior probabilidade de formar vias expressas; quanto mais tarde um ponto é inserido, menor é a probabilidade de ter uma via expressa.
2.1 HNSW
O HNSW é um aperfeiçoamento do NSW que usa principalmente a ideia das listas de saltos e uma estrutura em camadas. Cada camada é um NSW, por isso também pode ser chamado de método NSW hierárquico. Quanto mais alta a camada, mais esparsos são os nós e maior é a distância entre eles; quanto mais baixa, mais nós e conexões existem, e menor é a distância média.
20.png

Vantagem: permite encontrar vizinhos próximos semelhantes em dados de alta dimensionalidade, melhorando o desempenho da busca. Desvantagem: a construção do grafo é complexa e afeta a eficiência de uso da memória.

3、Método baseado em hash

Os métodos baseados em hash utilizam principalmente as propriedades das funções hash: dados com alta similaridade também têm valores hash semelhantes. As funções hash podem transformar dados de alta dimensionalidade em dados de baixa dimensionalidade, aumentando muito a eficiência da construção do índice. Porém, elas também têm outra limitação: dados com valores hash semelhantes não são necessariamente semelhantes, o que faz com que a taxa de recuperação desse método não seja muito alta. O principal método baseado em hash é o LSH (Hashing Sensível à Localidade). Supõe-se que, se dois vetores são semelhantes, seus valores hash também serão semelhantes. Uma função hash é usada para mapear vetores semelhantes para o mesmo bucket. Na consulta, primeiro se encontra o bucket mais semelhante ao vetor de consulta e, depois, consultam-se os dados desse bucket para calcular os topk mais semelhantes.
21.pngLSH(hash sensível à localização) também é um método baseado na divisão do espaço, implementado da seguinte forma, como mostra a figura abaixo, gera-se aleatoriamente uma reta que distingue um lado positivo e um negativo, se um vetor estiver no lado positivo dessa reta, ele recebe 1, e, no lado negativo, 0, depois gera-se aleatoriamente outra reta, também com 1 para o lado positivo e 0 para o negativo;ao gerar várias retas assim, calculamos para cada vetor 4 valores 0 ou 1, obtendo para cada um um código binário de 4 bits. Agora vamos observar o grau de semelhança entre esses 4 códigos binários.
22.png23.png24.png25.png26.png27.png

Vantagem: processamento muito rápido ao ampliar para grandes volumes de dados; desvantagem: precisão mediana

5、Índices baseados em quantização

5.1、Agrupamento
Se pudermos delimitar uma região aproximada para buscar o vetor de consulta e então realizar a busca nessa região, a velocidade da busca poderá aumentar muito. Primeiro, escolhemos a quantidade de grupos desejada, por exemplo, os 4 grupos da figura abaixo, e geramos aleatoriamente 4 pontos centrais. Cada vetor é atribuído ao centro mais próximo. Depois, calculamos um vetor médio com os vetores atualmente atribuídos a cada grupo, movemos o centro para esse ponto médio e verificamos novamente qual centro está mais próximo de cada vetor, reclassificando-os. Esse processo repetitivo se chama treinamento; ao final, os centros tendem a se estabilizar, ou seja, a convergir. Na busca, basta encontrar o centro de agrupamento mais próximo do vetor de consulta e pesquisar os vetores desse agrupamento. Assim, atinge-se o objetivo de reduzir o espaço de busca
29.png29.png

5.2、Quantização
Mas, para grandes volumes de dados vetoriais, além da velocidade de busca, o consumo de memória também é um enorme desafio. Na prática, em aplicações reais, vetores com milhares de dimensões e conjuntos com centenas de milhões de vetores não são incomuns, de modo que o consumo de memória pode ser muito elevado.
30.png

Com o agrupamento acima, conhecemos o ponto central, que na verdade se chama centroide. Será que podemos usar o centroide para representar os pontos do agrupamento? Provavelmente sim; na verdade, esse método é um exemplo típico de Compressão com perdas ,se usarmos uma imagem como exemplo, será assim:
31.png32.png

Embora isso cause a perda de parte dos valores dos vetores, considerando o grau de correlação entre o centroide de um agrupamento e os vetores que pertencem a ele, boa parte das informações originais é preservada. E os benefícios obtidos são bastante expressivos em comparação com a perda de alguns detalhes causada por essa compressão com perdas. O armazenamento pode ser feito conforme a figura abaixo: ao usar determinado vetor, seu código é usado para encontrar o centroide correspondente no livro de códigos e, então, recuperar os valores concretos desse centroide. Representar um vetor pelo código de seu centroide é o que se chama de quantização vetorial(Quantization)
33.png

5.3、Quantização por produto PQ(Product Quantization)
Após quantizar os vetores, surge um elemento adicional: um livro de códigos. O consumo de memória dos próprios vetores certamente diminui, mas esse livro de códigos gera um novo consumo de memória, e bastante grande. Isso ainda não é tão perceptível em poucas dimensões, mas, nas centenas ou milhares de dimensões dos vetores em cenários reais, esse livro de códigos pode atingir proporções assustadoras. Mantendo uma quantidade fixa, para garantir a qualidade da quantização, quanto mais esparsa for a distribuição dos vetores, mais vetores de agrupamento serão necessários.
34.png35.png36.png37.png39.png39.png


Para as centenas ou milhares de dimensões dos vetores em aplicações reais, os dados ficam muito esparsos. Assim, em espaços de alta dimensionalidade, para garantir a qualidade da quantização, podemos precisar de um número muito grande de agrupamentos. Um caso típico é mostrado na figura abaixo: um vetor de 128 dimensões pode exigir 2 elevado a 64 centros de agrupamento, o que torna enorme o livro de códigos usado para registrar a codificação dos centroides. A memória consumida para armazenar esse livro de códigos já supera em muito a memória economizada pela própria quantização
40.pngA solução para esse problema é primeiro dividir o vetor de alta dimensionalidade em vários subvetores de baixa dimensionalidade e, depois, quantizá-los de forma independente. Por exemplo, dividir um vetor de 128 dimensões em 8 subvetores de 16 dimensões e, em seguida, realizar o treinamento de agrupamento de forma independente em cada um dos 8 subvetores de 16 dimensões.
42.png42.png

Assim, cada vetor pode usar os resultados do treinamento de 8 subespaços para quantizar seus 8 subvetores correspondentes, e a dimensão de cada vetor de caractere é 16, o que não é muito alto, portanto cada subespaço de 16 dimensões precisa de apenas 256 agrupamentos para obter um resultado de quantização razoavelmente bom, de modo que o código de cada vetor de caractere fica no intervalo 0-255, e a combinação dos códigos de quantização dos 8 subvetores fornece o código de quantização final do vetor original, ou seja, agora um vetor é quantizado em 8 códigos, e cada subespaço também constrói seu próprio sublivro de códigos, de modo que, durante o uso, os 8 códigos são usados para consultar nos sublivros de códigos os 8 vetores de caractere de 16 dimensões e depois combiná-los, reconstruindo um vetor de 128 dimensões
45.png45.png45.png46.png


Comentários

Enviando

Escolha seu tema

O tema é aplicado a todo o site.