Creación de una red neuronal en NTL +


Introducción

Redes neuronales artificiales – modelos matemáticos o sus implementaciones software o hardware mathematical models and their software or hardware que están construidas en el principio de la organización y funcionamiento de las redes neuronales biológicas - redes de células neuronales (neuronas) del cerebro.

Actualmente, las redes neuronales se usan ampliamente en muchas tareas de reconocimiento, clasificación, memoria asociativa, patrones de determinación, previsiones etc.

Con el fin de trabajar con redes neuronales, existen productos matemáticos independientes y módulos adicionales para mayores paquetes matemáticos de software, que proporcionan amplias oportunidades de construcción de redes de diferentes tipos y configuraciones.

Nosotros, por otra parte, intentaremos crear nuestra propia red neuronal desde el cero por los medios del lenguaje NTL+ y probar al mismo tiempo sus capacidades de programación orientadas a objetos.

Elección de una tarea

En este artículo verifiquemos la hipótesis de que por motivos de barras anteriores es posible predecir con cierta probabilidad el tipo de la siguiente barra: ascendente o descendente.

Esta tarea esta relacionada con las de clasificación. Tenemos también información histórica extensiva sobre los instrumentos financieros en nuestra diposición, que permite usar los datos históricos para obtener el resultado deseado (experto).

Ahora, vamos a crear una red que en la base de los precios de cierre de las barras k predice el tipo de la barra siguiente. Si el precio de cierre es más alto que el precio del cierre de la barra anterior, supongamos que el resultado deseado es de 1 (el precio creció). En otros casos, supongamos que el resultado deseado es de 0 (el precio no creció o cayó).

Construcción de la red

En general, un perceptrón multicapa tiene una capa de entrada, una o varias capas ocultas y una capa de salida. Tener una sola capa oculta es suficiente para la transformación de las entradas, de tal manera para dividir linealmente la representación de entrada. El uso de más capas ocultas a menudo causa disminución significativa en la velocidad de la formación de una red sin ninguna ventaja notable en la calidad del aprendizaje.

Vamos a instalarse en una red con una capa de entrada, una oculta y una capa de salida. La siguiente figura muestra la arquitectura de nuestra red en términos generales. x1 - xn - entradas (precios de cierre), wi,j - pesos de los bordes que viene de nodo i y va al nodo j; y1 - ym neuronas de la capa oculta, o1 - ok salidas de la red.


Además hay entradas de sesgos (bias inputs) en la red. El uso de estas entradas proporciona la capacidad de nuetsra red para cambiar la función de activación a lo largo del eje x, por lo tanto, la red no solo puede cambiar la inclinación del función de activación, sino también proporcionar su desplazamiento lineal.

1. Gráfico de la función de activación at = 1
2. Gráfico de la función de activación en =2 y = 1
3. Gráfico de la función de activación con el desplazamiento en =2, = 1 y = 1

El valor de cada nodo se calculará según la fórmula:
, where f(x) - funcción de activación, y n número de nodos en la capa anterior.

Funciones de Activación

La funciones de activación calculan la señal de salida, recibida dspués de pasar el acumulador. La neurona artificial en general está representada como un función no lineal del único argumento. Más se usan las siguientes funciones de activación.

Función de Fermi (sigmoide exponencial):


Sigmoide racional:


Tangente hiperbólica:


Con el fin de calcular las salidas de cada capa, fue elegido el sigmoide racional debido a que su cálculo toma menos tiempo de procesador.

Proceso de capacitación de la red

Para capacitar a nuestra red, vamos a poner en práctica el método de propagación hacia atrás. Este método es un algoritmo iterative que se usa para minimizar el error de la obra de un perceptrón multicapa. La idea fundamental del algoritmo: después de calcular las salidas de la red, se calculan los ajustes para cada nodo y errores ω para cada borde, mientras tanto el error de la calculación va en una dirección de las salidas de la red hacia sus entradas. Después de hace la corrección de los pesos ωen conformidad con los valores de los errores calculados. Este algoritmo impone el único requisito de que la función de activación - debe ser diferenciada. El sigmoide y la tangente hiperbólica cumplen con este requisito.

Ahora, para llevar a cabo el proceso de capacitación, necesitamos la siguiente secuencia de pasos:

  1. Inicializar los pesos de todos los bordes con pequeños valores aleatorios
  2. Calcular ajustes para todas las salidas de la red
    , donde oj es la salida calculada de la red, tj es el valor fáctual
  3. Para cada nodo, excepto para la última calcular un ajuste de acuerdo con la fórmula
    , donde ωj,k son los pesos en los bordes, que salen del nodo, para que se calcula un ajuste y es el ajuste calculado para los nodos, siuados cerca de la capa de salida.
  4. Calcular ajustes para cada borde de la red:
    , donde oies la salida del nodo, de donde viene el borde. El error se calcula para el borde y es el ajuste calculado para el nodo hacia cual va el borde especificado.
  5. Valores de pesos correctos para todos los bordes:
  6. Repita los pasos 2 - 5 para todos los ejemplos de entrenamiento o hasta que se cumpla el criterio establecido de la calidad del aprendizaje.

Preparación de los datos de entrada

Es necesario preparar los datos de entrada para realizar el proceso de entretenamiento de la red, los datos de entrada de alta calidad tienen un impacto significativo en el trabajo de la red y en la velocidad de la estabilización de sus coeficientes ω, es decir, en el proceso mismo de capacitación.

Se recomienda normalizar todos los vectores de entrada, de modo que sus componentes se encuentren en el rango [0;1] o [-1;1]. La normalización hace que todos los vectores de entrada estén en consonancia en el proceso de formación de la red, y por lo tanto se logra un proceso correcto de entrenamiento.

Vamos a normalizar nuestras vectores de entrada - transformar los valores de sus componentes a la gama [0;1], para ello vamos a aplicar la fórmula:

Los precios de cierre de barras se utilizan como componentes del vector. Los con los índices [n+k;n+1] se utilizarán como salidas, donde k será la dimensión del vector de entrada. Vamos a determinar el valor deseado basado en la barra n. Vamos a formar el valor de los terrenos de la siguiente lógica: si el precio de cierre de la barra n es más alto que el precio de cierre de la barra n+1 bar (the price rose), pondremos el valor deseado de salida a 1, en el caso si el precio cae o no cambia, pondremos el valor a 0;

Las barras que participan en la formación de cada conjunto se resaltan en amarillo en la figura, la barra que se utiliza para determinar el valor deseado se pondrá en naranja.

La secuencia de los datos facilitados también afecta al proceso de formación. El proceso de aprendizaje se lleva más estable si los vectores de entradas correspondiente a 1 y 0 se apliquen de manera uniforme.

También se formará un grupo separado de los datos utilizados para evaluar el rendimiento de nuestra red. En estos datos la red no será entrenada y sólo se utilizarán para el cálculo del error por el método de los mínimos cuadrados. En el grupo de prueba de datos se añaden 10% de la muestra original. Como resultado, el 90% de los ejemplos se utiliza para la formación y el 10% para la evaluación.

La función, que calcula el error con el método de mínimos cuadrados, se ve así:
,
donde - señal de salida de la red y - valor deseado de la señal de salida.

Ahora examinemos el código script, preparando los vectores de entrada para nuestra red neuronal.

Examinemos la clase DataSet class – conjunto de datos. La clase incluye:

  • Matriz de vectores de valores de entrada - input
  • Valor de salida formado - output
  • Método 'Normalize' - normalización de datos
  • Métod 'OutputDefine' -determinación del valor actual en relación con lo precios
  • Método 'AddData' - registro de valores de la matriz de vectores de entrada y variables de valor real
  • Método 'To_file' recogida de datos de la matriz común para la posterior grabación en el archivo

Alimentando diferentes números de conjuntos de formación a la entrada, se puede observar cómo el proceso de formación de nuestra red está avanzando.


La línea roja en el gráfico muestra los conjuntos de formación correspondientes a 1. La línea azul muestra los correspondientes a 0. El número de ejemplos de entrenamiento queda cesante a lo largo del eje X y el valor calculado de la red - a lo largo del eje y. Es obvio que cuando hay pocas barras (25 o menos), la red no reconoce los diferentes vectores de entrada, cuando hay más - la división en 2 clases es evidente.

Evaluación del funcionamiento de la red

Con el fin de evaluar la eficacia de la formación, vamos a utilizar la función de calcular el error con el método de los mínimos cuadrados. Para ello, vamos a crear la utilidad con el siguiente código y ejecutarlo. Vamos a necesitar dos archivos para su: "test.txt" – datos y valores deseados (salidas) que se usan en la corrección de errores y "NT.txt" – el archivo con los coeficientes calculados (pesos) para el trabajo de la red.

El script realiza la siguiente secuencia de acciones:

  • crea el objeto NT de la clase 'net'
  • lee los coeficientes(pesos) ω y los carga en NT
  • crea matrices de entradas y salidas de la red
  • lee las entradas en un bucle y localiza en la matriz ¡ 'x', lee las salidas y localiza en la matriz 'reals'
  • calcula las salidas de la red,alimentando la matriz 'x' como una entrada
  • computa error como la suma de los cuadrados de las diferencias entre todos los valores calculados y los valores esperados (fácticos)
  • cuando se alcanza el final del archivo, se muestra el error y terminar el trabajo del script

El diagrama anterior muestra el pronóstico de la red de la barra posterior. Los valores de 0,5 a 1 sugieren una posibilidad más alta que la barra posterior se subirá. Los valores de 0 a 0,5 implican mayor posibilidad de caer en lugar de aumentar. El valor 0.5 sugiere un estado de ambivalencia: la barra próxima puede ir hacia arriba o hacia abajo.

Resumen

Las redes neuronales son herramientas poderosas para el análisis de datos. Este artículo cubre el proceso de creación de una red neuronal por medio de la programación orientada a objetos en el lenguaje NTL+. El uso de la programación orientada a objetos permite simplificar el código y hacerlo mucho más reutilizable en las futuras secuencias de comandos. En la implementación presentada teníamos que crear la clase layer, definiendo una capa de la red neuronal y la clase net , definiendo la red en general. Usamos la clase 'net' para el indicador, computando el error y calculando los pesos internos de la red. En adición, se presenta cómo utilizar la red entrenada por el ejemplo del indicador de histograma, que proporciona el pronóstico de la red de la variación del precio.