Criação de uma rede neural em NTL +


Introdução

As redes neurais artificiais - são modelos matemáticos e as suas implementações de software ou hardware são construídos sobre o princípio da organização e funcionamento das redes neurais biológicas - redes de células nervosas (neurônios) do cérebro.

Atualmente, as redes neurais são usadas amplamente em muitas tarefas de reconhecimento, classificação, memória associativa, determinando padrões, prevendo etc.

Ao fim de trabalhar com redes neurais existem produtos matemáticos separados e módulos adicionais para os principais pacotes de software matemáticos que fornecem amplas capacidades de construção de redes de diferentes tipos e configurações.

Nós, por outro lado, tentamos criar nossa própria rede neural a partir do zero, por meio da NTL + linguagem e tentar ao mesmo tempo as suas capacidades de programação orientada a objetos.

Escolhendo uma tarefa

Neste artigo, vamos verificar a hipótese de que em base de barras passadas é possível prever com certa probabilidade, o tipo do seguinte barra: subindo ou caindo.

Esta tarefa está relacionada com os de classificação. Temos também uma vasta informação histórica sobre os instrumentos financeiros à nossa disposição, o que permite usar esses dados históricos para obter (especialista) saída desejada. Devido a isso, vamos criar uma rede baseada em percepção multi-camada .

Agora, vamos tentar criar uma rede que prevê, com base em preços de fechamento das k barras, o tipo do seguinte barra. Se o seu preço de fechamento for superior ao preço de fechamento da barra anterior, assumimos a saída desejada para ser 1 (o preço subiu). Em outros casos, vamos supor que a saída desejada é 0 (o preço não mudou ou caiu).

Construindo a rede

Em geral, um percepção multi-camada tem uma camada de entrada, uma ou várias camadas ocultas e uma camada de saída. Tendo uma única camada oculta é suficiente para transformar as entradas de tal forma a dividir linearmente a entrada. Usando mais camadas escondidas, muitas vezes provoca diminuição significativa da velocidade de formação de uma rede sem qualquer vantagem notável na qualidade da aprendizagem.

xVamos resolver em uma rede com uma camada de entrada, uma oculta e uma camada de saída. A figura a seguir mostra a arquitetura de nossa rede em termos gerais.1 - xn - inputs (valores de fechamento), wi,j -pesos das arestas vindo de i-node e vai j-node ; y1 - ym neurones de camadas escondidas, o1 - ok saidas de network.


Além disso, há entradas na rede de polarização. Uso desses insumos fornece a capacidade de nossa rede para mudar a função de ativação ao longo do eixo-x, assim, não só a rede mudar a inclinação da função de ativação, mas fornecer seu deslocamento linear.

1. Gráfico da função de ativação at = 1
2. Gráfico da função de ativação at =2 and = 1
3. Gráfico da função de ativação com a mudança at =2, = 1 and = 1

O valor para cada nó da rede será calculado de acordo com a fórmula:
o número de nódulos na camada anterior. , onde f(x) - função de ativação en

Funções de ativação

A activação da função calcula o sinal de saída, depois de passar recebida do acumulador. Neurónio artificial é geralmente representada como uma função não-linear de um único argumento. Na maioria das vezes são utilizadas as seguintes funções de ativação.

Função Fermi (sigmóide exponencial):


Sigmóide Racional:


Tangente Hiperbólica:


A fim de calcular as saídas de cada camada, sigmóide racional foi escolhido porque o seu cálculo leva menos tempo do processador.

Processo de treinamento da rede

Para treinar a nossa rede, vamos implementar o método de propagação de volta. Este método é um algoritmo iterativo que é usado para minimizar o erro de trabalho de um perceptron multi-camada. A ideia fundamental do algoritmo: depois de calcular os resultados da rede, os ajustamentos para cada nó e erro ω para cada aresta são calculadas, pelo que o cálculo de erro vai na direção de saídas de rede para suas entradas. Em seguida, a correção dos pesosω ocorre de acordo com os valores de erros calculados. Este algoritmo impõe a única exigência sobre a função de ativação - deve ser diferenciada. Sigmoids e tangente hiperbólica cumprem este requisito.

Agora, para realizar o processo de formação, temos a seguinte seqüência de passos:

  1. Inicialize os pesos de todas as arestas com valores aleatórios pequenos
  2. Calcule ajustes para todas as saídas da rede
    , onde oj - saída calculada da rede, tj - valor esperado (factual)
  3. Para cada nó, exceto para a última calculamos o ajuste de acordo com a fórmula
    , onde ωj,k pesos nas extremidades provenientes do nó para o qual é calculado o ajuste e ajustamentos calculados para os nodos situados mais perto da camada de saída.
  4. Calcule o ajuste para cada extremidade da rede:
    , onde oi saída calculada do nó a partir do qual a borda vem. O erro é calculado para este ponta e -ajuste calculado para o nó ao qual a borda especificada vem.
  5. Valores peso correto para todas as bordas:
  6. Repita os passos 2-5 para todos os exemplos de treinamento ou até que o critério conjunto de qualidade de aprendizagem é cumprida

Preparação dos dados de entrada

É necessário preparar os dados de entrada para executar processo de formação da rede, os dados de entrada de alta qualidade tem um impacto significativo sobre o trabalho da rede e a velocidade de estabilização seus coeficientes ω, i.e. no próprio processo de formação.

Todos os vectores de entrada são recomendados para ser normalizados, de modo a que os seus componentes se encontram no intervalo [0, 1] ou [-1, 1]. A normalização faz com que todos os vetores de entrada proporcionam no processo de formação da rede, portanto, procedimento de treinamento correto seja alcançado.

Nós vamos normalizar nossos vetores de entrada - transformar os valores de seus componentes para o intervalo [0, 1], para fazer isso, vamos aplicar a fórmula:

Preços de fechamentos das barras serão utilizados como componentes do vector. Aqueles com índices [n + k, n +1] devem ser alimentados como saídas, onde k - dimensão do vetor de entrada. Iremos determinar o valor desejado com base na barra de ordem n. Vamos formar o valor em razão da seguinte lógica: se o preço de fechamento para a barra de n-th é superior ao preço de fechamento do n +1 barra (o preço subiu), vamos definir a saída desejada a 1, em caso do preço caiu ou não mudar, vamos definir o valor como 0;

As barras envolvidas na formação de cada conjunto são destacadas em amarelo na figura, a barra que é usado para determinar o valor desejado é realçada em laranja.

A seqüência de dados fornecidos também afeta o processo de formação. O processo de treinamento acontece estável se todos os vetores de entrada correspondem a 1 e 0 são alimentados de maneira uniforme.

Além disso, vamos formar um conjunto separado de dados que são usados para a avaliação da eficácia de nossa rede. A rede não vai ser treinado sobre esses dados e só serão utilizados para o cálculo do erro com o método dos mínimos quadrados. Nós vamos adicionar 10% dos exemplos iniciais de um conjunto de dados de teste. Como resultado, usaremos 90% dos exemplos para a formação e 10% para o ensaio.

Função, calculando o erro com o método dos mínimos quadrados, fica assim:
,
onde -sinal de saída da rede e - valor desejado do sinal de saída.

Agora vamos examinar o código de script, preparando-se vetores de entrada para a nossa rede neural.

Vamos considerar classe DataSet - conjunto de dados. A classe inclui:.

  • Matriz de vetores de valores de entrada - entrada
  • Valor de saída Formado - Saída
  • 'Método Normalização '- Normalização dos dados
  • Método 'OutputDefine' - determinação do valor real sobre a relação de preços
  • Método 'AddData "- valores de gravação na matriz vetor de entrada e variável valor real
  • Método 'Arquivização' - a coleta de dados na matriz comum para a gravação posterior no arquivo

Alimentando número diferente de conjuntos de treinamento para a entrada, podemos observar como o processo de formação da nossa rede está avançando.


A linha vermelha no gráfico mostra os conjuntos de treinamento correspondentes a 1. A linha azul - corresponde a 0. O número de exemplos de treinamento é demitido ao longo do eixo x, eo valor calculado de rede - ao longo do eixo-y. É óbvio que, quando há alguns barras (25 ou menos) a rede não reconhece diferentes vectores de entrada, quando há mais de um entre eles - a divisão em duas classes é aparente.

Avaliação do funcionamento da rede

Para avaliar a eficácia do treinamento, vamos usar a função de calcular o erro com o método dos mínimos quadrados. Para isso, vamos criar o utilitário com o seguinte código e executá-lo. Vamos precisar de dois arquivos para o seu trabalho: "test.txt" - dados e valores desejados (outputs) que são utilizados na correção de erros e "NT.txt" - o arquivo com os coeficientes calculados (pesos) para o trabalho da rede .

Este script executa a seguinte seqüência de ações:

  • cria objeto NT da classe 'net'
  • lê coeficientes (pesos) ω e possivel abri-los em NT
  • cria matrizes de entradas e saídas da rede
  • lê entradas em um loop e coloca-los em 'x' array, lê saídas e coloca-los em ordem de 'reais'
  • calcula a saída da rede, alimentando matriz 'x', como uma entrada
  • avalia errorcomo a soma dos quadrados das diferenças entre todos os valores calculados e os valores esperados (de facto)
  • quando o fim do arquivo é alcançado, exibimos o erro e terminar o trabalho do roteiro

O diagrama acima mostra a previsão da rede da barra subseqüente. Valores 0,5-1 sugerem a maior possibilidade de que barra posterior subirá de queda. Valores 0-0,5 implicam maior possibilidade de cair em vez de subir. Valor 0,5 sugere o estado de ambivalência: o próximo barra pode ir para cima ou para baixo.

Resumo

As redes neurais são ferramentas poderosas para análise de dados. Este artigo abordou o processo de criação de uma rede neural, por meio de programação orientada a objetos no NTL + linguagem. O uso de programação orientada a objetos permitiu simplificar o código e tornou muito mais reutilizável nos scripts futuros. Na implementação apresentado que precisávamos para criar a camada de classe a definição de uma camada da rede neural ea classe net definição da rede em geral. Usamos a classe 'net' para o indicador, o cálculo de erros e cálculo dos pesos internos da rede. Além disso, foi apresentado como usar a rede treinada pelo exemplo do indicador de histograma que, desde a previsão da rede da mudança de preço.