Exercício 3: Informações sobre alguns módulos da arquitetura
A arquitetura cognitiva LIDA (Learning Intelligent Distribution Agent) é um modelo conceitual e computacional que abrange vários aspectos da cognição humana. Essa arquitetura cognitiva foi desenvolvida pelo grupo Cognitive Computing Research Group, liderado pelo professor Stan Franklin, da Universidade de Memphis, nos EUA.
A arquitetura LIDA é baseada na teoria Global Workspace que foi proposta por Bernard Baars com a intenção de explicar qualitativamente processos cognitivos conscientes e inconscientes. Outra característica importante da arquitetura LIDA é que ela é fundamentada no ciclo cognitivo apresentado na Figura 1.1.
Figura 1.1: Ciclo Cognitivo do LIDA.
Um agente ou criatura deve experimentar seu ambiente por meio de seus sensores e dar respostas adequadas, executando ações que são selecionadas após o processamento das entradas recebidas através desses sensores. Logo, pode-se inferir que a vida de um agente consiste na execução continua de um ciclo cognitivo que pode ser representado pelas estruturas mostradas na Figura 1.1.
Durante cada ciclo cognitivo, as informações recebidas pelos sensores do agente são processadas de forma que o agente perceba sua situação interna e externa atual. Então, um processo competitivo decide qual parte da situação atual necessita de mais atenção e qual ação deve ser executada para completar o ciclo. Esse processo competitivo é parte da teoria Global Workspace.
Um ciclo cognitivo da arquitetura LIDA pode ser dividido em três fases: a fase de compreensão, a fase de atenção (corresponde a consciência) e a fase de seleção de ação.
Veja na Figura 1.1 que o início do ciclo ocorre na fase de compreensão, onde são recebidos estímulos internos e externos que são passados para a memória sensorial. Depois, a saída é enviada para a memória associativa perceptual. Nessa estrutura, as características de alto nível são categorizadas em objetos, categorias, ações, eventos, entre outros. O próximo passo é enviar o resultado para o Workspace.
O Workspace é o responsável por armazenar a percepção atual, as percepções anteriores que ainda sejam úteis, entre outros. Por isso, pode-se dizer que essa estrutura funciona como um buffer da memória de trabalho. As entidades que estão no Workspace são direcionadas para a memória episódica transitória ou para a memória declarativa, produzindo associações locais, que são combinadas com a percepção para gerar um modelo da situação atual, que corresponde ao que o agente entende em relação ao que está acontecendo atualmente. A memória episódica transitória é uma memória usada para armazenar informações sobre eventos, como o tipo de evento e o local onde ocorreu. Por outro lado, a memória declarativa é uma memória episódica de longo prazo que pode ser subdividida em memória autobiográfica de eventos, que armazena eventos relacionados ao agente, e memória semântica de fatos, que armazena informações de fatos não relacionados ao agente, mas que podem ser úteis em sua interação com o mundo virtual.
A fase de atenção é iniciada no ciclo cognitivo por meio dos codelets de atenção, que formam coalizões de partes selecionadas do modelo da situação atual e move essas coalizões para o global Workspace. Os codelets de atenção são estruturas responsáveis por levar informações para a consciência.
No global Workspace as coalizões enviadas pelos codelets são selecionadas por meio de uma competição. Essa competição seleciona a coalizão mais relevante ou urgente e transforma o conteúdo dessa coalização em um conteúdo da consciência. Depois disso, esse conteúdo é transmitido globalmente, dando início a fase de seleção de ação.
Na fase de seleção de ação, vários processo ocorrem simultâneamente. Por exemplo, novas entidades e associações são enviadas para a memória associativa perceptual, que foi explicada anteriormente. Ao mesmo tempo, alguns eventos da consciência são transmitidos para a memória episódica transitória. Além disso, possíveis ações, juntamente com seu contexto e resultados esperados são enviados para a memória procedural.
Uma cópia das possíveis ações, juntamente com seu contexto, resultados esperados e outras variáveis, armazenadas na memória procedural, são enviadas para o mecanismo de seleção de ação. Esse mecanismo escolhe a ação mais adequada para a situação atual que está na consciência do agente. É importante destacar que apenas uma ação é escolhida em cada ciclo.
Depois que o mecanismo de seleção de ação escolhe uma ação a ser executada pelo agente, essa ação passa pela memória sensorio-motor, onde um algoritmo qualquer irá produzir a ação selecionada.
A arquitetura cognitiva LIDA pode ser implementada na prática por meio do framework LIDA que utiliza a linguagem de programação Java. Segundo os autores, o objetivo ao usar um framework é facilitar o uso da arquitetura. Com o framework não é necessário implementar todas as estruturas complexas da arquitetura, pois ele já fornece suas funcionalidades genéricas, permitindo a reutilização e diminuindo a complexidade da criação de aplicações customizadas.
A arquitetura cognitiva LIDA pode ser implementada na prática por meio do framework LIDA que utiliza a linguagem de programação Java. Segundo os autores, o objetivo ao usar um framework é facilitar o uso da arquitetura. Com o framework não é necessário implementar todas as estruturas complexas da arquitetura, pois ele já fornece suas funcionalidades genéricas, permitindo a reutilização e diminuindo a complexidade da criação de aplicações customizadas.
O framework LIDA pode ser dividido nas seguintes estruturas genéricas: módulo (module, tarefa (task), interface gráfica configurável, fábrica factory e interpretador XML.
Um módulo é um conjunto de representações e processos que as operam. Uma tarefa é um pequeno algoritmo que é executado repetidamente para para implementar algum processo de pequeno porte. Um conjunto de tarefas pode ser gerenciadas por um gerenciador de tarefas. A interface gráfica configurável é a estrutura responsável por mostrar o estado atual dos processos e os dados do sistema. Uma fábrica é usada para criar estruturas de dados comuns que encapsulam algoritmos comuns. O interpretador XML é utilizado para interpretar o arquivo XML que possui dados do agente e, então, criar o agente.
Os agentes criados com o framework LIDA são compostos de módulos, listeners e tarefas.
A arquitetura LIDA possui inúmeros módulos que podem ser vistos na Figura 1.1, tais como a memória sensorial, a memória perceptiva associada e o Workspace. Os módulos podem conter submódulos. Por exemplo, o módulo Workspace contém o submódulo Modelo da Situacional Atual.
Os módulos são especificados pela interface FrameworkModule. A implementação padrão dos módulos se dá pela classe abstrata FrameworkModuleImpl e os módulos que se estendem dessa implementação herdam um nome, zero ou mais submódulos e um TaskSpawner que ajuda a executar as tarefas.
Os módulos do framework LIDA devem passar informações um para o outro. Nesse processo de troca de informações, o LIDA usa um padrão de design chamado de Observer Pattern e um módulo Listener recebe informações de um módulo Producer. Um método Listener permite que o módulo producer envie as informações para todos os módulos Listener registrado sem precisar conhecer os detalhes sobre os módulos Listener que receberão a informação.
Além de usar o módulo Listener, outra forma de associar módulos é através do método addAssociatedModule da interface FrameworkModule. Por exemplo, o módulo AttentionCodeletModule precisa acessar o módulo Workspace para recuperar conteúdo e o método Global Workspace para acessar coligações com esse módulo.
Os módulos precisam executar várias tarefas para conseguir atingir suas funcionalidades. Então, o LIDA usa tarefas (tasks) para implementar seus processos. Uma tarefa tem um algoritmo, um tempo e um status. Ela usa demons da Teoria do Pandemonium ou um codelet. Cada agente possui um gerenciador de tarefas (TaskManager) que usa um conjunto de threads para a execução de tarefas e controla o tempo interno do aplicativo. A unidade de tempo é chamada de tick e seu valor no instante atual é um inteiro iniciado em zero e incrementado de acordo com o progresso na execução do agente. É importante destacar que os módulos não trabalham diretamente com o gerenciador de tarefas, mas possuem um TaskSpawner associado que envia as tarefas para ele.
O gerenciador de taregas possui loops que seguem a seguinte sequência: decai todos os módulos, executa todas as tarefas agendadas para o tick atual, atualiza a interface gráfica configurável e incrementa o tick atual.
No arquivo de declaração do agente, o gerenciador de tarefas pode ser configurado por meio dos seguintes parâmetros: duração do tick (tickDuration) e número máximo de threads (maxNumberOfThreads.)
Outra parte importante do framework LIDA é a estrutura NodeStructure que é uma estrutura de grafo que contém nós e links e normalmente são usados pelos módulos para representar seu estado interno. Um nó pode representar características, objetos, eventos, entre outros. Os links são usados para conectar um nó a outro nó ou um nó outro link.
Os nós, links e outro elementos do framework LIDA, tais como coalizões e codelets tem uma ativação que geralmente representam a importancia do elemento. Além disso, os elementos podem ter também uma ativação base-level adicional para o seu processo de aprendizagem. Todas essas ativações são excitadas ou enfraquecidas por meio de estratégias que especificam a forma de ativação de cada elemento. Essas excitações e enfraquecimentos da ativação podem ocorrer de forma linear ou sigmoidal. As estratégias que especificam a forma de ativação, além dos nós, links e tarefas, são obtidas do ElementFactory. Os tipos de elementos que podem ser produzidos no ElementFactory podem ser configurados no arquivo factoryData.xml, que deve receber informações como o nome, a classe e os valores dos parâmetros de cada tipo de elemento.
O framework LIDA possui um pacote chamado inicialization que contém as classes relacionadas a configuração e execução de uma simulação de um agente. Uma das principais classes desse pacote é o AgentStarter que possui métodos que executam uma simulação de um agente. O método main dessa classe pode ser executado por meio de linha de comando com uma parâmetro que indica o caminho do arquivo de configuração principal, conforme mostra a Figura 2.1.
Figura 2.1: Método main da classe AgentStarter.
Observe que no método mostrado acima é chamado o método start. Esse método, mostrado na Figura 2.2, segue os seguintes passos:
- são carregadas as definições dos tipos de elementos num arquivo de configuração secundário chamado de factory data file. Este arquivo é especificado na propriedade lida.elementfactory.data no arquivo de configuração primário;
- por meio do método run (Figura 2.2), uma instancia da classe Agent é criada com base ao conteúdo do arquivo de declaração do agente. Este arquivo é especificado na propriedade lida.agentdata no arquivo de configuração primário;
- se a propriedade lida.gui.enable do arquivo de configuração primário estiver setada como true, é criada a interface gráfica do usuário usando a informação do arquivo de configuração da interface gráfica, especificado nas propriedades lida.gui.panel e lida.gui.commands no arquivo de configuração principal;
- o agente é carregado;
- a interface gráfica é criada e apresentada ao usuário.
Figura 2.2: Método start da classe AgentStarter.
Figura 2.3: Método run da classe AgentStarter.
O arquivo especificado na propriedade lida.agentdata do arquivo de configuração principal contém a tag raiz <lida>, seguida de outras tags, tais como:
- <globalparams>: contém parâmetros utilizados durante o processo de inicialização do módulo;
- <taskmanager>: contém parâmetros para a configuração do gerenciador de tarefas;
- <taskspawners>: contém subtags do tipo <taskspawners> disponíveis para os módulos do agente;
- <submodules>: contém subtags do tipo <submodules> que defini as classes e os parâmetros necessários para cirar os módulos do agente;
- <listeners>: contém subtags do tipo <listeners> que declara as conexões listeners entre os módulos do agente.
Veja na Figura 2.4 um exemplo de arquivo de configuração que contém algumas das tags apresentadas acima.
Figura 2.4: Exemplo de arquivo de configuração.
Como pode ser visto na linha 110 do código apresentado na Figura 2.3, no método run é chamada a classe AgentXMLFactory. Essa classe carrega o arquivo de declaração, analisa ele, cria os componenentes declarados no arquivo e os monta em um objeto Agent. O método getAgent da classe AgentXMLFactory, mostrado na Figura 2.5, executa a seguinte sequência de ações:
- se existe algum parâmetro global, ele é lido e adicionado à classe GlobalInitializer;
- o gerenciador de tarefas é criado;
- o Taskspawners é criado;
- os módulos são criados e o método init é chamado para cada módulo;
- as conexões ModuleListener são criadas;
- os módulos são associados, caso isso tenha sido definido nas declarações do módulo;
- cada módulo que especifica um inicializador de classe na sua declaração é reinicializado usando a classe especificada.;
- para cada módulo, que tem como tarefas iniciais especificados na sua declaração, as tarefas especificadas são criadas e os TaskSpawner do módulo agendará a execução dessas tarefas;
Figura 2.5: Método getAgent da classe AgentXMLFactory.
O arquivo especificado na propriedade lida.elementfactory.data do arquivo de configuração principal é um arquivo XML que contém as definições relacionadas as estratégias, nós, links e tipos de tarefas adicionados para o ElementFactory.
Um codelet é um pequeno trecho de código executável, normalmente capaz de executar uma função bastante simples e específica. Eles operam de maneira independente e assíncrona. Essa estrutura foi proposta incialmente para a arquitetura Copycat que foi criada em 1984 por Hofstadter e Mitchell. Os codelets fazem uma varredura no workspace para encontrar elementos que sejam úteis para a situação atual e contém a probabilidade de cada resultado. Então, a ativação de um codelet depende da probabilidade do resultado e constantemente ajustada pelo feedback retornado pelo ambiente. A ativação de novas estruturas depende tanto da ativação do codelet, quanto de seus elementos desencadeantes. Além disso, os codelets podem ser combinados para formar novas estruturas de forma a construir estruturas maiores. Logo, pode-se inferir que eles podem ser utilizados para dividir as tarefas em pequenas tarefas, podendo resolvê-las em paralelo, o que aumenta a rapidez e facilita o encontro de soluções mais eficiêntes. Quando eles agem em conjunto, diz-se que eles formaram uma coalisão.
No LIDA, o principal tipo de codelets são os codelets de atenção. Esses codelets tem o objetivo de trazer informações para a consciência, de acordo com o seu próprio conjunto de preferências. Esses codelets formam coalizões de partes selecionadas do modelo da situação atual e move essas coalizões para o global Workspace. Como vários codelets podem ser acionados, eles competem entre si para trazer eventos relevantes ou urgentes para a consciência.
A memória associativa perceptual (PAM - Perceptual Associative Memory) é implementada na arquitetura LIDA como uma slipnet. Uma slipnet é um módulo da arquitetura Copycat, criada em 1984 por Hofstadter e Mitchell, que funciona com uma rede semântica onde seus nós representam detectores de características primitivas, indivíduos, uma categoria ou uma relação. A PAM, independentemente da semântica de um determinado item ( se o item é um objeto, uma categoria ou um conceito) todos serão representados na slipnet como nós de estrutura idêntica. Esses nós da slipnet podem representar as relações entre os objetos, como as relações temporais, espaciais ou causais.
Os estímulos de entrada, tal como uma imagem visual, é originada por meio de codelets perceptivos. Cada um desses codelets procuram características especiais como uma determinada cor, tamanho, inclinação. Quando um codelet encontra a caracterítica que é de seu interesse, ele ativa os nós apropriados da slipnet que contrói o estímulo adequado que será colocado na consciência. Então, um nó é criado para esse estímula na PAM, consistindo na percepção atual do agente.
A rede de comportamentos usada no LIDA é uma melhoria da rede de comportamentos proposta por Patty Maes em 1989. A rede de comportamentos do LIDA é usada para seleção de ação de auto nível. Ela é um dígrafo composto de codelets de comportamento que executam uma única ação, multíplos codelets de comportamento atuando em paralelo e múltiplos comportamentos que operam em uma sequência ordenada e por suas ligações. Essas três entidades da rede de comportamento compartilham a mesma representação na memória procedural.
Os comportamentos que formam a rede de comportamentos competem entre si para serem selecionados. Então, a escolha do comportamento vai depender da situação atual do agente.
A teoria Global Workspace foi proposta por Bernard Baars em 1983 com a intenção de explicar qualitativamente processos cognitivos conscientes e inconscientes. Segundo essa teoria, o cérebro pode ser visto como um conjunto de redes especializadas distribuídas e a consciência está relacionada a um espaço de trabalho global com uma capacidade de memória e com uma capacidade de distribuição ampla do conteúdo para redes especializadas inconscientes. A teoria Global Workspace defende também que algumas redes inconscientes podem contribuir na formação de conteúdos conscientes. Essas redes inconscientes são chamadas de contexto. Os contextos podem trabalhar em conjunto para restringir eventos conscientes. Além disso, a teoria proposta por Bernard Baars aponta que as motivações e emoções são partes de contextos objetivos e que funções executivas trabalham como hierarquias de contextos objetivos.
Segundo a teoria Global Workspace a função da consciência é propagar informação em broadcast para módulos funcionais separados distribuídos no cérebro. Existe um espaço no cérebro chamado Workspace Global, que é um processador central. A consciência funciona como um teatro, em que cada célula do cérebro ou grupo neural que modela um fenômeno perceptivo do ambiente seria um agente que está sentado no teatro assistindo a um espetáculo. Esse espetáculo é um conjunto de agentes que estão no palco executando alguma ação. Existe uma luz que foca algum desses agentes que está no palco. Esse espetáculo é interativo, então a qualquer momento alguma pessoa do platéia que veja alguma coisa que a interessa no palco e que esteja no foco de luz pode correr para o palco e executar sua performance. Estando no palco, os indivíduos competirão entre sim para ganhar o foco de luz, e quando isso ocorre todos os agentes da plateia e do palco conseguem observar o que ele está fazendo.
A consciência é um filme na mente, mas não precisa de espectador, porque os espectadores não é só uma pessoa, mas todos os grupos neurais. Esses grupos neurais são espectadores do que está sob o foco de luz e o foco de luz só atrai o que é mais importante. Essa informação é propagada em broadcast para todo sistema e desta forma, qualquer agente pode sair da plateia e executar sua ação caso o que esteja no foco de luz seja importante para ele. Esse modelo ajuda a compreender a idéia de consciência de acesso, que possui uma memória de trabalho controla a informação que se torna consciente e funciona como o “palco” da consciência. Na consciência existe um conjunto de informações selecionadas pelo “executivo central” e a informação consciente torna-se disponível para outros processos cognitivos.