You are here

Atividade 3

Memória Episódica

 

    A memória episódica do SOAR constitui um mecanismo que, automaticamente, captura, armazena e temporariamente indexa o estado do agente, além de prover uma interface de conteúdo endereçável para que o agente recupere o conteúdo autobiográfico. Essa informação complementa as informações contidas na memória de trabalho e em outras memórias de longa duração, como a memória procedural.

Demonstração

    Este pequeno exemplo demonstra como capturar um episódio e visualizar seu conteúdo, usando o SOAR Debugger. A figura abaixo exibe a criação de um episódio na memória episódica do SOAR. O episódio foi criado executando-se os seguintes comandos: epmem --set trigger dc; epmem --set learning on; watch --epmem.

    Pode-se visualizar a mensagem "NEW EPISODE: 1", indicando a criação de um episódio (id=1) que é automaticamente armazenado no conteúdo episódico do SOAR. Para visualizar o conteúdo desse episódio, basta digitar o seguinte comando: epmem --print 1. Esse comando exibe o conteúdo (figura acima) do episódio de id igual a 1. Pode-se também visualizar, graficamente (conforme figura acima), o conteúdo desse episódio por meio do seguinte comando: command-to-file epmem.gv epmem --viz 1. Será gerado um arquivo (epmem.gv) que contém a estrutura da memória episódica referente ao episódio criado.

Armazenamento Episódico

    A memória episódica do SOAR armazena o conteúdo (top state) da memória de trabalho do agente, num momento particular. Para habilitar seu armazenamento, a memória episódica deve ser habilitada. Isso é realizado através do comando epmem --set learning on. Pode-se configurar o evento responsável pela criação e armazenamento episódico. O padrão do SOAR é criar um novo episódio cada vez que um novo WME é adicionado na memória de trabalho, no identificador output-link. Porém, o armazenamento será configurado para gerar novos episódios a cada ciclo de decisão (dc), pelo comando epmem --set trigger dc. Outro parâmetro configurável é a fase na qual a memória episódica armazena o episódio criado. Por padrão, esse processamento ocorre na fase de saída (output phase). Entretanto, esse processamento pode ser configurado para ocorrer na fase de decisão por meio do comando epmem --set phase selection.

    Também existe a possibilidade de se excluir algumas informações, da memória de trabalho do agente, durante a geração do episódio. Pode-se especificar os atributos que devem ser ignorados e, portanto, não armazenados no episódio criado. Para visualizar os atributos excluídos da memória episódica, basta usar o comando epmem --get exclusions. Para configurar a lista de atributos que serão excluídos na geração dos episódios, basta usar o comando epmem --set exclusions <attribute>. Se este comando for executado com um atributo que já está excluído do episódio, esse atributo será re-inserido nos próximos episódios criados. Os únicos atributos que, por padrão, não são armazenados na memória episódica são a própria memória episódica (epmem) e a memória semântica (smem).

    O comando watch --epmem habilita a visualização dos eventos referentes a criação dos episódios na memória episódica do SOAR.

Interação entre Agente e Memória Episódica

    O agente interage com a memória episódica por meio de estruturas criadas na memória de trabalho. O SOAR cria automaticamente um link epmem em cada estado da memória de trabalho. Essa estrutura possui sub-estruturas especiais para tratar a interação entre agente e memória episódica. O atributo ^command permite ao agente enviar comandos para trabalhar a memória episódica. O atributo ^result retorna as respostas referentes aos comandos enviados para a memória episódica. O comando print --depth 10 <s> imprime a estrutura da memória de trabalho, conforme ilustrado abaixo:

(S1 ^epmem E1 ^io I1 ^reward-link R1 ^smem S2 ^superstate nil
       ^type state)
  (E1 ^command C1 ^present-id 1 ^result R2)
  (I1 ^input-link I2 ^output-link I3)
  (S2 ^command C2 ^result R3)

    Pode-se observar a estrutura referente à memória episódica (S1 ^epmem E1) e suas sub-estruturas (E1 ^command C1 ^present-id 1 ^result R2). O agente, por meio de regras, irá preencher e manter o link command e a arquitetura irá preencher e limpar o link result. Conforme os episódios forem armazenados, o argumento present-id será atualizado para indicar o id do episódio atual, cujo valor é um número inteiro.

Cue-Based (CB) Retrieval

    O modo básico para um agente recuperar o conhecimento da memória episódica é chamado de cue-based retrieval. O agente recupera, da memória episódica, o conteúdo episódico referente ao episódio que casa com os elementos (cue) da memória de trabalho fornecidos pelo agente. O comando query, do link command, recupera o episódio associado aos elementos fornecidos (cue) que seguem esse comando. A memória episódica compara a pista (cue) fornecida com todos os episódios armazenados, pontuando cada episódio, e retorna o episódio mais recente de maior pontuação.

    Os episódios são pontuados de acordo com a estrutura de folhas formada pelos WME's da pista (cue). Essa estrutura de folhas é composta por valores e/ou identificadores referentes aos WME's da memória de trabalho. Uma folha de WME's será satisfeita, em relação a um episódio, se existir um caminho ou uma sequência de WME's do episódio raiz até a folha, onde os atributos de todos os WME's intermediários devem casar com aqueles fornecidos pela pista (cue). A pontuação de um episódio será proporcional às folhas de WME's que foram satisfeitas.

    Por exemplo, considere a estrutura abaixo:

(N1 ^feature value
      ^id N2)
(N2 ^sub-feature value2
      ^sub-id N3)

    Essa pista é formada por três folhas: (N1 ^feature value), (N2 ^sub-feature value2) e (N2 ^sub-id N3). As folhas fornecidas pela pista deverão ser casadas com os episódios contidos na memória episódica do SOAR. A figura abaixo exibe a estrutura, gráfica, relacionada a um exemplo de um episódio:

    A primeira folha, (N1 ^feature value), da pista não casa com o episódio da figura acima. Não há um WME (E1 ^feature value): (E1 ^feature2 value) tem um atributo diferente; (E1 ^feature value3) tem um valor diferente. Apesar disso, as outras folhas da pista são satisfeitas por este episódio. O WME (N2 ^sub-feature value2) da pista casa com o WME (E2 ^sub-feature value2) do episódio. A folha (N2 ^sub-id N3) também casa com o WME (E2 ^sub-id E5). Em ambos os casos, existe um WME, (E1 id E2) e (E1 id E3),  que casa com a folha (N1 id N2). O mesmo não ocorre para (E4 ^sub-feature value2): não existe um WME (E1 id E4) que leva até o nó E4. Assim, este episódio terá uma pontuação igual a 2.

    O programa epmem-tutorial.soar exemplifica o processo de recuperação de informações da memória episódica, pelo agente, conforme descrito no exemplo acima. As regras responsáveis por esse procedimento são exibidas na figura abaixo:

    Ao rodar esse programa no SOAR Debugger, pode-se visualizar (figura abaixo) a criação do episódio exemplo (operador init) na memória de trabalho do agente:

    O estado inicial (S1) contém as estruturas, tais como ^feature value3 ^feature2 value ^id E2 ^id E3, referentes ao episódio exemplo criado. Continuando a rodar o programa, agora o episódio será armazenado na memória episódica do SOAR. A mensagem "NEW EPISODE: 1" indica a criação do episódio, com id igual a 1, na memória episódica. Pode-se observar, na figura abaixo, a aplicação do operador cbr:

    A figura acima indica que as estruturas do episódio exemplo foram removidas da memória de trabalho e a pista (cue) exemplo foi inserida na memória de trabalho do agente. A pista (N1 ^feature value ^id N2) foi adicionada no link command do link epmem. O próximo passo do programa é exibido na figura abaixo:

    Foi criado um novo episódio ("NEW EPISODE: 2"), e a pista foi processada na memória episódica do SOAR. A pista foi comparada com o episódio gravado na memória episódica, retornando a mensagem "CONSIDERING EPISODE". Essa mensagem exibe algumas informações sobre esse procedimento. O parâmetro time indica que a pista foi comparada ao episódio de id igual a 1. O parâmetro cardinality indica que foram satisfeitas 2 folhas de WME's da pista; e o parâmetro score indica a pontuação concedida ao episódio. A mensagem "NEW KING" indica que o episódio considerado, no procedimento de comparação com a pista, casou com as informações contidas na pista apresentada. No entanto, esse casamento não foi perfeito (perfect=false) porque apenas 2 das 3 folhas, contidas na pista, foram casadas com este episódio; o casamento gráfico do episódio também não foi efetuado (graph-match=false) devido ao mesmo motivo.

    O segundo episódio criado não foi considerado pelo procedimento de comparação porque a aplicação do operador cbr removeu, da memória de trabalho, as estruturas da pista; portanto, o episódio 2 não tem nenhuma característica em comum com a pista apresentada anteriormente (que não se encontra mais disponível). O conteúdo da memória episódica (link epmem) pode ser visualizado pelo comando print --depth 10 e1 (figura acima). O link result fornece informações sobre a resposta retornada pela consulta à memória episódica. A resposta indica que houve sucesso (^success N1) na recuperação das informações, além de fornecer informações sobre o conteúdo (episódio) retornado (^retrieved R4).

Progressão Temporal

    Uma outra forma do agente acessar os episódios contidos na memória episódica é por meio de progressão temporal. O agente recupera o episódio que ocorreu, temporalmente, antes ou depois do último episódio recuperado. Os comandos ^previous e ^next, do link command, recuperam os episódios anterior ou posterior, respectivamente, ao episódio recuperado. Esses comandos são seguidos por um identificador. A figura abaixo exibe as regras responsáveis por esse tipo de acesso à memória episódica:

    Ao rodar as regras acima, o comando next será executado. Então, os resultados dos comandos anteriores serão apagados da memória de trabalho e um novo conteúdo da memória episódica será exibido. A figura abaixo exibe o resultado da aplicação desse comando:

    Conforme a figura acima, os resultados anteriores foram apagados e um novo episódio foi recuperado da memória episódica. Esse episódio é o próximo episódio que segue o episódio 1, anteriormente recuperado; ou seja, o comando next retornou o episódio 2 (R2 ^memory-id 2) gravado na memória episódica.

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer