Discusión sobre el artículo "Redes neuronales: así de sencillo (Parte 7): Métodos de optimización adaptativos"

 

Artículo publicado Redes neuronales: así de sencillo (Parte 7): Métodos de optimización adaptativos:

En artículos anteriores, hemos usado el descenso de gradiente estocástico para entrenar una red neuronal utilizando una única tasa de aprendizaje para todas las neuronas de la red. En este artículo, proponemos al lector buscar métodos de aprendizaje adaptativo que nos permitan modificar la tasa de aprendizaje de cada neurona. Vamos a echar un vistazo a las ventajas y desventajas de este enfoque.

Las pruebas de optimización usando el método Adam se realizaron en las mismas condiciones que todas las pruebas anteriores: instrumento EURUSD, marco temporal H1 y los datos de 20 velas consecutivas; la formación se llevó a cabo utilizando la historia de los últimos 2 años. Para la prueba, creamos Fractal_OCL_Adam. Este asesor se creó a partir del asesor experto Fractal_OCL especificando el método de optimización Adam al describir la red neuronal en la función OnInit del programa principal.

      desc.count=(int)HistoryBars*12;
      desc.type=defNeuron;
      desc.optimization=ADAM;

El número de capas y neuronas se mantuvo sin cambios.

Inicializamos el asesor con pesos aleatorios que iban de -1 a 1, excluyendo los valores cero. Durante las pruebas, literalmente después de la segunda época de entrenamiento, el error de la red neuronal se estabilizó alrededor del 30%. Recordemos que al realizar el entrenamiento usando el método de descenso de gradiente estocástico, el error se estabilizó alrededor del 42% después de la 5ª época de entrenamiento.


El gráfico de fractales omitidos muestra un aumento paulatino en el indicador a lo largo del entrenamiento. Al mismo tiempo, tras 12 épocas de entrenamiento, observamos una disminución gradual en la tasa de crecimiento del indicador. Después de la 14ª época de formación, el valor de este indicador era del 72,5%. Como comparación, al entrenar una red neuronal similar con el método de descenso de gradiente estocástico, después de 10 épocas de entrenamiento, la proporción de fractales omitidos era del 97-100% con diferentes tasas de aprendizaje.



Autor: Dmitriy Gizlyk

[Eliminado]  

+

¿Es un ejemplo para MLP? ¿El aprendizaje se hizo más rápido con Adam? Recuerdo epochs tomó un tiempo muy largo para aprender la última vez alrededor de

Gradiente estocástico toma mucho tiempo para trabajar, seguro

 

Gracias por el artículo.

¿Hay planes para organizar otros métodos de cálculo de la función de pérdida de aprendizaje?

 

Dmitriy Gizlyk - ¿tiene usted práctica además de la mera teoría o es un eterno "profesor"?

práctica - ¿es cuando con la ayuda de sus métodos se consigue operar con éxito?

Dmitriy Gizlyk
Dmitriy Gizlyk
  • www.mql5.com
Опубликовал статью Нейросети — это просто (Часть 7): Адаптивные методы оптимизации В предыдущих статьях для обучения нейронной сети использовался метод стохастического градиентного спуска с применением единого коэффициента обучения для всех нейронов в сети. В данной статье предлагаю посмотреть в сторону адаптивных методов обучения, которые...
 
Boris Egorov:

Dmitriy Gizlyk: ¿tiene usted práctica además de la mera teoría o es un eterno "profesor"?

practica - es cuando con la ayuda de sus metodos se consigue operar con exito?

¿Quiere que el artículo contenga una máquina de imprimir dinero?

El hombre habla de la arquitectura de la red y las variaciones de su organización, lo que es interesante, y lo que para alimentar la red depende del usuario.

 

Pregunta. ¿Para qué sirve crear una enumeración

enum ENUM_BUFFERS
  {
   WEIGHTS,
   DELTA_WEIGHTS,
   OUTPUT,
   GRADIENT,
   FIRST_MOMENTUM,
   SECOND_MOMENTUM
  };

y variables en la clase CLayer?

class CLayer: public CArrayObj
  {
private:
...
   int               hWeights;
   int               hDeltaWeights;
   int               hOutput;
   int               hGradient;
...   
  };

No encuentro su uso en el código.

 
Aleksei Lesnikov:

Pregunta. ¿Para qué fines se crean las transferencias

y variables en la clase CLayer?

No encuentro su uso en el código.

Gracias por señalarlo. Puedes borrarlas, son restos de borradores.

 

Hola a todos . ¿ quien se ha encontrado con este error al intentar leer un fichero ?

OnInit - 198 -> Error de lectura AUDNZD.......

 
Borys Ivanov #:

Hola a todos . ¿quién se ha encontrado con este error al intentar leer un archivo ?

OnInit - 198 -> Error de lectura AUDNZD.......

Este mensaje sólo le informa de que la red pre-entrenada no se ha cargado. Si está ejecutando su EA por primera vez, es normal y no preste atención al mensaje. Si ya has entrenado la red neuronal y quieres seguir entrenándola, entonces debes comprobar dónde se ha producido el error de lectura de datos del fichero.

Desafortunadamente, no especificó el código de error para que podamos decir más.
 
Dmitriy Gizlyk #:

Este mensaje sólo le informa de que no se ha cargado la red preentrenada. Si está ejecutando su EA por primera vez, es normal y no preste atención al mensaje. Si ya has entrenado la red neuronal y quieres seguir entrenándola, entonces debes comprobar dónde se ha producido el error de lectura de datos del fichero.

Lamentablemente, no has especificado el código de error para que podamos decirte más.


Hola.

Te diré más al respecto.

Al iniciar el Asesor Experto por primera vez. Con estas modificaciones en el código:

 dError=Net.getRecentAverageError();
         if(add_loop)
           {
            Net.Save(FileName+".nnw",dError,dUndefine,dForecast,dtStudied,false);
            printf("Era %d -> error %.2 f %% forecast %.2 f",count,dError,dForecast);
           }
         ChartScreenShot(0,FileName+IntegerToString(count)+".png",750,400);
         int h=FileOpen(CSV,FILE_READ|FILE_WRITE|FILE_CSV);
         if(h!=INVALID_HANDLE)
           {
            FileSeek(h,0,SEEK_END);
            FileWrite(h,eta,count,dError,dUndefine,dForecast);
            FileFlush(h);
            FileClose(h);
            Print("Файл должен быть создан ChartScreenShot ");
           }
          else Print("Операция FileOpen ChartScreenShot неудачна, ошибка ",GetLastError()); 
        }
     }

en el log escribe esto :

KO 0 18:49:15.205 Core 1 NZDUSD: carga 27 bytes de datos históricos para sincronizar a 0:00:00.001

FI 0 18:49:15.205 Core 1 NZDUSD: historial sincronizado de 2016.01.04 a 2022.06.28

FF 0 18:49:15.205 Core 1 2019.01.01 00:00:00 OnInit - 202 -> Error de lectura AUDNZD_PERIOD_D1_ 20Fractal_OCL_Adam 1.nnw prev Net 0

CH 0 18:49:15.205 Core 1 2019.01.01 00:00:00 OpenCL: Dispositivo GPU 'gfx902' seleccionado

KN 0 18:49:15.205 Core 1 2019.01.01 00:00:00 Era 1 -> error 0.01 % previsión 0.01

QK 0 18:49:15.205 Core 1 2019.01.01 00:00:00 Fichero a crear ChartScreenShot

HH 0 18:49:15.205 Core 1 2019.01.01 00:00:00 Era 2 -> error 0.01 % previsión 0.01

CP 0 18:49:15.205 Core 1 2019.01.01 00:00:00 Archivo a crear ChartScreenShot

PS 2 18:49:19.829 Core 1 desconectado

OL 0 18:49:19.829 Núcleo 1 conexión cerrada

NF 3 18:49:19.829 Probador detenido por usuario


И в директории "C:\Users\Borys\AppData\Roaming\MetaQuotes\Tester\BA9DEC643240F2BF3709AAEF5784CBBC\Agent-127.0.0.1-3000\MQL5\Files"

Se crea este archivo :

Fractal_10000000.csv

#define  FileName        Symb.Name()+"_"+EnumToString((ENUM_TIMEFRAMES)Period())+"_"+IntegerToString(HistoryBars,3)+StringSubstr(__FILE__,0,StringFind(__FILE__,".",0))
#define  CSV             "Fractal_"+StringSubstr(DoubleToString(eta),2)+".csv"

con el siguiente contenido :

0.1 1 0.006391065067727753 0.30606698779533065 0.009849141883310947
0.1 2 0.01416031275898674 0.320172057079727 0.009671500063084178
0.1 1 0.021322935369592233 0.4824709164481285 0.009510368103745911
0.1 2 0.03047882579179044 0.4736268224037817 0.009336035129387396
0.1 1 0.04096262961921367 0.4747386346906194 0.009164897823757697
0.1 2 0.04745129346676422 0.9935630387598718 0.1983981648307233

y así sucesivamente...

Al reiniciar, aparece el mismo error y se sobrescribe el archivo .csv .

Es decir, el Expert está siempre en formación porque no encuentra el archivo.

Y la segunda pregunta, por favor sugiero el código (para leer datos de la neurona de salida) para abrir órdenes de compra venta cuando la red está entrenada.


Gracias por el artículo y por la respuesta.

 
Borys Ivanov #:


Hola.

Te contaré más.

al lanzar el Asesor Experto por primera vez. Con estas modificaciones en el código:

en el log escribe esto :

KO 0 18:49:15.205 Core 1 NZDUSD: cargar 27 bytes de datos históricos para sincronizar a 0:00:00.001

FI 0 18:49:15.205 Core 1 NZDUSD: historial sincronizado de 2016.01.04 a 2022.06.28

FF 0 18:49:15.205 Core 1 2019.01.01 00:00:00 OnInit - 202 -> Error de lectura AUDNZD_PERIOD_D1_ 20Fractal_OCL_Adam 1.nnw prev Net 0

CH 0 18:49:15.205 Core 1 2019.01.01 00:00:00 OpenCL: GPU device 'gfx902' selected

KN 0 18:49:15.205 Core 1 2019.01.01 00:00:00 Era 1 -> error 0.01 % previsión 0.01

QK 0 18:49:15.205 Core 1 2019.01.01 00:00:00 Archivo a crear ChartScreenShot

HH 0 18:49:15.205 Core 1 2019.01.01 00:00:00 Era 2 -> error 0.01 % previsión 0.01

CP 0 18:49:15.205 Core 1 2019.01.01 00:00:00 Archivo debe ser creado ChartScreenShot

PS 2 18:49:19.829 Core 1 desconectado

OL 0 18:49:19.829 Core 1 conexión cerrada

NF 3 18:49:19.829 Probador detenido por el usuario


И в директории "C:\Users\Borys\AppData\Roaming\MetaQuotes\Tester\BA9DEC643240F2BF3709AAEF5784CBBC\Agent-127.0.0.1-3000\MQL5\Files"

Este archivo se crea :

Fractal_10000000.csv

con estos contenidos :

0.1 1 0.006391065067727753 0.30606698779533065 0.009849141883310947
0.1 2 0.01416031275898674 0.320172057079727 0.009671500063084178
0.1 1 0.021322935369592233 0.4824709164481285 0.009510368103745911
0.1 2 0.03047882579179044 0.4736268224037817 0.009336035129387396
0.1 1 0.04096262961921367 0.4747386346906194 0.009164897823757697
0.1 2 0.04745129346676422 0.9935630387598718 0.1983981648307233

Etc...

Al ejecutarlo de nuevo, aparece el mismo error y se sobrescribe el archivo .csv .

Es decir, el Asesor Experto está siempre en aprendizaje porque no encuentra el fichero.

Y la segunda pregunta. por favor sugiera el código (para leer los datos de la neurona de salida) para abrir órdenes de compra venta cuando la red está entrenada.


Gracias por el artículo y por la respuesta.

Buenas noches, Boris.
Usted está tratando de entrenar una red neuronal en el probador de estrategia. No te recomiendo que hagas eso. Desde luego, no sé qué cambios has hecho en la lógica de entrenamiento. En el artículo, el entrenamiento del modelo se organizó en un bucle. Y las iteraciones del ciclo se repetían hasta que el modelo estaba completamente entrenado o el EA se detenía. Y los datos históricos se cargaban inmediatamente en matrices dinámicas en su totalidad. Utilicé este enfoque para ejecutar el Asesor Experto en tiempo real. El período de entrenamiento se estableció mediante un parámetro externo.

Al lanzar el Asesor Experto en el probador de estrategias, el período de aprendizaje especificado en los parámetros se desplaza a la profundidad de la historia desde el comienzo del período de prueba. Además, cada agente en el probador de estrategias MT5 trabaja en su propio "sandbox" y guarda archivos en él. Por lo tanto, cuando vuelva a ejecutar el Asesor Experto en el probador de estrategias, no encontrará el archivo del modelo previamente entrenado.

Intente ejecutar el Asesor Experto en modo de tiempo real y compruebe la creación de un archivo con la extensión nnw después de que el EA deje de funcionar. Este es el archivo donde está escrito su modelo entrenado.

En cuanto a la utilización del modelo en el comercio real, es necesario pasar la situación actual del mercado en los parámetros del método Net.FeedForward. Y luego obtener los resultados del modelo utilizando el método Net.GetResult. Como resultado de este último método, el buffer contendrá los resultados del trabajo del modelo.