Escrito por: 

Diego Oliveira

DESENVOLVENDO UMA REDE NEURAL LONG SHORT-TERM MEMORY (LSTM) UTILIZANDO A LINGUAGEM DE PROGRAMAÇÃO C++

Primeiramente é necessário entender o funcionamento de uma rende neural Long Short-Term Memory (LSTM), para isso basta ler o artigo escrito no Padawan Blog entitulado “Entendendo o LSTM”. Agora, vamos iniciar a aplicação da nossa rede neural.

CONHECIMENTOS E TECNOLOGIAS UTILIZADAS PARA O DESENVOLVIMENTO DA REDE NEURAL LSTM

Para o desenvolvimento da LSTM será preciso conhecimento prévio em linguagem de programação C++ mais aprofundadas como estrutura de dados, ponteiros, matrizes, entre outros, além de pré-requisitos computacionais. Para compilação do programa, irei utilizar o. 

IMPLEMENTAÇÃO DE UMA CÉLULA LSTM

Irei implementar uma única célula LSTM (Long Short-Term Memory) para processar uma sequência de entrada. Para isso, irei fazer uso de algumas bibliotecas, sendo essas;

  • iostream: biblioteca de entrada e saída padrão do C++.
  • cmath: biblioteca matemática padrão do C++ que contém funções matemáticas como exponenciação, logaritmo, etc.
  • vector: biblioteca que implementa arrays dinâmicos do C++.

A biblioteca iostream é usada para imprimir mensagens na tela, enquanto as bibliotecas cmath e vector são usadas para realizar cálculos matemáticos e manipulação de vetores, respectivamente.

Bibliotecas utilizadas no código

No código a célula LSTM é implementada como uma classe chamada “LSTM_Cell”. A célula LSTM possui cinco variáveis privadas: os pesos dos três portões da célula (entrada, esquecimento e saída), o estado da célula e o estado oculto. A classe tem um construtor que inicializa todos esses valores com valores padrão. Como pode ser visto a seguir:

Pesos da célula LSTM

A classe também possui duas funções auxiliares, sendo elas a função sigmóid e a função tangente hiperbólica, elas são funções de ativação do código, como descrito no seguinte código:

Funções de ativação

Em seguida criei um método chamado forward_pass que é uma função membro pública da class LSTM_Cell e implementa a passagem para frente (foward pass) da célula para um único instante de tempo.

 

A passagem para frente é uma operação que permite que uma rede neural processe um conjunto de dados de entrada, que nesse caso seria um único valor de entrada, para que assim, gere uma saída correspondente. No contexto de uma célula LSTM, a passagem para frente envolve o cálculo das saídas da porta de entrada, porta de saída e porta de esquecimento, bem como a atualização do estado da célula e do estado oculto.

 

O método forward_pass recebe um valor de entrada (input) e usa os pesos das portas de entrada, saída e esquecimento da célula LSTM para calcular as ativações das portas de entrada, saída e esquecimento correspondentes. Em seguida, atualiza o estado da célula e o estado oculto da célula LSTM com base nas ativações das portas e no valor de entrada. Como pode ser visto na imagem a seguir:

Método foward_pass

Em seguida criei a função principal do programa, ela é chamada automaticamente no código quando executado. O código int main() inicializa uma sequência de entrada e a célula LSTM. Em seguida ela executa um loop for que alimenta a célula LSTM com cada valor de entrada da sequência e fornece a saída correspondente. A função int retorna um valor inteiro 0 (Zero) que indica que o programa foi executado sem problemas. A seguir a imagem como código da função int main ():

função principal

 

 

Por fim, após a execução do programa ele fará com que seja impresso na tela a entrada atual e a saída oculta correspondente obtida da célula LSTM em cada iteração do laço “for”.

 

A sequência de entrada é {1.0, 2.0, 3.0, 4.0, 5.0}, e a célula LSTM foi inicializada com pesos padrão iguais a 0.5. Durante a execução do laço “for”, a célula LSTM será alimentada com cada valor de entrada da sequência, e a saída oculta correspondente será calculada e impressa na tela. Como vista a seguir:

Impressão de input e output da célula LSTM

Nos Siga: