Com este post, estou abrindo uma série em que meus colegas e eu lhe diremos como o ML é usado no Mail.ru Search. Hoje vou explicar como a classificação é organizada e como usamos as informações sobre as interações do usuário com nosso mecanismo de pesquisa para melhorar o mecanismo de pesquisa.
Tarefa de classificação
O que se entende por tarefa de classificação? Imagine que na amostra de treinamento haja algum conjunto de consultas para as quais a ordem dos documentos por relevância é conhecida. Por exemplo, você sabe qual documento é o mais relevante, qual é o segundo mais relevante etc. E você precisa restaurar esse pedido para toda a população. Ou seja, para todos os pedidos da população em geral, o primeiro lugar é o documento mais relevante e o último - o mais irrelevante.
Vamos ver como esses problemas são resolvidos nos grandes mecanismos de pesquisa.
Temos um índice de pesquisa - este é um banco de dados de muitos bilhões de documentos. Quando uma solicitação chega, primeiro geramos uma lista de candidatos para classificação final usando modelos de texto simples. A opção mais fácil é pegar documentos que, em princípio, contenham palavras da solicitação. Por que essa etapa é necessária? O fato é que é impossível para todos os documentos disponíveis criar sinais e formar previsões do modelo final. Depois já calculamos os sinais. Que sinais podemos tomar? Por exemplo, o número de ocorrências de palavras de uma consulta em um documento ou o número de cliques em um determinado documento. Você pode usar fatores complexos treinados por máquina: na Pesquisa usando redes neurais prevemos a relevância do documento sob demanda e inserimos essa previsão com uma nova coluna em nosso espaço de recursos.
Por que estamos fazendo tudo isso? Queremos maximizar as métricas do usuário para que os usuários encontrem os resultados relevantes em nossos resultados o mais facilmente possível e retornem para nós o mais rápido possível.
Nosso modelo final usa um conjunto de árvores de decisão construídas usando o aumento de gradiente. Existem duas opções para criar uma métrica de destino para o treinamento:
- Estamos criando um departamento de assessores - pessoas especialmente treinadas para quem prestamos consultas e dizemos: "Pessoal, avalie a relevância da nossa emissão". Eles responderão com números que medem a relevância. Por que essa abordagem é ruim? Nesse caso, maximizaremos o modelo em relação às opiniões de pessoas que não são nossos usuários. Não otimizaremos a métrica que realmente queremos otimizar.
- Por esse motivo, usamos a segunda abordagem para a variável de destino: mostramos aos usuários os resultados, observamos para quais documentos eles passam e quais pulam. E então usamos esses dados para treinar o modelo final.
Como o problema de classificação é resolvido?
Existem três abordagens para resolver o problema de classificação:
- Pointwise , é pointwise. Consideraremos a relevância como uma medida absoluta e multaremos o modelo pela diferença absoluta entre a relevância prevista e a que conhecemos na amostra de treinamento. Por exemplo, o avaliador atribuiu ao documento uma classificação de 3, e diríamos 2, então multamos o modelo em 1.
- Em pares , em pares. Vamos comparar documentos entre si. Por exemplo, na amostra de treinamento, existem dois documentos e sabemos qual deles é mais relevante para esta solicitação. Depois, multaremos o modelo se a previsão for menor que a menos relevante, ou seja, o par estiver incorretamente organizado.
- Listwise . Também se baseia na relevância relativa, mas não dentro dos pares: classificamos toda a questão pelo modelo e avaliamos o resultado - se o documento mais relevante não estiver em primeiro lugar, receberemos uma multa grande.
Qual abordagem é melhor usar para nossa variável de destino? Para isso, vale a pena discutir uma questão importante: “os cliques podem ser usados como uma medida da absoluta relevância de um documento?” É impossível, porque eles dependem da posição do documento na edição. Após receber o problema, você provavelmente clica no documento que será mais alto, porque parece que os primeiros documentos são mais relevantes.
Como essa hipótese pode ser verificada? Pegamos dois documentos na parte superior da edição e os trocamos. Se os cliques fossem uma medida absoluta de relevância, seu número dependeria apenas do próprio documento, e não da posição. Mas isso não é verdade. O documento acima sempre recebe mais cliques. Portanto, os cliques nunca podem ser usados como uma medida de relevância absoluta. Portanto, você pode usar em pares ou em lista.
Coletamos um conjunto de dados
Agora, extraímos os dados para o conjunto de treinamento. Tivemos esta sessão:
Dos quatro documentos, houve um clique no segundo e quarto. Como regra, as pessoas assistem aos resultados de cima para baixo. Você olhou para o primeiro documento, não gostou, clicou no segundo. Então eles voltaram para a busca, olharam para o terceiro e clicaram no quarto. Obviamente, você gostou do segundo mais que o primeiro e do quarto mais que do primeiro e do terceiro. Esses são os pares que geramos para todas as solicitações e usamos modelos para treinamento.
Tudo parece estar bem, mas há um problema: as pessoas só clicam nos documentos desde o início da questão. Portanto, se você fizer a amostra de treinamento apenas dessa maneira, a distribuição nela será exatamente a mesma que na amostra de teste. É necessário alinhar de alguma forma a distribuição. Fazemos isso adicionando exemplos negativos: esses são documentos que estavam na parte inferior do ranking, o usuário definitivamente não os viu, mas sabemos que eles são ruins.

Portanto, criamos um esquema para o treinamento de classificação: mostramos aos usuários os resultados, coletamos cliques deles, adicionamos exemplos negativos para alinhar a distribuição e treinamos novamente o modelo de classificação. Assim, levamos em conta a reação dos usuários à sua classificação atual, levamos em conta os erros e melhoramos a classificação. Repetimos esses procedimentos várias vezes até a convergência. É importante observar que pesquisamos não apenas pela web, mas também por vídeo, por imagens, e o esquema descrito funciona perfeitamente em qualquer tipo de pesquisa. Como resultado, as métricas comportamentais crescem muito. Na segunda iteração, é um pouco menor, na terceira iteração é ainda menor e, como resultado, converge para um ótimo local.
Vamos pensar por que convergimos para um ótimo local, e não para um ótimo global.
Suponha que você é um fã de futebol e à noite não teve tempo de assistir à partida do seu time favorito. Acorde de manhã e digite o nome da equipe na barra de pesquisa para descobrir o resultado da partida. Veja os três primeiros documentos - estas são as páginas oficiais do clube, não há informações úteis. Você não folheará a edição inteira, não receberá outra solicitação. Talvez você até clique em algum documento irrelevante. Mas, como resultado, fique chateado, feche o SERP e abra outro mecanismo de pesquisa.

Embora esse problema não seja encontrado apenas na pesquisa, é especialmente relevante aqui. Imagine uma loja on-line, que é uma fita grande sem a capacidade de dizer qual categoria específica de produtos você deseja ver. É exatamente isso que acontece com os resultados da pesquisa: após o envio da solicitação, você não pode mais explicar o que realmente precisa: informações sobre o time de futebol ou o placar da última partida.
Imagine que um homem brutal foi a uma loja on-line tão estranha, consistindo de uma fita de recomendações, e nas recomendações dele ele vê apenas produtos tipicamente femininos. Talvez ele até clique em algum vestido, porque é usado em uma garota bonita. Enviaremos esse clique para o conjunto de treinamento e decidiremos que o homem gosta mais desse vestido do que de esponja. Quando ele voltar ao nosso sistema, ele já verá alguns vestidos. Inicialmente, não tínhamos produtos válidos para o usuário. Portanto, essa abordagem não nos permite corrigir esse erro. Estávamos em um ótimo local, no qual a pessoa pobre não pode mais nos dizer que não gosta de esponjas ou vestidos. Muitas vezes, esse problema é chamado de problema de feedback positivo.
Melhoria adicional
Como melhorar um mecanismo de pesquisa? Como sair de um local ideal? Novos fatores precisam ser adicionados. Suponha que tenhamos feito um fator muito bom que, mediante solicitação com o nome do time de futebol, apresentará um documento relevante, ou seja, os resultados da última partida. Qual poderia ser o problema aqui? Se você treinar o modelo em dados antigos, offline, pegue o conjunto de dados antigo com cliques e adicione esse atributo. Pode ser relevante, mas você não o usou na classificação antes e, portanto, as pessoas não clicaram nos documentos para os quais esse atributo é válido. Ele não se correlaciona com sua variável de destino; portanto, simplesmente não será usado pelo modelo.
Nesses casos, costumamos usar esta solução: ignorando o modelo final, forçamos nossa classificação a usar esse recurso. Nós mostramos à força o resultado da última partida, mediante solicitação, com o nome da equipe e, se o usuário clicou nela, essas são as informações que nos permitem entender que o sinal é bom.
Vejamos um exemplo. Recentemente, fizemos belas fotos para documentos do Instagram:

Parece que fotos tão bonitas devem satisfazer nossos usuários o máximo possível. Obviamente, precisamos fazer um sinal de que o documento tem essa imagem. Adicionamos ao conjunto de dados, treinamos novamente o modelo de classificação e vemos como esse recurso é usado. E então analisamos a mudança nas métricas comportamentais. Eles melhoraram um pouco, mas essa é a melhor solução?
Não, porque para muitos pedidos você não mostra fotos bonitas. Você não deu ao usuário a oportunidade de mostrar como ele gosta dele. Para resolver esse problema, para algumas solicitações que envolvem a exibição de documentos do Instagram, ignorando à força o modelo, mostramos belas fotos e verificamos se elas clicavam nelas. Assim que os usuários apreciaram a inovação, começaram a treinar novamente o modelo em conjuntos de dados, nos quais os usuários tiveram a oportunidade de mostrar a importância desse fator. Após esse procedimento, em um novo conjunto de dados, o fator começou a ser usado muitas vezes com mais frequência e aumentou significativamente as métricas do usuário.
Portanto, examinamos a formulação do problema de classificação e discutimos as armadilhas que o aguardam ao obter feedback dos usuários. A principal coisa que você deve tirar deste artigo: usando o feedback como alvo de treinamento, lembre-se de que o usuário pode deixar esse feedback apenas onde o modelo atual o permitir. Esse feedback pode ser um truque quando você tenta criar um novo modelo de aprendizado de máquina.