You are here

Tutorial 3: Intermediate ACS Setup

Tutorial 3: Intermediate ACS Setup


 

Optimizing Task Performance via “Tuning” Parameters

 É possível estabelecer certos parâmetros para aumentar a performance de uma tarefa. Clarion tem muitos parâmetros que podem ser modificados. Estes parâmetros estão divididos em dois grupos, os parâmetros globais (static) e os locais (instance).

O seguinte código apresenta como dois parâmetros podem ser modificados durante a realização de uma tarefa:

RefineableActionRule.GlobalParameters.SPECIALIZATION_THRESHOLD_1 = -.6;
RefineableActionRule.GlobalParameters.GENERALIZATION_THRESHOLD_1 = -.2;

Também podem ser ativados ou desativados métodos de aprendizado, as seguintes linhas de código mostram como fazer isso:

ActionCenteredSubsystem.GlobalParameters.PERFORM_RER_REFINEMENT = false;
ActionCenteredSubsystem.GlobalParameters.PERFORM_RULE_EXTRACTION = false;
ActionCenteredSubsystem.GlobalParameters.PERFORM_TOP_DOWN_LEARNING = false;
ActionCenteredSubsystem.GlobalParameters.PERFORM_BL_LEARNING = false;

Os anteriores exemplos são exemplos de parâmetros globais.

Making Global Parameter Changes

Para poder mudas os parâmetros primeiro se deve saber como aceder a eles. Como já foi dito, os parâmetros globais são armazenados de forma estática. Cada classe tem uma propriedade (GlobalParameters) que retorna uma lista das propriedades que podem ser modificadas. Por exemplo as propriedades das classes RefineableActionRule e ActionCenteredSubsystem podem ser acedidas com o seguinte código:

RefineableActionRule.GlobalParameters
ActionCenteredSubsystem.GlobalParameters

Tem que levar algumas considerações no momento de modificar os parâmetros de uma classe. A primeira consideração é que as mudanças nos parâmetros globais somente são aplicáveis à instância da classe ANTES de ser inicializada. Uma mudança após o processo de inicialização não vai produzir nenhuma mudança na classe.

Por exemplo:

Agent John = World.NewAgent("John");
ActionCenteredSubsystem.GlobalParameters.PERFORM_RER_REFINEMENT = false;

 No código anterior, o ACS é inicializado como parte da inicialização do agente, assim o subsistema de John já estará inicializado para quando o parâmetro de PERFORM_RER_REFINEMENT é estabelecido em falso, portanto a segunda linha não vai ter nenhum efeito e o parâmetro PERFORM_RER_REFINEMENT não será estabelecido em falso.

A maneira correta de fazer o anterior é:

ActionCenteredSubsystem.GlobalParameters.PERFORM_RER_REFINEMENT = false;
Agent John = World.NewAgent("John");

A segunda coisa que é necessário saber é que as mudanças num parâmetro de uma classe vai afetar o parâmetro de TODAS as classes da que ela deriva. Assim por exemplo ao realizar o seguinte código:

Rule.GlobalParameters.POSITIVE_MATCH_THRESHOLD = .75;

É modificado o parâmetro POSITIVE_MATCH_THRESHOLD de todas as classes que derivam de Rule como por exemplo RefineableActionRule, IRLRule, AssociativeRule, etc. Mas se você quer mudar o parâmetro para todas as regras do tipo IRLRule é só trocar a classe Rule por IRLRule assim:

IRLRule.GlobalParameters.POSITIVE_MATCH_THRESHOLD = .75;
 

Making Local Parameter Changes

A outra forma de realizar as mudanças de parâmetros é fazer as mudanças de maneira "local". Mudanças nos parâmetros locais são feitos nas instâncias das classes, usando a propriedade Parameters. Por exemplo, é possível mudar o parâmetro PERFORM_RER_REFINEMENT somente para o agente John assim:

John.ACS.Parameters.PERFORM_RER_REFINEMENT = false;

Em contraste com os parâmetros globais, os parâmetros locais podem ser modificados em qualquer momento. Por exemplo, é possível modificar o "LEARNING_RATE" de uma rede em qualquer momento usando:

net.Parameters.LEARNING_RATE = .5;

A mudança no parâmetro terá efeito a seguinte vez que o learning rate seja aplicado.

Setting Up the Working Memory

Nesta secção será mostrado como usar e configurar a working memory. De forma geral a working memory pode ser pensada como o recipiente dentro do qual o agente contem o conhecimento sobre o mundo. Ela esta dentro do ACS. Todas as iterações com a working memory são feitas através da classe Agent. Para as instâncias é possível ver o conteúdo da working memory através do método GetInternals. O seguinte código mostra como fazer isso:

IEnumerable<Chunk> wmContents =(IEnumerable<Chunk>)John.GetInternals(Agent.InternalWorldObjectContainers.WORKING_MEMORY);

O working memory pode armazenar qualquer tipo de chunk. Cada vez que um chunk é estabelecido no working memory, ele começa a fazer parte da "informação sensorial interna" e será ativo automaticamente na SensoryInformation

Os World objects podem ser adicionados ao working memory de duas maneiras: manualmente ou usando o “working memory update action chunk.

Manually Setting a Chunk in Working Memory

A forma mais simples de adicionar um chunk na working memory é adiciona-lo manualmente. A tarefa é feita chamando ao método SetWMChunk dentro do Agente. Por exemplo pode-se adicionar o chunk ch ao agente John assim:

John.SetWMChunk(ch, 1);

O método SetWMChunk recebe dois parâmetros, o primeiro é o chunk que se quer adicionar, e o segundo é o nível de ativação desse chunk.
Para remover ou eliminar o chunk da working memory é possivel usar o método ResetWMChunk. O seguinte código apresenta a maneira de eliminar o chunk ch:

John.ResetWMChunk(ch);
 

Using Action Chunks

Na implementação do Clarion as ações que produz atualizações na working memory são definidas usando a classe WorkingMemoryUpdateActionChunk. Ela contem uma lista de todos os chunks na working memory. Assim, por exemplo, é possível adicionar o chunk ch com o seguinte código:

WorkingMemoryUpdateActionChunk wmAct = World.NewWorkingMemoryUpdateActionChunk();
wmAct.Add(WorkingMemory.RecognizedActions.SET, ch);

Para usar o chunk em qualquer componente dentro da ACS tudo o que tem que ser feito é passar o objeto wmAct assim:

net.Output.Add(wmAct);

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer