Discusión sobre el artículo "Aprendizaje automático y Data Science (Parte 21): Desbloqueando las redes neuronales: desmitificando los algoritmos de optimización"

 

Artículo publicado Aprendizaje automático y Data Science (Parte 21): Desbloqueando las redes neuronales: desmitificando los algoritmos de optimización:

Sumérjase en el corazón de las redes neuronales mientras desmitificamos los algoritmos de optimización utilizados dentro de la red neuronal. En este artículo, descubra las técnicas clave que liberan todo el potencial de las redes neuronales, impulsando sus modelos a nuevas cotas de precisión y eficacia.

Parece que hoy en día todo el mundo está interesado en la Inteligencia Artificial, está en todas partes, y los grandes de la industria tecnológica como Google y Microsoft detrás de OpenAI están impulsando la adaptación de la IA en diferentes aspectos e industrias como el entretenimiento, la industria de la salud, las artes, la creatividad, etc. 

Veo esta tendencia también en la comunidad MQL5, ¿por qué no?, con la introducción de matrices y vectores y ONNX en MetaTrader 5. Ahora es posible realizar modelos de negociación con inteligencia artificial de cualquier complejidad. Ni siquiera hace falta ser un experto en álgebra lineal o lo bastante empollón para entender todo lo que entra en el sistema.

A pesar de todo ello, los fundamentos del aprendizaje automático son ahora más difíciles de encontrar que nunca, y sin embargo son tan importantes conociendo para solidificar su comprensión de la IA. Te permiten saber por qué haces lo que haces, lo que te hace flexible y te permite ejercer tus opciones. Hay muchas cosas que aún tenemos que debatir sobre el aprendizaje automático. Hoy veremos cuáles son los algoritmos de optimización, cómo se comportan entre sí, cuándo y qué algoritmo de optimización debe elegir para un mejor rendimiento y precisión de sus redes neuronales.

neural network optimizers

Autor: Omega J Msigwa

 

El script del artículo da un error:

2024.11.21 15:09:16.213 Optimisation Algorithms testScript(EURUSD,M1) Zero divide, check divider for zero to avoid this error in 'D:\Market\MT5\MQL5\Scripts\Optimization Algorithms testScript.ex5'

 
Andrey Dik (EURUSD,M1) Zero divide, check divider for zero to avoid this error in 'D:\Market\MT5\MQL5\Scripts\Optimization Algorithms testScript.ex5'

El problema resultó ser que el script no encontró el archivo con los datos de entrenamiento. Pero, en cualquier caso, el programa debe manejar este caso si no se encuentra el archivo de datos.

Pero ahora existe tal problema:

2024.11.21 17:27:37.038 Algoritmos de optimización testScript (EURUSD,M1) 50 objetos dinámicos no eliminados encontrados:
2024.11.21 17:27:37.038 Algoritmos de optimización testScript (EURUSD,M1) 10 objetos de clase 'CTensors'
2024.11.21 17:21 17:27:37.038 Algoritmos de optimización testScript (EURUSD,M1) 40 objetos de clase 'CMatrix'
2024.11.21 17:27:37.038 Optimización Algoritmos testScript (EURUSD,M1) 14816 bytes de memoria filtrada encontrados

Parece que no se han borrado los objetos de las clases.
 
Andrey Dik #:

El problema resultó ser que el script no encontró el archivo de datos para el entrenamiento. Pero, en cualquier caso, el programa debe manejar tal caso, si no se encuentra el archivo de datos.

Pero ahora existe tal problema:

2024.11.21 17:27:37.038 Algoritmos de optimización testScript (EURUSD,M1) 50 objetos dinámicos no eliminados encontrados:
2024.11.21 17:27:37.038 Algoritmos de optimización testScript (EURUSD,M1) 10 objetos de clase 'CTensors'
2024.11.21 17:21 17:27:37.038 Algoritmos de optimización testScript (EURUSD,M1) 40 objetos de clase 'CMatrix'
2024.11.21 17:27:37.038 Optimización Algoritmos testScript (EURUSD,M1) 14816 bytes de memoria filtrada encontrados

Parece que los objetos de clase no se han borrado.

Esto se debe a que sólo se debe llamar a una función "fit" para una instancia de una clase. He llamado a múltiples funciones de ajuste, lo que resulta en la creación de múltiples tensores en la memoria.Esto fue con fines educativos.

/*
 Llamar a múltiples funciones de ajuste de una clase de red neuronal en un programa es una mala idea, demasiados objetos
 se quedarán sin borrar de la memoria, la mejor idea sería borrar cada instancia de una clase y llamarla de nuevo después de cada 
 función de ajuste.
*/

  nn.fit(x_train, y_train, new OptimizerMinBGD(nn_learning_rate), nn_epochs, nn_batch_size, show_batch);
  nn.fit(x_train, y_train, new OptimizerRMSprop(nn_learning_rate, 0.1), nn_epochs, nn_batch_size, show_batch);
  nn.fit(x_train, y_train, new OptimizerAdaGrad(nn_learning_rate), nn_epochs, nn_batch_size, show_batch);
  nn.fit(x_train, y_train, new OptimizerAdam(nn_learning_rate), nn_epochs, nn_batch_size, show_batch);
  nn.fit(x_train, y_train, new OptimizerAdaDelta(nn_learning_rate), nn_epochs, nn_batch_size, show_batch);
  nn.fit(x_train, y_train, new OptimizerNadam(nn_learning_rate), nn_epochs, nn_batch_size, show_batch);
   
  delete nn; 

Debería ser así;

//---

  nn = new CRegressorNets(hidden_layers, AF_RELU_, LOSS_MSE_); 
  
  x_train = scaler.fit_transform(x_train);

  nn.fit(x_train, y_train, new OptimizerMinBGD(nn_learning_rate), nn_epochs, nn_batch_size, show_batch);
   
  delete nn; 
  
//---

  nn = new CRegressorNets(hidden_layers, AF_RELU_, LOSS_MSE_); 
  
  x_train = scaler.fit_transform(x_train);

  nn.fit(x_train, y_train, new OptimizerAdam(nn_learning_rate), nn_epochs, nn_batch_size, show_batch);
   
  delete nn;