Path: blob/master/site/pt-br/agents/tutorials/ranking_tutorial.ipynb
25118 views
Copyright 2023 The TF-Agents Authors.
Tutorial de ranking no TF-Agents
Configuração
Introdução
Neste tutorial, vamos guiar você pelos algoritmos de ranking implementados como parte da biblioteca Bandits do TF-Agents. Em um problema de ranking, em cada iteração, um agente é apresentado com um conjunto de itens e recebe a tarefa de classificar todos ou alguns deles em uma lista. Essa decisão de ranking recebe alguma forma de feedback (talvez um usuário clique ou não em um ou mais itens selecionados, por exemplo). A meta do agente é otimizar alguma métrica/recompensa com o objetivo de tomar decisões melhores ao longo do tempo.
Pré-requisitos
Os algoritmos de ranking no TF-Agents pertencem a um tipo especial de agentes bandit que operam em problemas de bandit "por braço". Portanto, para aproveitar este tutorial ao máximo, o leitor deve se familiarizar com os tutoriais de bandit e bandit por braço.
O problema do ranking e as variantes
Para este tutorial, vamos usar o exemplo de apresentar itens para venda a usuários. Em cada iteração, recebemos um conjunto de itens e, possivelmente, um número descrevendo quantos devem ser exibidos. Presumimos que o número de itens disponíveis seja sempre maior ou igual ao número de slots em que eles são colocados. Precisamos preencher os slots na vitrine para maximizar a probabilidade de interação dos usuários com um ou mais dos itens exibidos. O usuário, assim como os itens, são descritos por características.
Se conseguirmos exibir itens de que o usuário gosta, a probabilidade das interações entre o usuário e o item aumenta. Então, é uma boa ideia aprender a correspondência de pares usuário-item. Mas como saber se o usuário gosta de um item? Para isso, apresentamos os Tipos de feedback.
#Tipos de feedback
Ao contrário dos problemas de bandit em que o sinal de feedback (a recompensa) é associada diretamente a um único item escolhido, no ranking, precisamos considerar como o feedback se traduz na "qualidade" dos itens exibidos. Em outras palavras, precisamos atribuir pontuações a todos ou alguns dos itens exibidos. Na nossa biblioteca, oferecemos dois tipos de feedback diferentes: feedback de vetor e feedback em cascata.
Feedback de vetor
No tipo de feedback de vetor, presumimos que o agente recebe uma pontuação escalar para todos os itens no ranking de saída. Esses escalares são reunidos em um vetor na mesma ordem que o ranking de saída. Portanto, o feedback é um vetor do mesmo tamanho que o número de elementos no ranking.
Esse tipo de feedback é bastante direto, no sentido de que não precisamos nos preocupar em converter os sinais de feedback em pontuações. Por outro lado, a responsabilidade de pontuar itens cai sobre o designer (ou seja, você): cabe ao designer do sistema decidir quais pontuações dar com base no item, na posição dele e se ele teve interação do usuário.
##Feedback em cascata
No tipo de feedback em cascata (termo cunhado por Craswell et al., 2008), presumimos que o usuário olha para os itens exibidos de maneira sequencial, começando pelo slot superior. Assim que o usuário encontra um item digno de clique, ele clica e não retorna mais para a lista de ranking atual. Ele nem mesmo olha para os itens abaixo do clicado. Não clicar em nenhum item também é uma possibilidade. Isso acontece quando nenhum dos itens exibidos são dignos de clique. Nesse caso, o usuário olha todos os itens.
O sinal de feedback é composto por dois elementos: o índice do elemento escolhido e o valor do clique. Em seguida, é a tarefa do agente traduzir essas informações em pontuações. Em nossa implementação na biblioteca de bandit, implementamos a convenção de que os itens vistos mas não clicados recebem uma pontuação baixa (geralmente 0 ou -1), os itens clicados recebem o valor de clique e os itens abaixo do clicado são ignorados pelo agente.
Diversidade e exploração
Para maximizar as chances de um usuário clicar em um item, não basta só escolher os itens de pontuação mais alta e colocá-los no topo do ranking. Para um usuário com vários interesses diferentes, ele pode se interessar mais por esportes, mas também gostar de artes e viagens. Dar as maiores pontuações estimadas a todos os itens esportivos e mostrar todos esses itens nos slots mais altos pode não ser ideal. O usuário pode estar no clima de artes ou viagens. Por isso, é uma boa ideia exibir uma combinação de interesses com pontuações altas. É importante maximizar a pontuação dos itens mostrados e também garantir que eles formem um conjunto diversificado.
Como outros problemas de aprendizado com informações limitadas (como bandits), também é importante considerar que nossas decisões não só afetam a recompensa imediata, como também os dados de treinamento e a recompensa futura. Se só mostrarmos itens com base na pontuação estimada atual, podemos perder itens com pontuações altas que ainda não foram muito explorados e, assim, não saber como eles são bons. Ou seja, precisamos incorporar a exploração ao nosso processo de tomada de decisões.
Todos os conceitos e considerações acima são abordados na nossa biblioteca. Neste tutorial, vamos explicar os detalhes.
Simulação de usuários: nosso ambiente de teste
Vamos nos aprofundar em nossa base de código!
Primeiro, definimos o ambiente, a classe responsável pela geração aleatória de características de usuários e itens, e damos feedback após as decisões.
Também precisamos de um modelo para o ambiente decidir quando não clicar. Temos duas maneiras na nossa biblioteca: baseada na distância e ações fantasmas.
Para a baseada na distância, se as características do usuário não forem próximas o suficiente de quaisquer características dos itens, o usuário não clica.
No modelo de ações fantasmas, configuramos ações imaginárias adicionais na forma de características de itens de vetores unitários. Se o usuário escolher uma das ações fantasmas, não resulta em um clique.
Já está quase tudo pronto para definir o ambiente de ranking, faltam só alguns preparativos: definir as funções de amostragem para as características do item e do global (usuário). Essas características serão usadas pelo ambiente para simular um comportamento de usuário: um produto interno ponderado das características do global e do item é calculado, e a probabilidade de o usuário clicar é proporcional aos valores do produto interno. A ponderação do produto interno é definida pela scores_weight_matrix
abaixo.
Agora, vamos definir alguns agentes diferentes que vão lidar com o ambiente acima! Todos os agentes treinam uma rede que estima pontuações de pares item/usuário. A diferença está na política, ou seja, a maneira como a rede treinada é usada para tomar uma decisão de ranking. As políticas implementadas variam de apenas classificar o ranking com base nas pontuações até considerar a diversidade e exploração com a capacidade de ajustar a combinação desses aspectos.
Antes de começar nosso loop de treinamento, precisamos tratar de mais uma coisa em relação aos dados de treinamento.
As características do braço apresentadas a essa política no momento de decisão contêm todos os itens que a política pode escolher. No entanto, no treinamento, precisamos das características dos itens que foram selecionados e, para conveniência, na ordem da saída de decisão. Para isso, a seguinte função é usada (copiada daqui para maior clareza).
Assim como nos tutoriais de bandits, definimos o buffer de replay que alimentará o agente em que as amostras são treinadas. Em seguida, usamos o driver para reunir tudo: o ambiente fornece características, a política escolhe os rankings, e as amostras são coletadas para o treinamento.
Vamos plotar a recompensa!
Próximos passos
Este tutorial tem vários parâmetros ajustáveis, incluindo política/agente usado, algumas propriedades do ambiente e até mesmo o modelo de feedback. Fique à vontade para experimentar com esses parâmetros!
Também há um exemplo pronto para ranking em tf_agents/bandits/agents/examples/v2/train_eval_ranking.py