Desde que a OpenAI lançou o modelo o1.Dimensionamento da computação em tempo de teste(Scaling Reasoning) tornou-se um dos tópicos mais quentes nos círculos de IA. Simplificando, em vez de acumular poder de computação na fase de pré-treinamento ou pós-treinamento, é melhor gastar mais recursos computacionais na fase de inferência (ou seja, quando o modelo de linguagem grande gera saída). o1 O modelo divide um problema grande em uma série de problemas pequenos (ou seja, Chain-of-Thought), de modo que o modelo possa pensar como um ser humano, passo a passo, para avaliar diferentes possibilidades, fazer um planejamento mais detalhado, refletir sobre si mesmo antes de dar uma resposta etc. O modelo pode pensar como um ser humano, avaliando diferentes possibilidades, fazendo um planejamento mais detalhado, refletindo sobre si mesmo antes de dar uma resposta etc. Dessa forma, o modelo não precisa ser treinado novamente, e o desempenho pode ser aprimorado somente por meio de computação adicional durante o raciocínio.Em vez de fazer o modelo aprender mecanicamente, faça-o pensar mais-- Essa estratégia é particularmente eficaz em tarefas de inferência complexas com melhoria significativa nos resultados, e o recente lançamento do modelo QwQ pela Alibaba confirma essa tendência tecnológica: melhorar os recursos do modelo expandindo a computação no momento da inferência.
👩🏫 O escalonamento, neste documento, refere-se ao aumento dos recursos computacionais (por exemplo, aritmética ou tempo) durante o processo de raciocínio. Não se refere ao escalonamento horizontal (computação distribuída) ou ao processamento acelerado (tempo de computação reduzido).
Se você também já usou o modelo o1, com certeza sentirá que o raciocínio em várias etapas consome mais tempo porque o modelo precisa criar cadeias de pensamento para resolver o problema.
Na Jina AI, nós nos concentramos mais em Embeddings e Rerankers do que em Large Language Models (LLMs):É possível aplicar o conceito de "cadeias de pensamento" também ao modelo Embedding?
Embora possa não ser intuitivo à primeira vista, este documento explorará uma nova perspectiva e demonstrará como o Scaling Test-Time Compute pode ser aplicado aoclipe de jina
a fim de proporcionar uma melhor compreensão de Imagens fora de domínio (OOD) complicadas A classificação é realizada para resolver tarefas impossíveis.
Fizemos experiências com o reconhecimento de Pokémon, que ainda é bastante desafiador para modelos vetoriais. Um modelo como o CLIP, embora seja forte na correspondência imagem-texto, tende a se enrolar quando encontra dados fora do domínio (OOD) que o modelo nunca viu antes.
No entanto, descobrimos queA precisão da classificação de dados fora do domínio pode ser aprimorada com o aumento do tempo de inferência do modelo e com o emprego de uma estratégia de classificação multiobjetivo semelhante à cadeia de raciocínio que não exige o ajuste do modelo.
Estudo de caso: Classificação de imagens de Pokémon
🔗 Google Colab: https://colab.research.google.com/drive/1zP6FZRm2mN1pf7PsID-EtGDc5gP_hm4Z#scrollTo=CJt5zwA9E2jB
Usamos o conjunto de dados TheFusion21/PokemonCards, que contém milhares de imagens de cartas de Pokémon.Essa é uma tarefa de classificação de imagensque insere um baralho de Pokémon recortado (com a descrição do texto removida) e produz o nome correto do Pokémon. Mas isso é difícil para o modelo CLIP Embedding por vários motivos:
- Os nomes e a aparência dos Pokémon são relativamente novos para o modelo, e é fácil se enrolar com a categorização direta.
- Cada Pokémon tem suas próprias características visuaisOs CLIPs são mais bem compreendidos, como formas, cores e poses.
- O estilo dos cartões é uniforme, no entantoMas os diferentes planos de fundo, poses e estilos de desenho aumentam a dificuldade.
- Essa tarefa requerConsiderar vários recursos visuais simultaneamenteComo a complexa cadeia de pensamento no LLM.
Metodologia de linha de base: comparação direta de similaridade
Vamos começar com a metodologia de linha de base mais simples, a Comparação direta de similaridade entre imagens e nomes de Pokémon.
Em primeiro lugar, é melhor remover todas as informações textuais dos cartões para que o modelo CLIP não precise adivinhar a resposta diretamente do texto. Em seguida, usamos jina-clip-v1
responder cantando jina-clip-v2
O modelo codifica a imagem e o nome do Pokémon separadamente para obter suas respectivas representações vetoriais. Por fim, a similaridade de cosseno entre os vetores de imagem e os vetores de texto é calculada, e o nome que tiver a maior similaridade é considerado o Pokémon da imagem.
Essa abordagem é equivalente a fazer uma correspondência de um para um entre a imagem e o nome, sem levar em conta nenhuma outra informação ou atributo contextual. O pseudocódigo a seguir descreve resumidamente o processo.
# Pré-processamento cropped_images = [crop_artwork(img) for img in pokemon_cards] # Remover texto, manter apenas as imagens pokemon_names = ["Absol", "Aerodactyl", ...] # nomes de pokemon # Obter embeddings com jina-clip-v1 image_embeddings = model.encode_image(cropped_images) text_embeddings = model.encode_text(pokemon_names) # Calcular a similaridade de cosseno para classificação similarities = cosine_similarity(image_embeddings, text_embeddings) predicted_names = [pokemon_names[argmax(sim)] for sim in similarities] # Escolha o nome que tiver a maior similaridade # Avalie a precisão precisão = mean(predicted_names == ground_truth_names)
Avançado: aplicação de cadeias de pensamento à classificação de imagens
Desta vez, em vez de combinar imagens e nomes diretamente, dividimos a identificação do Pokémon em várias partes, como no jogo "Pokémon Connect".
Definimos cinco conjuntos de atributos principais: cor primária (por exemplo, "branco", "azul"), forma primária (por exemplo, "um lobo", "um réptil alado"), características principais (por exemplo, "um chifre branco", "asas grandes"), tamanho do corpo (por exemplo, "forma de lobo com quatro patas ", "alado e esguio") e cenas de fundo (por exemplo, "espaço sideral", "floresta verde").
Para cada conjunto de atributos, criamos uma palavra-chave especial, como "O corpo deste Pokémon é principalmente de cor {}", e depois preenchemos as opções possíveis.Em seguida, usamos o modelo para calcular as pontuações de similaridade da imagem e de cada opção e convertemos as pontuações em probabilidades usando a função softmax, que fornece uma medida melhor da confiança do modelo.
A cadeia de pensamento completa (CoT) consiste em duas partes:classification_groups
responder cantando regras_do_pokemon
O primeiro define a estrutura de questionamento: cada atributo (por exemplo, cor, forma) corresponde a um modelo de pergunta e a um conjunto de possíveis opções de resposta. O último registra quais opções devem ser combinadas para cada Pokémon.
Por exemplo, a cor do Absol deve ser "branco" e sua forma deve ser "lobo". Falaremos mais tarde sobre como criar uma estrutura de CoT completa, e o pokemon_system abaixo é um exemplo concreto de CoT:
pokemon_system = { "classification_cot": { "dominant_colour": { "prompt": "O corpo deste Pokémon tem principalmente a cor {}", "options": [ "white" (branco), # Absol, Absol G "grey" (cinza), # Aggron "marrom", # Aerodactyl, Weedle, Beedrill δ "azul", # Azumarill "verde", # Bulbasaur, Venusaur, Celebi&Venu, Caterpie "amarelo", # Alakazam, Ampharos "vermelho", # Moltres de Blaine "laranja", # Arcanine "azul claro", # Dratini ] } "primary_form": { "prompt": "It looks like {}." , "options": [ "um lobo", # Absol, Absol G "um dinossauro blindado", # Aggron "um réptil alado", # Aerodactyl "uma criatura parecida com um coelho", # Azumarill "uma criatura parecida com um sapo", # Bulbasaur, Venusaur, Celebi&Venu "uma larva de lagarta", # Weedle, Caterpie "um inseto parecido com uma vespa", # Beedrill δ "um humanoide semelhante a uma raposa", # Alakazam "um bípede semelhante a uma ovelha", # Ampharos "uma besta parecida com um cachorro", # Arcanine "um pássaro flamejante", # Moltres de Blaine "um dragão serpentino", # Dratini ] } "key_trait": { "prompt": "Sua característica mais notável é {}." , "options": [ "um único chifre branco", # Absol, Absol G "placas de armadura de metal", # Aggron "asas grandes", # Aerodactyl, Beedrill δ "orelhas de coelho", # Azumarill "um bulbo de planta verde", # Bulbasaur, Venusaur, Celebi&Venu "um pequeno pico vermelho", # Weedle "grandes olhos verdes", # Caterpie "um bigode e colheres", # Alakazam "um orbe de cauda brilhante", # Ampharos "uma juba ardente", # Arcanine "asas flamejantes", # Blaine's Moltres "um pequeno chifre branco na cabeça", # Dratini ] } "body_shape": { "prompt": "A forma do corpo pode ser descrita como {}." , "options": [ "semelhante a um lobo com quatro pernas", # Absol, Absol G "volumoso e blindado", # Aggron "alado e esbelto", # Aerodactyl, Beedrill δ "redondo e rechonchudo", # Azumarill "robusto e com quatro patas", # Bulbasaur, Venusaur, Celebi&Venu "longo e parecido com uma minhoca", # Weedle, Caterpie "ereto e humanoide", # Alakazam, Ampharos "peludo e canino", # Arcanine "semelhante a um pássaro com chamas", # Blaine's Moltres "serpentino", # Dratini ] } "background_scene": { "prompt": "O plano de fundo se parece com {}." , "options": [ "espaço sideral", # Absol G, Beedrill δ "green forest" (floresta verde), # Azumarill, Bulbasaur, Venusaur, Weedle, Caterpie, Celebi&Venu "um campo de batalha rochoso", # Absol, Aggron, Aerodactyl "uma sala psíquica roxa", # Alakazam "um campo ensolarado", # Ampharos "solo vulcânico", # Arcanine "um céu vermelho com brasas", # Moltres de Blaine "um lago azul calmo", # Dratini ] } } "pokemon_rules": { "Absol": { "dominant_colour" (cor dominante): 0, "primary_form": 0, "key_trait": 0, "body_shape": 0, "background_scene": 2 }, "Absol G". "Absol G": { "dominant_colour": 0, "primary_form": 0, "background_scene": 2 }, "Absol G": { "primary_form": 0, "primary_form": 0, "key_trait": 0, "body_shape": 0, "background_scene": 0 }, ... // ... } }
Em suma, em vez de simplesmente comparar as semelhanças uma vez, agora fazemos várias comparações, combinando as probabilidades de cada atributo para que possamos fazer um julgamento mais razoável.
# Processo de classificação def classify_pokemon(image). # Gerar todos os prompts todos_prompts = [] for group in classification_cot. for option in group["options"]: prompt = group["prompt"].format(option) all_prompts.append(prompt) # Obtenha os vetores e sua similaridade image_embedding = model.encode_image(image) text_embeddings = model.encode_text(all_prompts) similarities = cosine_similarity(image_embedding, text_embeddings) # Converta as semelhanças em probabilidades para cada grupo de atributos probabilidades = {} para group_name, group_sims em group_similarities: probabilities[group_name] = {} probabilities[group_name] = softmax(group_sims) # Calcule a pontuação de cada Pokémon com base nos atributos correspondentes scores = {} para pokemon, regras em pokemon_rules.items(): scores = 0 for group, target_idx in rules.items(): score += probabilities[group][target_idx]: {} pontuação += probabilidades[grupo][alvo_idx] pontuação[pokemon] = pontuação return max(scores, key=scores.get) # Retorna o pokemon com a maior pontuação
Análise de complexidade dos dois métodos
Agora vamos analisar a complexidade, supondo que queiramos encontrar o nome que melhor corresponda à imagem dada entre N nomes de Pokémon:
O método de linha de base requer o cálculo de N vetores de texto (um para cada nome) e 1 vetor de imagem, seguido de N cálculos de similaridade (os vetores de imagem são comparados a cada vetor de texto).Portanto, a complexidade do método de referência depende principalmente do número de cálculos N dos vetores de texto.
E nosso método CoT precisa computar Q vetores de texto, em que Q é o número total de todas as combinações de pergunta-opção e 1 vetor de imagem. Depois disso, é necessário realizar cálculos de similaridade Q (comparação de vetores de imagem com vetores de texto para cada combinação de pergunta-opção).Portanto, a complexidade do método depende principalmente de Q.
Neste exemplo, N = 13 e Q = 52 (5 grupos de atributos com uma média de cerca de 10 opções por grupo). Ambos os métodos precisam computar vetores de imagem e executar etapas de classificação, e arredondamos essas operações comuns na comparação.
No caso extremo, se Q = N, então nosso método se degenera efetivamente em um método de referência. Portanto, a chave para ampliar efetivamente o cálculo do tempo de inferência é:
-
Projete o problema para aumentar o valor de Q. -
Certifique-se de que cada pergunta forneça pistas úteis que nos ajudem a restringi-la. -
É melhor não ter informações duplicadas entre as perguntas para maximizar o ganho de informações.
Resultados
Nós o avaliamos em 117 imagens de teste contendo 13 Pokémon diferentes. Os resultados de precisão são os seguintes:
Isso também mostra que, uma vez quepokemon_system
Ele foi construído corretamente.O mesmo CoT pode ser usado diretamente em um modelo diferente sem alterar o código e sem ajuste fino ou treinamento adicional.
Interessante.jina-clip-v1
A precisão básica do modelo na classificação de Pokémon é então maior (31,36%) porque foi treinada no conjunto de dados LAION-400M que contém dados de Pokémon. Enquanto jina-clip-v2
O modelo foi treinado no DFN-2B, que é um conjunto de dados de maior qualidade, mas também filtra mais dados e provavelmente remove também o conteúdo relacionado a Pokémon, por isso tem uma precisão básica menor (16,10%).
Espere, como esse método funciona?
👩🏫 Vamos revisar o que fizemos.
Começamos com modelos de vetores fixos pré-treinados que não conseguiam lidar com problemas de fora da distribuição (OOD) com zero amostras. Porém, quando criamos uma árvore de classificação, eles passaram a ser capazes de fazer isso. Qual é o segredo desse fato? É algo parecido com a integração de aprendizes fracos no aprendizado de máquina tradicional? Vale a pena observar que nosso modelo vetorial pode ser atualizado de "ruim" para "bom" não por causa da aprendizagem integrada em si, mas por causa do conhecimento de domínio externo contido na árvore de classificação. Você pode classificar repetidamente milhares de perguntas com zero amostras, mas se as respostas não contribuírem para o resultado final, isso não terá sentido. É como um jogo de "você me diz, eu acho" (vinte perguntas), em que você precisa restringir progressivamente a solução a cada pergunta. Portanto, é esse conhecimento externo ou processo de pensamento que é a chave - Como em nosso exemplo, a chave é como o sistema Pokémon é construído.Esse conhecimento pode vir de humanos ou de grandes modelos de linguagem.
pokemon_system
qualidade de.Há muitas maneiras de construir esse sistema de CoT, desde manual até totalmente automatizado, cada uma com suas próprias vantagens e desvantagens.1. construção manual
2. construção assistida pelo LLM
Preciso de um sistema de categorização de Pokémon. Para os seguintes Pokémon: [Absol, Aerodactyl, Weedle, Caterpie, Azumarill, ...]. Crie um sistema de classificação que contenha o seguinte: 1. Um grupo de classificação baseado nos seguintes atributos visuais: - A cor primária do Pokémon - A forma do Pokémon - A característica mais marcante do Pokémon - O tamanho total do Pokémon - O ambiente de fundo no qual o Pokémon geralmente aparece 2. para cada grupo de classificação: - Crie um modelo de dica de linguagem natural com "{}" para as opções - Liste todas as opções possíveis - Certifique-se de que as opções sejam mutuamente exclusivas e abrangentes 3. Crie regras que mapeiem cada Pokémon para uma opção em cada grupo de atributos, usando índices para se referir às opções Por favor, envie a saída no formato de dicionário Python, com duas partes principais: - "classification_groups": contém dicas e opções para cada atributo - "pokemon_rules": mapeia cada pokémon para seu índice de propriedade correspondente Exemplo de formato: { "classification_groups": { "dominant_colour": { "prompt": "O corpo deste Pokémon tem principalmente a cor {}.", "options": ["white", "grey", . "options": ["white", "grey", ...] }, ... ... }, "pokemon_rules". "pokemon_rules": { "Absol": { "dominant_colour": 0, índice # de "white" (branco) ... }, ... ... } }
O LLM gera rapidamente um primeiro rascunho, mas também exige verificação e correções manuais.
Uma abordagem mais confiável seria Geração combinada de LLM e validação manual. Primeiro, permite-se que o LLM gere uma versão inicial, depois verifica e modifica manualmente os agrupamentos de atributos, as opções e as regras e, em seguida, envia as modificações de volta ao LLM para que ele continue refinando até ficar satisfeito. Essa abordagem equilibra eficiência e precisão.
3. compilações automatizadas com DSPy
Para compilações totalmente automatizadas pokemon_system
que pode ser otimizado iterativamente com o DSPy.
Vamos começar com um simples pokemon_system
O DSPy usará esse feedback para gerar um novo conjunto de dados, criado manualmente ou gerado pelo LLM. Em seguida, ela é avaliada com os dados do conjunto de saídas, sinalizando a precisão para o DSPy como feedback. pokemon_system
e repetindo esse ciclo até que o desempenho convirja e não haja mais uma melhoria significativa.
O modelo vetorial é fixo durante todo o processo. Com o DSPy, é possível encontrar automaticamente o melhor design do pokemon_system (CoT) e só é necessário ajustá-lo uma vez por tarefa.
Por que dimensionar a computação de tempo de teste em modelos vetoriais?
É muito caro para transportar devido ao custo de aumentar o tamanho dos modelos pré-treinados o tempo todo.
Coleção Jina Embeddings, dejina-embeddings-v1
ev2
ev3
até jina-clip-v1
ev2
E jina-ColBERT-v1
ev2
Cada atualização depende de modelos maiores, mais dados pré-treinados e custos crescentes.
tomarjina-embeddings-v1
Para uma versão de junho de 2023, com 110 milhões de parâmetros, o treinamento custará de US$ 5.000 a US$ 10.000. Até o momento jina-embeddings-v3
O desempenho da empresa melhorou muito, mas ainda é feito principalmente por meio de investimentos em recursos. Atualmente, o custo de treinamento dos principais modelos aumentou de milhares de dólares para dezenas de milhares de dólares, e as grandes empresas precisam gastar centenas de milhões de dólares. Embora quanto maior for o investimento em pré-treinamento, melhores serão os resultados do modelo, mas o custo é muito alto, o custo-benefício está ficando cada vez mais baixo e o desenvolvimento do modelo definitivo precisa considerar a sustentabilidade.
Essa figura mostra o modelo vetorial ScDireito de Alinhamento.O eixo horizontal é o número de parâmetros do modelo e o eixo vertical é o desempenho médio do MTEB. Cada ponto representa um modelo vetorial. A linha de tendência representa a média de todos os modelos, e os pontos azuis são modelos multilíngues.
Os dados foram selecionados entre os 100 principais modelos de vetores nas classificações do MTEB. Para garantir a qualidade dos dados, filtramos os modelos que não divulgaram informações sobre o tamanho do modelo e alguns envios inválidos.
Por outro lado, os modelos vetoriais agora são muito avançados: multilíngue, multitarefa, multimodal, com excelentes recursos de aprendizado de amostra zero e de acompanhamento de instruções.Essa versatilidade abre uma grande quantidade de possibilidades imaginativas para melhorias algorítmicas e extensões para a computação no momento da inferência.
A questão principal é:Quanto os usuários estão dispostos a pagar por uma consulta que realmente lhes interessa?? Se o simples fato de fazer com que a inferência de um modelo fixo pré-treinado demore um pouco mais pode melhorar drasticamente a qualidade dos resultados, tenho certeza de que muitas pessoas acharão que vale a pena.
Em nossa opinião.A computação de tempo de inferência estendida tem um grande potencial inexplorado no campo da modelagem de vetoreso que provavelmente será um avanço importante para pesquisas futuras.Em vez de buscar um modelo maior, é melhor se esforçar mais na fase de inferência e explorar métodos computacionais mais inteligentes para melhorar o desempenho -- Essa pode ser uma rota mais econômica e eficaz.
chegar a um veredicto
existir jina-clip-v1/v2
No desempenho experimental, observamos os seguintes fenômenos principais:
-
nós Em dados não vistos pelo modelo e fora do domínio (OOD)(matemática) gêneroForam obtidas melhores precisões de reconhecimento e não houve nenhum ajuste fino ou treinamento adicional do modelo. -
O sistema funciona da seguinte forma Refinamento iterativo da pesquisa de similaridade e dos critérios de classificaçãoe obtendo uma capacidade de diferenciação mais refinada. -
com a introdução de Ajuste dinâmico de dicas e raciocínio iterativo(análogo a uma "cadeia de pensamento"), transformamos o processo de raciocínio do modelo vetorial de uma única consulta em uma cadeia de pensamento mais complexa.
O potencial da computação de escala em tempo de teste vai muito além disso!No entanto, ainda há um vasto espaço a ser explorado. Por exemplo, podemos desenvolver algoritmos mais eficientes para restringir o espaço de respostas escolhendo iterativamente a estratégia mais eficiente, semelhante à estratégia de soluções ideais no jogo das "vinte perguntas". Ao expandir a computação em tempo de raciocínio, podemos levar os modelos vetoriais além dos gargalos existentes, desbloqueando tarefas complexas e refinadas que antes pareciam fora de alcance e levando esses modelos a aplicações mais amplas.