Coletânea Python do ZERO às Redes Neurais Artificiais

Fernando Feltrin · Capítulo 257 de 287

Páginas do PDF

Coletânea Python do ZERO às Redes Neurais Artificiais

Q-Learning e Deep Q-Learning

 

Uma vez entendidos os princípios básicos de um modelo de rede neural

artificial, assim como as principais características comuns aos modelos de redes neurais artificiais, podemos avançar nossos estudos entendendo os mecanismos internos de um algoritmo intuitivo e o que faz dele um modelo a ser usado para simular uma inteligência artificial.

Raciocine que o que visto até então nos capítulos anteriores é como o

núcleo do que usaremos em redes neurais artificiais, independentemente do seu tipo ou propósito. Ao longo dos exemplos estaremos entendendo de forma prática desde o básico (perceptrons) até o avançado (inteligência artificial), e para isso temos que identificar cada uma dessas particularidades em seu contexto.

Por hora, também é interessante introduzir os conceitos de inteligência

artificial, porém os mesmos serão estudados com maior profundidade em seus respectivos capítulos.

Para separarmos, sem que haja confusão, conceitos teóricos de machine

learning, deep learning e q-learning, estaremos sempre que possível realizando a comparação entre esses modelos.

 

Dando sequência, vamos entender as particularidades em Q-Learning.

 

Equação de Bellman

 

Richard Bellman foi um matemático estadunidense referenciado no meio

da ciência da computação pela “invenção” da programação dinâmica em 1953, modelo esse de equações e algoritmos aplicados para estados de programação em tempo real. Em outras palavras, por meio de suas fórmulas é possível criar arquiteturas de código onde camadas de processamento podem ser sobrepostas e reprocessadas em tempo real. Como mencionado anteriormente, um dos grandes diferenciais do modelo de rede neural intuitiva é a capacidade da mesma de trabalhar continuamente, realizando processamento de seus estados e memória em tempo real.

Por parte da lógica desse modelo, raciocine que teremos um agente, um

ambiente e um objetivo a ser alcançado. O agente por si só terá uma programação básica de quais ações podem ser tomadas (em alguns casos uma programação básica adicional de seu tamanho e formado) e com base nisso o mesmo realizará uma série de testes fazendo o mapeamento do ambiente até que atinja seu objetivo.

Quando atingido o objetivo esperado, o agente irá verificar qual caminho percorreu, quais sequências de ações foram tomadas do início ao final do processo e irá salvar essa configuração em uma espécie de memória. A experiência desse agente com o ambiente se dará de forma sequencial, uma ação após a outra, de forma que caso ele atinja algum obstáculo receberá uma penalidade, assim como quando ele alcançar seu objetivo receberá uma recompensa.

Toda trajetória será remapeada, passo a passo realizado, atribuindo valores de experiência positiva quando correto, de forma que numa situação de repetir o mesmo percurso, o agente irá buscar e replicar as ações que ele já conhece e sabe que deram certo ao invés de tentar novas experiências.

Apenas como exemplo, imagine que você possui um agente (com suas características de possíveis ações a serem tomadas bem definidas), um ambiente que nesse caso trata-se de um mapa de uma determinada cidade e um objetivo de ir do ponto A até o B. Realizando uma leitura rápida desse mapa podemos ver duas características importantes, primeira delas que existem diversas possíveis rotas que fazem o trajeto do ponto A até o ponto B. Note que destacado em linhas vermelhas temos alguns segmentos dessas trajetórias que por algum motivo estão fechadas, sendo assim, o mapeamento de todas possíveis rotas é feito.

 

Agora delimitados como linhas azuis estão traçadas algumas rotas diretas entre o ponto A e o ponto B. O que nosso agente irá fazer é percorrer cada uma dessas rotas identificando sempre o seu nível de avanço conforme a distância de seu objetivo diminui, assim como demarcar cada etapa concluída com uma pontuação positiva para cada possibilidade válida executada com sucesso, assim como uma pontuação negativa quando atingido qualquer estado onde seu progresso for interrompido. Lembrando que cada passo em busca de seu objetivo é feito uma nova leitura do seu estado atual e sua posição no ambiente.

Apenas exemplificando, note que pontuamos alguns trajetos com uma numeração entre -2, -1, 0 e +1 (podendo usar qualquer métrica ao qual se sinta mais confortável adotar). Possíveis trajetos classificados como 0 são aqueles que não necessariamente estão errados, porém não são os mais eficientes, no sentido de ter uma distância maior do objetivo sem necessidade. Em vermelho, nos entroncamentos das ruas representadas por linhas vermelhas temos pontuação -2 por exemplo, onde seria um trajeto que nosso agente testou e considerou muito fora da rota esperada.

Da mesma forma os entroncamentos pontuados em -1 por sua vez foram testados pelo agente e considerados ineficientes. Por fim, sobre as linhas azuis que representam os melhores caminhos, existem marcações +1 sinalizando que tais caminhos são válidos e eficientes em seu propósito de traçar a menor distância entre o ponto A e o ponto B.

Como mencionado anteriormente, o agente arbitrariamente irá testar todos os possíveis trajetos deste ambiente, gerando com base em sua experiência um mapa dessas rotas corretas. Desse modo, caso essa função tenha de ser repetida o agente irá se basear puramente nos resultados corretos que ele conhece de sua experiência passada.

Traduzindo este conceito lógico em forma de equação chegamos na chamada equação de Bellman, equação esta que integrará o algoritmo de nossa rede neural de forma a realizar cálculos para cada estado do agente, podendo assim prever qual a próxima ação a ser tomada de acordo com os melhores resultados, já que sempre estamos buscando melhor eficiência.

Sem nos aprofundarmos muito no quesito de cálculo, podemos entender a lógica dessa equação para entendermos como a mesma é alimentada de dados e realiza seu processamento.

 

Na equação escrita acima, temos alguns pontos a serem entendidos, como:

 

V – Possíveis valores de cada estado a cada etapa.

s – Estado atual de nosso agente.

s’ – Próximo estado de nosso agente.

A – Ação a ser tomada.

R – Recompensa gerada para o resultado da ação tomada por nosso agente.

y – Fator de desconto.

 

V (s) – Qual é o valor do último estado de nosso agente.

R (s, a) – Lendo inversamente, de acordo com a última ação o agente recebe um valor de estado para que seja recompensado ou penalizado.

 

* A equação de Bellman é calculada a cada estado de nosso agente, atualizando assim os seus dados de estado.

* Mesmo que numericamente os estados se repitam quando calculados manualmente, vale lembrar que a cada ação executada um novo estado é alcançado.

 

Com base na aplicação da equação de Bellman para cada estado é retroativamente pontuados os valores dos melhores caminhos e tais dados passam a compor o equivalente a memória de longa duração de nosso agente.

Se o mesmo objetivo com os mesmos parâmetros for necessário ser realizado novamente, nosso agente já possui todos os dados de experiência, apenas necessitando replicá-los.

 

Plano ou Política de Ação

 

Note que em nosso exemplo a pontuação aplicada para cada estado segue a simples lógica de que quanto maior for o número mais próximo do objetivo estará o nosso agente. Como normalmente acontece na prática, existirão diversos caminhos corretos, o que nosso agente fará para descobrir a melhor ou mais eficiente rota simplesmente será fazer a sua leitura do seu estado atual, assim como as pontuações dos possíveis estados e ações a serem tomadas, optando automaticamente para avançar para o próximo estado mapeado de maior pontuação.

Essa ação tomada de forma mais direta normalmente é denominada como plano de ação, para alguns autores, este tipo de lógica usada para tomada de decisão é como se fosse uma modelo de aprendizado de máquina auto supervisionado, onde o agente sabe com margem de precisão muito alta o que deve ser feito, porém em situações de maior complexidade teremos inúmeros fatores que poderão prejudicar essa precisão, fazendo com que o agente tenha que considerar esses fatores impactando diretamente seu desempenho, ou a probabilidade de sucesso de suas tomadas de decisão.

 

Apenas como exemplo, seguindo a linha tracejada indicada pela seta, ao chegar no entroncamento nosso agente terá de fazer a leitura de seu estado atual, do ambiente (bloqueado à frente, com caminhos possíveis para a direita e para a esquerda), e fará sua tomada de decisão, nesse caso aplicando seu plano de ação para 1 de apenas 2 direções, e com base no valor mais alto do próximo estado, nesse caso, seguindo o caminho à esquerda.

Haverá situações onde o agente terá muitos fatores que prejudicam sua leitura de estado ou de ambiente, assim como pontos de estado alcançado onde será necessário realizar múltiplas escolhas. Para essas situações devemos considerar todos os fatores inclusive dados de ações imediatamente realizadas nos passos anteriores ou a leitura da possível modificação do ambiente entre um estado e outro para que se determine direções com melhor probabilidade de acertos.

Como exemplo, imagine a complexidade do sistema de tomada de decisão de um carro autônomo, sua IA faz a leitura do ambiente dezenas de vezes por segundo, também levando em consideração que dependendo da velocidade do carro percorrendo um determinado trajeto, em uma fração de segundo o ambiente pode se modificar à sua frente caso algum animal atravesse a pista ou um objeto seja jogado nela como exemplo. Raciocine que existe uma série de ações a serem tomadas seja tentando frear o carro ou desviar do obstáculo (ou as duas coisas) ainda tendo que levar em consideração qual tipo de ação terá maior probabilidade de sucesso, tudo em uma fração de segundo.

 

Sistema de Recompensas e Penalidades

 

Como vimos nos tópicos anteriores, nosso agente de acordo com suas

ações recebe recompensas ou penalidades como consequência de seus atos, porém é necessário entender um pouco mais a fundo como esse mecanismo de fato funciona em nosso algoritmo.

Anteriormente também comentamos que uma das principais

características de nosso modelo de rede neural artificial intuitiva é a de que nosso agente a partir de um gatilho inicial se torna “vivo”, agindo de forma constante e independente. Isso se dá porque devemos considerar que todo e qualquer tipo de processamento constante funciona de forma cíclica, podendo ter uma série de particularidades em seu ciclo, mas basicamente um ciclo de processamento tem um estágio inicial, camadas de processamento de entradas gerando saídas que retroalimentam as entradas gerando um loop de processamento.

Contextualizando para nosso agente, todo e qualquer agente sempre fará

o ciclo de leitura de seu estado atual (inicial), tomará uma série de ações para com o ambiente ao seu redor, recebendo recompensas ou penalidades de acordo com as consequências de suas ações, retroalimentando com estes dados o seu novo estado que por sua vez é o seu “novo” estado atual (inicial).

Para alguns autores, pontuar essas recompensas e penalidades facilita a

interpretação dos estados de nosso agente, porém devemos tomar muito cuidado com esse tipo de interpretação, uma vez que se você raciocinar a lógica deste modelo, na realidade teremos uma leitura diferencial, com muito mais penalidades do que recompensas uma vez que independentemente da tarefa a ser realizada, boa parte das vezes existem poucos meios de realizar tal função corretamente, em contraponto a inúmeras maneiras erradas de se tentar realizar a mesma.

Logo, devemos ter esse tipo de discernimento para que possamos de fato

ler o estado de nosso agente e entender suas tomadas de decisão. Internamente, por parte estruturada do algoritmo, lembre-se que a aprendizagem por reforço justamente visa dar mais ênfase aos acertos, dando mais importância a eles dentro do código, enquanto alguns modelos até mesmo descartam totalmente grandes amostragens de erros, uma vez que eles são maioria e podem ocupar muito da capacidade de memória de nosso agente.

Na prática, nos capítulos onde estaremos implementando tais conceitos

em código, você notará que temos controle da taxa de aprendizado de nosso agente, assim como temos controle dos pesos das penalidades no processo de aprendizado de máquina. Teremos meios para dar mais pesos aos erros enfatizando que os mesmos tenham seus padrões facilmente identificados pela rede neural de forma a reforçar o aprendizado da rede pelo viés correto.

 

Aplicação sob Diferença Temporal

 

A essa altura, ao menos por parte teórica, você já deve estar entendendo

o funcionamento lógico de uma rede neural artificial intuitiva, assim como o papel de nosso agente, a maneira como o mesmo se comporta em relação ao ambiente e as suas ações.

Hora de aprofundar um pouco o conceito de diferença temporal, haja visto que já temos uma boa noção sobre o mesmo.

Em suma, quando estamos falando que neste tipo específico de rede neural artificial temos processamento em tempo real, aprendizado autosupervisionada, tempo de ação, tomada de ação autônoma, etc... estamos falando de estruturas lógicas que irão simular todo processamento necessário dessa inteligência artificial em decorrência de um período de tempo real. Caso você procure por artigos científicos que tratam sobre esse assunto verá inúmeros exemplos de como moldar uma estrutura lógica e de código de forma que são aproveitados resultados de amostras de processamento passados assim como pré-programados já estarão uma série de novas ações a serem tomadas, repetindo esses passos em ciclo.

Todo e qualquer código tem o que chamamos de interpretação léxica, uma forma sequencial de ler linhas e blocos de código. A partir dos mesmos, temos de criar estruturas que fiquem carregadas na memória realizando processamento de dados de entrara e saída de forma sequencial e cíclica. Um computador não tem (ainda) discernimento sobre coisas tão abstratas como fisicamente se dá a passagem do tempo, o que temos são dados de tempo de processamento contínuo, que será usado para simular tempo real.

Tenha em mente que diferente dos modelos de redes neurais artificiais convencionais, onde o processamento tem um começo, meio e fim bem definidos, nosso agente terá para si um modelo de rede neural artificial baseado em um começo (um gatilho inicial), meio e um recomeço. Dessa maneira simulamos continuidade em decorrência do tempo.

Outro ponto importante a ser observado é que este modelo, quando comparado aos modelos de redes neurais artificiais comuns, não possui explicitamente dados base, dados para treino e teste, no lugar destas estruturas estaremos criando o que por alguns autores é a chamada memória de replay, onde a base se constrói gradualmente por dados de experiência se auto retroalimentando.

Apenas finalizando essa linha de raciocínio, você terá de moldar seu agente (e isso será visto na prática nos capítulos de implementação) de forma que o mesmo interpretará estados passados (últimas ações executadas), estados presentes (estado atual + mapeamento do ambiente + recompensa obtida) e estados futuros (próximas ações a serem tomadas) de forma que essa sequência se repetirá de forma intermitente.

 

Anteriormente, vimos que de acordo com a equação de Bellman, havia uma variável V que por sua vez representava os possíveis valores de cada estado a cada etapa.

 

Agora temos uma variável Q (s, a) que representa valores que já foram computados em uma fase de tomada de ação anterior e que está armazenado em memória, inclusive levando em consideração o valor de recompensa obtido anteriormente.

Repare que dessa maneira, estamos sempre trabalhando levando em

consideração o estado anterior para que seja previsto o próximo estado.

 

Assim chegamos na fórmula da equação final, onde temos uma variável TD representando a diferença temporal, que por sua vez realizará a atualização dos valores de Q. Novamente, a cada etapa de execução, a aplicação dessa fórmula será realizada, com o diferencial que agora ela não se inicia aleatoriamente, mas a partir do último valor de estado obtido, gerando um ciclo de processamento retroalimentado e capaz de simular continuidade, já que sempre será retroalimentado e sempre será tomada uma nova decisão.