Simulador eficiente e conciso de atividade neural.
Funcionalidades Exemplo de Uso Aplicação a Aprendizado de Máquina Conclusão Repositório Monografia [EN]SNNBlaze é um simulador de redes neurais pulsadas, um paradigma de redes neurais que se inspira diretamente no funcionamento biológico do cérebro, que oferece uma modelagem realista e busca emular a eficiência computacional e energética do cérebro humano. Esta ferramente oferece uma implementação concisa e eficaz para a criação e simulação de redes compostas por neurônios do tipo Leaky Integrate-And-Fire, utilizando um modelo de simulação baseado em eventos para maximizar o desempenho.
O simulador permite instanciar de qualquer rede que possa ser representada por um grafo, incluindo múltiplas populações de neurônio com características distintas.
Núcleo de simulação, desenvolvido em C++, oferece um desempenho competitivo, alcançando tempos de simulação comparáveis aos simuladores mais eficientes da área, como Brian 2 e NEST
O simulador conta com uma API em Python, que simplifica a configuração e execução de simulações, também permitindo uma integração com outras ferramentas do ecossistema científico, como NumPy e scikit-learn.
Uma característica chave da implementação é a sua simplicidade: o paradigma de execução baseado em eventos oferece um nível competitivo de desempenho, mas também mantém a implementação do simulador concisa. Isso torna a ferramenta uma boa opção para sistemas embarcados, onde a memória disponível é limitada.
Além disso, é importante ressaltar que a execucão baseada em eventos permite que o simulador realize operações apenas quando um evento ocorre, reduzindo a carga computacional em comparação com um simulador baseado em tempo. A estrutura, assim como as entradas e saídas do simulador estão ilustradas na imagem abaixo:
O SNNBlaze é uma ferramenta de código aberto, disponível no GitHub, permitindo que pesquisadores e entusiastas explorem a implementação e contribuam para a sua expansão e aprimoramento.
Um exemplo de uso da interface em Python para a criação e simulação de uma rede neural simples está ilustrado abaixo.
# Initializing a network and monitors
example_net = pb.NeuralNetwork()
spike_monitor = pb.SpikeMonitor()
state_monitor = pb.StateMonitor(reading_interval=0.1e-3)
spike_monitor.reset_spikes()
lif_neuron1 = pb.LIFNeuron(tau_m=20e-3, C_m=1, v_rest=-70e-3, v_reset=-70e-3, v_thresh=-50e-3, refractory=2e-3)
lif_neuron2 = pb.LIFNeuron(tau_m=60e-3, C_m=2, v_rest=-70e-3, v_reset=-70e-3, v_thresh=-50e-3, refractory=2e-3)
inp_neuron = pb.InputNeuron()
# Adding neuron populations
example_net.add_neuron_population(2, lif_neuron1) # index 0,1
example_net.add_neuron_population(1, lif_neuron2) # index 2
example_net.add_neuron_population(1, inp_neuron) # index 3
# Adding synapses
synapses = [
pb.Synapse(3, 0, 10e-3, 10e-3),
pb.Synapse(0, 1, 15e-3, 10e-3),
pb.Synapse(1, 2, 20e-3, 10e-3),
pb.Synapse(2, 0, 10e-3, 10e-3),
]
for syn in synapses:
example_net.add_synapse(syn)
# Setting monitors
example_net.set_spike_monitor(spike_monitor)
example_net.set_state_monitor(state_monitor)
# Scheduling 20 spike events for input neuron
for i in range(50):
example_net.schedule_spike_event(0.002*i, 3, 20e-3)
print(f'Network size: {example_net.size()}')
# Running the network for 200 ms
example_net.run(0.2)
O código corresponde à rede ilustrada na imagem abaixo:
Os parâmetros definidos no código buscam se aproximar de valores medidos em neurônios reais. Utilizando essas configurações, o conjunto de imagens a seguir mostra um exemplo de entrada fornecida para a rede, assim como o estado e pulsos gerados pelo neurônio da população 3.
O simulador foi testado para a resolução de problemas de aprendizado de máquina. Isso é possível através da construção de uma liquid state machine. A ideia central dessa estratégia é utilizar um conjunto fixo de neurônios interconectados (o reservatório) para transformar entradas temporais em representações de alta dimensão. As representações obtidas são então usadas para treinar um classificador simples, como nesse caso onde uma regressão logística é utilizada para problemas de classificação.
Dois datasets foram utilizados para avaliar o desempenho do simulador em tarefas de aprendizado de máquina: Spiking Heidelberg Digits e N-MNIST. Ambos são datasets compostos por padrões de pulsos, compatíveis com redes pulsadas.
Nesse estudo, um reservatório tridimensional inspirado na topologia de colunas corticais foi utilizado. Esse modelo é instanciado de maneira aleatória, com os parâmetros de geração sendo ajustado para controlar o comportamento global do sistema. Um exemplo de reservatório gerado pode ser visto na imagem abaixo:
Para mais detalhes sobre a arquitetura utilizada e os resultados obtidos, consulte a monografia associada ao projeto.
Este dataset é composto por padrões de pulsos representando dígitos falados (0-9) em inglês e alemão. Cada padrão emula os sinais gerados pela cóclea humana em resposta ao estímulo acústico correspondente. O objetivo dessa tarefa é classificar corretamente os dígitos com base nesses padrões de pulsos. A imagem abaixo ilustra um exemplo de padrão de pulsos do dataset SHD para o dígito 1 em inglês:
Ao realizar experimentos utilizando o SNNBlaze, foi possível obter uma exatidão de 78,09% nesta tarefa, demonstrando um bom nível de desempenho através do uso do simulador.
Este dataset contém padrões de pulsos que representam dígitos escritos à mão (0-9). Esses padrões são gerados a partir da captura das imagens do dataset MNIST (imagens comuns de dígitos) por meio de uma câmera DVS (Dynamic Vision Sensor), resultando em uma representação baseada em pulsos. Nesta tarefa, a classificação deve ser realizada com base nesses padrões.
A imagem abaixo exemplifica um padrão de pulsos do dataset N-MNIST correspondente ao dígito 0 durante 150 ms. Os eventos são organizados em uma grade 2D e também possuem uma polaridade associada:
Ao tratar este problema com uma liquid state machine utilizando o SNNBlaze, foi obtida uma exatidão de 95,16%, demonstrando novamente um bom nível de desempenho no tratamento de tarefas de aprendizado de máquina.
Foram obtidos resultados relevantes, tanto pelo desenvolvimento de um novo simulador conciso e eficiente quanto pelos resultados obtidos no estudo da implementação de liquid state machines bioinspiradas nesse ambiente, demonstrando bom desempenho em tarefas de classificação.
O desempenho do simulador mostrou-se próximo ao estado da arte, demonstrando o potencial da abordagem desenvolvida. Contudo, ainda são possíveis otimizações para aprimorar sua escalabilidade, especialmente para viabilizar simulações eficientes de redes de grande porte. Além disso, seria benéfico expandir suas capacidades, por exemplo, por meio da inclusão de mecanismos de plasticidade sináptica. A inclusão dessas capacidades na modelagem das redes neurais também pode conduzir a melhorias de desempenho no tratamento de problemas de aprendizado de máquina.
Em conclusão, o projeto estabelece uma solução eficaz e também uma base sólida para pesquisas futuras, abrindo caminho para o estudo de métodos de simulação mais eficientes e biologicamente plausíveis, fundamentando-se na implementação desenvolvida.
Tendo isso em vista, o código do projeto está disponibilizado como código aberto, deixando seu uso e modificação livres para qualquer indivíduo ou organização interessada.
Uma lista completa das referências utilizadas está disponível na monografia.
Para descobrir mais sobre redes neurais pulsadas e liquid state machines, as seguintes referências são úteis:
GERSTNER, Wulfram; KISTLER, Werner M. Spiking Neuron Models: Single Neurons, Populations, Plasticity. Cambridge: Cambridge University Press, 2002.
YAMAZAKI, Kashu; VO-HO, Viet-Khoa; BULSARA, Darshan; LE, Ngan. Spiking Neural Networks and Their Applications: A Review. Brain Sciences, v. 12, n. 7, p. 863, jun. 2022. DOI: 10.3390/brainsci12070863.
MAASS, Wolfgang; NATSCHLÄGER, Thomas; MARKRAM, Henry. Real-Time Computing Without Stable States: A New Framework for Neural Computation Based on Perturbations. Neural Computation, v. 14, n. 11, p. 2531–2560, nov. 2002. DOI: 10.1162/089976602760407955.