Como prever o futuro na pesquisa Yandex: de correções de erros a consultas de descoberta

As pessoas nem sempre formulam com precisão suas consultas; portanto, os mecanismos de pesquisa devem ajudá-las. Meu nome é Sergey Yudin, lidero um grupo de análises de funcionalidade de pesquisa no Yandex. Todos os dias aprimoramos algo através do aprendizado de máquina. No ano passado, desenvolvemos tecnologia que prevê interesses humanos.

Com um especialista da minha equipe Anastasia GaidashenkoavgaydashenkoVou contar aos leitores da Habr como essa tecnologia funciona, descreverei a arquitetura e os algoritmos aplicados. Você também aprenderá como a previsão da próxima solicitação difere da previsão de interesses humanos futuros.



O que o usuário quer?


Vamos ver como as tecnologias Yandex ajudam na solução de problemas, usando o exemplo de um usuário imaginário. Suponha que ele imprima "salvar ticket" na caixa de pesquisa. O que ele quer encontrar? Para aprender sobre o acúmulo de ingressos, ou ele estava errado?



Sim, ele foi selado. Ele quer não economizar, mas comprar um ingresso. Yandex o entendeu, o guardião o ajudou nisso - um sistema que corrige solicitações inseridas incorretamente . Matematicamente, esse sistema maximiza a probabilidade de uma consulta inserida corretamente, desde que o usuário tenha inserido o texto. Esse problema foi resolvido no Yandex por mais de dez anos. E não apenas na pesquisa.

Assim, nosso usuário imaginário inseriu a solicitação "compre um ingresso". Nesse ponto, uma brincadeira entra em jogo .(ou sugestões de pesquisa). Sajest ajuda o usuário a formular a solicitação, para completá-la corretamente.



Nosso sajest já percorreu um longo caminho. Há alguns anos, complicamos a tarefa. Eu queria mostrar não apenas a conclusão mais lógica da solicitação, mas também prever qual solicitação esse usuário em particular entraria no final e iniciar seu pré-renderizador antes do clique. Se você estiver interessado em saber como isso funciona, pode ver Habré .

Nosso usuário imaginário seleciona o final da solicitação de uma série de dicas: verifica-se que ele estava procurando ingressos para a Galeria Tretyakov. Assim, o sistema de recomendação concluiu sua primeira tarefa - ajudou o usuário a formular uma solicitação .

Esta tarefa foi concluída, mas o usuário ainda tem perguntas. O que ele procurará a seguir? Talvez ele queira saber como chegar à galeria? Sim, ele imprime Lavrushinsky por 10 para verificar o endereço.



Podemos prever esta solicitação? Sim. E fazemos isso há algum tempo. Existe esse bloqueio - "Também solicitado" no final da edição. Ele mostra as consultas que as pessoas costumam fazer depois de entrar no campo de pesquisa. É nele que veremos nossa solicitação com o endereço da Galeria Tretyakov.



Maximizamos a probabilidade de uma solicitação sujeita a uma solicitação anterior do usuário. O sistema concluiu a segunda tarefa - previu a próxima solicitação .

E então algo muito interessante acontece. O usuário imprime a solicitação "quando posso visitar a Galeria Tretyakov gratuitamente". Esta solicitação é diferente da restante, contraria a tarefa do usuário, resolve alguma tarefa ortogonal.



Mas vamos pensar: se estivéssemos procurando ingressos para a galeria, o que gostaríamos de ver como uma recomendação? Um grande número de pessoas gostaria de saber que um bilhete pode não precisar ser comprado. Esta é a terceira parte, mais difícil e interessante da tarefa - recomendar algo novo e útil ao usuário. Algo que ele próprio ainda não tinha pensado.

Chamamos esses pedidos de descoberta. Aprendemos a identificá-los em nossos registros de pesquisa, salvamos e recomendamos no final do problema. E esta é precisamente a tarefa nova e revolucionária na qual estamos trabalhando ativamente agora. Para uma pessoa que compra palitos escandinavos, a Yandex pode recomendar uma solicitação sobre como pegá-los em altura. Se uma pessoa viaja com frequência, talvez esteja interessada na consulta de pesquisa "para onde ir sem visto". Etc.



A formulação matemática do problema nesse caso terá a seguinte aparência: não maximizamos a probabilidade da próxima solicitação, mas a probabilidade de um clique na solicitação, que recomendamos ao usuário com base em sua sessão anterior.

Como funciona?


Vamos ver como nosso sistema de recomendação é implementado, qual arquitetura está oculta por trás dele. Mas, para começar, determinaremos o que geralmente queremos obter do sistema de recomendação.

1. Recomendações úteis! Obviamente, queremos que as solicitações que recomendamos ao usuário sejam adequadas aos seus interesses. Eles devem ser úteis e relevantes.

2. Escalabilidade. Esperamos que o sistema seja bom: haverá mais e mais usuários e o número de solicitações aumentará. E queremos aumentar a cobertura para aqueles sobre os quais podemos fazer recomendações.

3. Facilidade de implementação.Assumimos que nosso sistema ainda funcionará e não queremos reescrevê-lo muitas vezes. O sistema deve ser fácil de implementar, para que possamos melhorá-lo posteriormente, não lançando uma nova versão, mas melhorando a atual.

Tendo decidido nossos desejos, vamos ver como você pode trazê-los à vida.

Temos um banco de dados de descoberta - um banco de dados de consultas que podem parecer interessantes e úteis para nossos usuários. Mas se começarmos a classificar toda essa base, não teremos poder computacional suficiente. Os usuários têm muitos pedidos, eles são diversos, então primeiro precisamos filtrar esse banco de dados.



A filtragem pode ser feita por diferentes métodos. No Yandex, usamos kNN (k-vizinhos mais próximos) para esse- O algoritmo básico de classificação em aprendizado de máquina, conhecido como "pesquisa de vizinhos mais próximos". Usando esse algoritmo, queremos filtrar o banco de dados: selecione as consultas mais próximas do que pode interessar ao usuário. Para fazer isso, queremos comparar a solicitação do usuário e aquelas que estamos prontos para recomendar no espaço vetorial.

Mas, para trazer essas solicitações para um espaço vetorial, também precisamos criar algo. Por exemplo, você pode usar o DSSM (Modelo Semântico Estruturado Profundo) - um tipo de caixa preta que pode converter diferentes entidades em um espaço vetorial. Inicialmente, essa abordagem foi proposta em um artigo da Microsoft. Mas o Yandex já o adaptou fortemente para suas tarefas e foi longe da idéia original. Se você estiver interessado em ler mais sobre isso, as informações podem ser encontradas, por exemplo, no artigo sobre o algoritmo de pesquisa Palekh .



O próximo passo é a classificação. Quando temos uma lista de solicitações próximas do interesse do usuário, queremos entender o que será mais interessante para ele e o que é menor.

Por exemplo, selecionamos 100 consultas. É improvável que o usuário role todos os 100. Você precisa selecionar os 5 principais e recomendá-lo. Para isso, atribuímos classificações às nossas solicitações. Obtemos essas estimativas com base na probabilidade de um clique em uma solicitação que recomendamos ao usuário com base em sua sessão anterior.

Como obtemos a probabilidade do próximo clique? Nosso sistema já está em funcionamento, por isso, simplesmente coletamos feedback dos usuários e, assim, melhoramos gradualmente nosso sistema de recomendações.



Agora que analisamos todas as etapas separadamente, vamos voltar ao início e juntar tudo. Total: o usuário chega até nós com alguma solicitação e temos algum tipo de base de recomendações. Nós pegamos esse banco de dados e o filtramos, recebendo solicitações que queremos organizar e recomendar ao usuário.



Agora, lembre-se de que geralmente formulamos desejos para o nosso sistema de recomendação. E vamos ver como podemos implementá-los na arquitetura resultante.

Por exemplo, queríamos escalabilidade em termos de melhoria da base. Nosso método de implementação possui todas as propriedades necessárias para esse dimensionamento. Não devemos manter toda a base na memória: assim que a base se expandir tanto que não caiba em um cluster, podemos dividi-la em dois. E se anteriormente passamos por um cluster com kNN e selecionamos os 100 principais, que serão classificados, agora podemos percorrer dois clusters separadamente e selecionar, por exemplo, os 50 principais em cada um. Ou, em geral, divida os clusters por tópicos e ande com o kNN apenas nos tópicos desejados.

Para escalar o número de usuários, você pode simplesmente adicionar poder de computação adicional e processar cada um separadamente, porque em nossa arquitetura não há lugares onde precisaríamos manter todos os usuários na memória ao mesmo tempo.

Em algumas outras abordagens, há locais que filtram, por exemplo, ao decompor uma matriz. A decomposição da matriz é outra abordagem usada nas recomendações. De fato, o Yandex também o usa, mas não para filtragem, mas como recursos adicionais para treinamento, porque ainda há muitas informações úteis para analisar.

Recursos adicionais, novos algoritmos e outros métodos podem ser aplicados ao restante da arquitetura. Quando o sistema estiver em funcionamento, podemos começar a melhorá-lo.



Onde isso funciona?


Essa arquitetura já foi implementada no Yandex e, em comparação com as reformulações usuais, quando tentamos aconselhar o usuário a descobrir o endereço da Galeria Tretyakov, já podemos aconselhar como chegar à Galeria Tretyakov sem esperar na fila ou mesmo gratuitamente.



Este é um novo nível de interação entre o mecanismo de pesquisa e os usuários. Não corrigimos apenas erros e complementamos solicitações, mas aprendemos a prever os interesses de uma pessoa e oferecer a ele algo novo. Talvez essa seja a busca do futuro. O que você acha?

All Articles