No aprendizado por reforço é muito comum referências a estados, ações e recompensas. Certamente, a compreensão deste assunto avança na medida em que trabalhamos mais profundamente com Deep Learning.
Devido à importância de tal compreensão, neste artigo queremos passar um panorama do que significam os termos “estados”, “ações” e “recompensas”, de uma maneira clara e objetiva.
O que são Estados
Para facilitar a compreensão, vamos pensar em um jogo de xadrez. Nesse jogo, temos um tabuleiro com peças posicionadas. Poderíamos, então, definir o estado como a posição em que as peças se encontram. Agora, vamos imaginar dois oponentes em uma partida. Em determinado momento do jogo, as peças estarão posicionadas em regiões bem específicas. Isso é o estado.
Obviamente, se alguém mudar uma peça de posição, o estado também mudará; a nova localização das peças no tabuleiro é um novo estado. Apesar de poder haver semelhanças entre tais estados, o que será analisado pelas redes neurais, cada estado é diferente do outro. Em suma, um estado é uma fotografia de como as coisas estão em um determinado momento.
O que são Ações
Por sua vez, ação é o que o agente deve fazer. No caso do jogo de xadrez, é a próxima jogada: um dos jogadores escolherá mexer em determinada peça para colocá-la em um determinado local. É basicamente a decisão tomada em relação ao estado atual.
A partir do momento que o agente executa uma ação, ele vai para um próximo estado e, em muitos casos, ele mesmo está criando um estado novo – como no caso do jogo. Cada ação executada gera um novo estado ligeiramente diferente do estado anterior.
O que são Recompensas
A recompensa é o feedback. Ela será o balizador do nosso sistema – no qual ele se baseará para tentar realizar as suas ações. É importante entender que, para o cientista de dados que trabalha com problemas e algoritmos, a recompensa será como uma função de custo – que é escolhida quando trabalhamos com modelos de machine learning em geral.
Às vezes, trabalhamos com modelos de classificação ou de regressão. Alguns problemas específicos requerem funções de custo específicas, porque a forma de otimizar tal problema só faz sentido dessa forma. Assim, podemos imaginar a recompensa como dependendo dessa função personalizada, pois devemos definir o modelo. Ou seja, devemos escolher qual recompensa o sistema receberá.
No caso do jogo de xadrez, podemos dizer para o modelo, por exemplo: “sempre que você comer uma peça do adversário, você receberá +1 ponto”. Dessa forma, o nosso agente aprenderia a otimizar “comidas” de peças, o que fará com que ele coma o máximo de peças do adversário.
Essa ação não necessariamente fará com que o agente vença, porque, no jogo de xadrez, as regras dizem que há uma vitória quando um xeque-mate é realizado. Assim sendo, talvez a forma mais genérica de se fazer com que o agente aprenda a jogar o xadrez e vença o maior número de partidas seja essa: dizer a ele que receberá uma recompensa de +1 quando der o xeque-mate e que receberá uma recompensa de -1 quando sofrer o xeque-mate; e nada além disso.
Alternaticamente, poderíamos estabelecer uma relação complexa de recompensas, como pontuações diferentes por comer cada uma das peças, uma pontuação extra se conseguir dominar o centro do tabuleiro ou uma coluna vazia, etc.
Entretanto, em todos esses casos, é importante notar que tudo o que inserirmos será percebido como um viés colocado sobre o modelo. Entenda que o modelo sempre tentará otimizar o que é pedido. Assim, nem sempre o que determinamos é o melhor. O resultado final depende de nossa configuração do problema.
O que é melhor, então, um modelo aprender? Talvez você esteja convencido de que a melhor forma de se chegar à solução ótima é deixar o modelo aprender da forma mais genérica possível (recebendo apenas recompensa quando vence ou perde o jogo), para permitir que o algoritmo descubra por conta própria quais são as melhores estratégias.
De fato, isso costuma ser verdade. Mas existe um problema nessa abordagem: recurso computacional e tempo.
Em alguns casos, pode ser que seja muito custoso ou muito demorado aprender de forma totalmente generalizável. Em outras palavras, sempre teremos algum tipo de trade off: ganharemos em um lado, mas perderemos em outro.
Utilizando os conceitos para treinar uma máquina com aprendizado por reforço
Agora, é possível entender como se pode, a partir de recompensas, fazer com que um sistema realize ações que mudem seu estado.
Seguindo com nosso jogo de xadrez, tomemos como exemplo as seguintes recompensas: cada vez que o modelo dá o xeque-mate, ele recebe +1 ponto; cada vez que o modelo sofre o xeque-mate, ele recebe -1 ponto. Qualquer outro movimento realizado não acarretará o recebimento de pontos. Dessa forma, se a primeira jogada for a movimentação de um peão, a recompensa recebida será 0 (zero).
Após a jogada do oponente, quando o modelo jogar novamente, ele também receberá a recompensa 0.
É possível que, no início, o modelo fique completamente perdido, pois ele não sabe o que fazer: tudo que ele faz lhe dá a recompensa 0. Em algum momento, no entanto, ele poderá realizar um xeque-mate e, então, receberá +1 ponto.
Agora, finalmente podemos escolher ponderar ações ou estados, ou ambos. Podemos determinar pontos para cada ação a partir da recompensa obtida. Quem retorna as recompensas para o agente é o sistema, mas o agente decide como atribuir pontuações para suas ações a partir dessas recompensas.
Se a ação final receber +1 ponto, a ação imediatamente anterior talvez mereça receber alguma pontuação também. Afinal, ela nos levou a um estado muito próximo da vitória.
Podemos, ainda, ponderar os estados e dizer que o último estado antes da vitória tem uma pontuação mais alta. Da mesma forma, um estado imediatamente anterior a ele também poderá merecer uma pontuação alta, pois ele permitiu que o modelo chegasse em um estado que o levou à vitória.
Ou ainda, se esse é um estado que geralmente leva à vitória, ele pode ter uma pontuação mais alta do que os estados que geralmente levam à derrota.
Depois de terminada uma partida, iremos recalcular para que, a partir das informações de vitória ou derrota, os estados ou as ações anteriores recebam pontuações.
A partir disso, o modelo poderá começar a entender o que foi uma ação boa e o que foi uma ação ruim. Só porque uma recompensa foi recebida apenas no final não significa que todas as ações intermediárias ficarão sem nota nenhuma.
Naquele momento, pode ser que não havia nenhuma informação boa ou ruim. Depois do último evento, entretanto, o modelo poderá se recalcular antes de começar a próxima iteração. Assim, ele poderá avaliar todas as ações e estados que foram tomados e atribuir notas a eles.
Aplicação prática
Compreendidas as diferenças entre estado, ação e recompensa, podemos aplicar tais conceitos em exemplos práticos. Desse modo, é possível avaliar a melhor forma de começar a utilizar técnicas de aprendizado por reforço para decisões ótimas do agente, e já encontrar alguns problemas, como o k-armed Bandit Problem.
Em nosso curso Aprendizado por Reforço, Algoritmos Genéticos, NLP e GANs mostramos de maneira prática e detalhada, através da linguagem Python, como utilizar esses conceitos – entramos também nos detalhes de toda teoria envolvida. Temos opções do básico ao avançado, com foco na didática e aprendizado do aluno, o que possibilita que todos possam construir suas aplicações com total entendimento dos assuntos envolvidos.
Confira também todos os nossos cursos.
Veja também: