Discusión sobre el artículo "Redes neuronales: así de sencillo (Parte 50): Soft Actor-Critic (optimización de modelos)"

 

Artículo publicado Redes neuronales: así de sencillo (Parte 50): Soft Actor-Critic (optimización de modelos):

En el artículo anterior, implementamos el algoritmo Soft Actor-Critic (SAC), pero no pudimos entrenar un modelo rentable. En esta ocasión, optimizaremos el modelo creado previamente para obtener los resultados deseados en su rendimiento.

Continuamos nuestro estudio del algoritmo SAC. En el artículo anterior implementamos dicho algoritmo, pero lamentablemente no pudimos entrenar un modelo rentable. Hoy hablaremos de las opciones disponibles para resolver este problema. Ya planteamos una cuestión similar en el artículo "Procrastinación del modelo, causas y métodos de solución". En esta ocasión, les propongo ampliar nuestros conocimientos en dicho ámbito y analizar nuevos enfoques usando nuestro modelo SAC como ejemplo.


Antes de pasar directamente a la optimización del modelo que hemos construido, permítanme recordarles que el SAC es un algoritmo de aprendizaje por refuerzo para modelos estocásticos en un espacio continuo de acciones. La principal característica de este método es la introducción de un componente de entropía en la función de recompensa.

El uso de la política estocástica del Actor dota al modelo de mayor flexibilidad y lo hace capaz de resolver problemas en entornos complejos en los que algunas acciones pueden ser inciertas o resulta imposible definir reglas claras. Esta política suele ser más sólida al trabajar con datos que contienen mucho ruido, porque considera el componente probabilístico en lugar de verse atado a reglas claras.

Autor: Dmitriy Gizlyk

 
//--- Actor
actor.Clear();
//--- Capa de entrada
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
int prev_count = descr.count = (HistoryBars * BarDescr);
descr.window = 0;
descr.activation = None;
descr.optimización = ADAM;
if(!actor.Add(descr))
{
borra descr;
return false;
}
// Capa 1 | Capa de Atención Multicapa - 1
if (!(descr = new CLayerDescription()))
return false
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 2048;
descr.activación = LReLU;
optimización descr.= ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 1: Capa de Atención Multicapa - 1: Datos pasados con éxito.\n");
//--- capa 2 | Capa de Normalización por Lotes
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBatchNormOCL;
descr.count = prev_count;
descr.batch = 1000;
descr.activation = None
descr.optimización = ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 2: Capa de Normalización por Lotes: Datos pasados con éxito.\n");
// Capa 3 | Capa de Atención Multicapa - 2
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 2048;
descr.activación = LReLU;
optimización descr.= ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 3: Capa de Atención Multicapa - 2: Datos pasados con éxito.\n");
//--- capa 2
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count - 1;
descr.window = 2;
descr.step = 1;
descr.window_out = 8;
descr.activación = LReLU;
descr.optimización = ADAM;
if(!actor.Add(descr))
{
borra descr;
return false;
}
//--- capa 3
if(!(descr = new CLayerDescription())))
return false
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count;
descr.window = 8;
descr.paso = 8
descr.window_out = 8;
descr.activación = LReLU;
descr.optimización = ADAM;
if(!actor.Add(descr))
{
borra descr;
return false;
}
//--- capa 7 | Capa Convolucional - 4
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = 8;
descr.paso = 1;
descr.window_out = 9;
descr.activación = LReLU;
descr.optimización = ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 7: Capa Convolucional - 4: Datos pasados con éxito.\n");
//--- capa 8 | Capa Convolucional - 5
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = 9;
descr.step = 1;
descr.window_out = 7;
descr.activación = LReLU;
descr.optimización = ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 8: Capa Convolucional - 5: Datos pasados con éxito.\n");
//--- capa 9 | Capa Convolucional - 6
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = 7;
descr.step = 1;
descr.window_out = 5;
descr.activación = LReLU;
descr.optimización = ADAM;
if (!actor.Add(descr))
{
elimina descr;
return false;
}
PrintFormat("[Actor] Capa 9: Capa Convolucional - 6: Datos pasados con éxito.\n");
//--- capa 10 | Capa Convolucional - 7
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count;
descr.window = 5;
descr.step = 1;
descr.window_out = 4;
descr.activación = LReLU;
descr.optimización = ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 10: Capa Convolucional - 7: Datos pasados con éxito.\n");
// Capa 11 | Capa de Atención Multicapa - 3
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 2048;
descr.activación = LReLU;
optimización descr.= ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 11: Capa de Atención Multicapa - 3: Datos pasados con éxito.\n");
// Capa 12 | Capa de Atención Multicapa - 4
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 2048;
descr.activación = LReLU;
optimización descr.= ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 12: Capa de Atención Multicapa - 4: Datos pasados con éxito.\n");
// Capa 13 | Capa de Atención Multicapa - 5
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 2048;
descr.activación = LReLU;
optimización descr.= ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 13: Capa de Atención Multicapa - 5: Datos pasados con éxito.\n");
//--- capa 4
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 2048;
descr.optimización = ADAM;
descr.activation = LReLU;
if(!actor.Add(descr))
{
borrar descr;
return false;
}
//--- capa 5
if(!(descr = new CLayerDescription())))
return false
descr.type = defNeuronBaseOCL;
prev_count = descr.count = 1024;
descr.activación = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
borrar descr;
return false;
}
// Capa 13 | Capa de Atención Multicapa - 5
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.activación = LReLU;
descr.optimización = ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 13: Capa de Atención Multicapa - 5: Datos pasados con éxito.\n");
//--- capa 6
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConcatenate;
descr.count = LatentCount;
descr.ventana = recuento_previo;
descr.paso = AccountDescr;
descr.optimización = ADAM;
descr.activación = SIGMOID;
if(!actor.Add(descr))
{
elimina descr;
return false;
}
//--- capa 16 | Capa Softmax
if (!(descr = new CLayerDescription()))
return false
descr.type = defNeuronSoftMaxOCL;
descr.count = 1024;
descr.optimización = ADAM;
descr.activation = SIGMOID;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa Softmax: Datos pasados con éxito.\n");
//--- capa 7
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 2048;
descr.activación = LReLU;
descr.optimización = ADAM;
if(!actor.Add(descr))
{
borrar descr;
return false;
}
//--- capa 8
if(!(descr = new CLayerDescription())))
return false
descr.type = defNeuronBaseOCL;
descr.count = 2048;
descr.activación = LReLU;
descr.optimización = ADAM;
if(!actor.Add(descr))
{
borrar descr;
return false;
}
//--- capa 8
if(!(descr = new CLayerDescription())))
return false
descr.type = defNeuronBaseOCL;
descr.count = 2048;
descr.activación = LReLU;
descr.optimización = ADAM;
if(!actor.Add(descr))
{
borrar descr;
return false;
}
//--- capa 9
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronSoftActorCritic;
descr.count = NActions;
descr.window_out = 32;
descr.optimización = ADAM;
descr.activation = SIGMOID;
if(!actor.Add(descr))
{
borra descr;
return false;
}
//--- Critic
critic.Clear();
//--- Capa de entrada
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = LatentCount;
descr.window = 0;
descr.activation = None;
descr.optimización = ADAM;
if(!critic.Add(descr))
{
borrar descr;
return false;
}
//--- capa 1
if(!(descr = new CLayerDescription())))
return false
descr.type = defNeuronConcatenate;
descr.count = 1024;
descr.window = prev_count;
descr.paso = 6;
descr.optimización = ADAM;
descr.activación = LReLU;
if(!critic.Add(descr))
{
eliminar descr;
return false;
}
//--- capa 2
if(!(descr = new CLayerDescription()))
return false
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activación = LReLU;
descr.optimización = ADAM;
if(!critic.Add(descr))
{
borrar descr;
return false;
}
//--- capa 3
if(!(descr = new CLayerDescription())))
return false
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activación = LReLU;
descr.optimisation = ADAM;
if(!critic. Add(descr))
{
borrar descr;
return false;
}
--- capa 4
if(!( descr = new CLayerDescription())))
return false
descr.type = defNeuronBaseOCL;
descr.count = 1;
descr.optimisation = ADAM;
descr.activation = None;
if(!critic. Add(descr))
{
borrar descr;
return false;
}
//---
return true;
}
 
//--- Actor
actor.Clear();
//--- Capa de entrada
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
int prev_count = descr.count = (HistoryBars * BarDescr);
descr.window = 0;
descr.activation = None;
descr.optimización = ADAM;
if(!actor.Add(descr))
{
borra descr;
return false;
}
// Capa 1 | Capa de Atención Multicapa - 1
if (!(descr = new CLayerDescription()))
return false
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.activación = LReLU;
descr.optimización = ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 1: Capa de Atención Multicapa - 1: Datos pasados con éxito.\n");
//--- capa 2 | Capa de Normalización por Lotes
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBatchNormOCL;
descr.count = prev_count;
descr.batch = 1024;
descr.activation = None;
descr.optimización = ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 2: Capa de Normalización por Lotes: Datos pasados con éxito.\n");
// Capa 3 | Capa de Atención Multicapa - 2
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.activación = LReLU;
descr.optimización = ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 3: Capa de Atención Multicapa - 2: Datos pasados con éxito.\n");
//--- capa 4
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count - 1;
descr.window = 2;
descr.step = 1;
descr.window_out = 8;
descr.activación = LReLU;
descr.optimización = ADAM;
if(!actor.Add(descr))
{
borra descr;
return false;
}
//--- capa 5
if(!(descr = new CLayerDescription())))
return false
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count;
descr.window = 8;
descr.paso = 8
descr.window_out = 8;
descr.activación = LReLU;
descr.optimización = ADAM;
if(!actor.Add(descr))
{
borra descr;
return false;
}
//--- capa 6 | Capa Convolucional - 4
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = 8;
descr.paso = 1;
descr.window_out = 9;
descr.activación = LReLU;
descr.optimización = ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 7: Capa Convolucional - 4: Datos pasados con éxito.\n");
//--- capa 7 | Capa Convolucional - 5
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = 9;
descr.step = 1;
descr.window_out = 7;
descr.activación = LReLU;
descr.optimización = ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 8: Capa Convolucional - 5: Datos pasados con éxito.\n");
//--- capa 8 | Capa Convolucional - 6
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = 7;
descr.step = 1;
descr.window_out = 5;
descr.activación = LReLU;
descr.optimización = ADAM;
if (!actor.Add(descr))
{
elimina descr;
return false;
}
PrintFormat("[Actor] Capa 9: Capa Convolucional - 6: Datos pasados con éxito.\n");
//--- capa 9 | Capa Convolucional - 7
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count;
descr.window = 5;
descr.step = 1;
descr.window_out = 4;
descr.activación = LReLU;
descr.optimización = ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 10: Capa Convolucional - 7: Datos pasados con éxito.\n");
// Capa 10 | Capa de Atención Multicapa - 3
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.activación = LReLU;
descr.optimización = ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 11: Capa de Atención Multicapa Multicabezal - 3: Datos pasados con éxito.\n");
// Capa 11 | Capa de Atención Multicapa - 4
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.activación = LReLU;
descr.optimización = ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 12: Capa de Atención Multicapa - 4: Datos pasados con éxito.\n");
//--- capa 12
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronLSTMOCL;
descr.count = 1024;
descr.optimización = ADAM;
descr.activation = SIGMOID;
if(!actor.Add(descr))
{
borra descr;
return false;
}
//--- capa 13
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = 1024;
descr.activación = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
borrar descr;
return false;
}
// Capa 14 | Capa de Atención Multicapa - 5
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.activación = LReLU;
descr.optimización = ADAM;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 13: Capa de Atención Multicapa - 5: Datos pasados con éxito.\n");
//--- capa 15
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConcatenate;
descr.count = LatentCount;
descr.ventana = recuento_previo;
descr.paso = AccountDescr;
descr.optimización = ADAM;
descr.activación = SIGMOID;
if(!actor.Add(descr))
{
elimina descr;
return false;
}
//--- capa 16 | Capa Softmax
if (!(descr = new CLayerDescription()))
return false
descr.type = defNeuronSoftMaxOCL;
descr.count = 1024;
descr.optimización = ADAM;
descr.activation = SIGMOID;
if (!actor.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa Softmax: Datos pasados con éxito.\n");
//--- capa 17
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 512;
descr.activación = LReLU;
descr.optimización = ADAM;
if(!actor.Add(descr))
{
borrar descr;
return false;
}
//--- capa 18
if(!(descr = new CLayerDescription())))
return false
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activación = LReLU;
descr.optimización = ADAM;
if(!actor.Add(descr))
{
borrar descr;
return false;
}
//--- capa 19
if(!(descr = new CLayerDescription())))
return false
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activación = LReLU;
descr.optimización = ADAM;
if(!actor.Add(descr))
{
borrar descr;
return false;
}
//--- capa 20
if(!(descr = new CLayerDescription())))
return false
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activación = LReLU;
descr.optimización = ADAM;
if(!actor.Add(descr))
{
borrar descr;
return false;
}
//--- capa 21
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronSoftActorCritic;
descr.count = NActions;
descr.window_out = 32;
descr.optimización = ADAM;
descr.activation = SIGMOID;
if(!actor.Add(descr))
{
borra descr;
return false;
}
//--- Critic
critic.Clear();
//--- Capa de entrada
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = LatentCount;
descr.window = 0;
descr.activation = None;
descr.optimización = ADAM;
if(!critic.Add(descr))
{
borrar descr;
return false;
}
// Capa 1 | Capa de atención multicapa - 4
if (!(descr = new CLayerDescription()))
return false
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 512;
descr.activación = LReLU;
descr.optimización = ADAM;
if (!critic.Add(descr))
{
borrar descr;
return false;
}
PrintFormat("[Actor] Capa 12: Capa de Atención Multicapa - 4: Datos pasados con éxito.\n");
//--- capa 2
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConcatenate;
descr.count = 512;
descr.window = prev_count;
descr.paso = 6;
descr.optimización = ADAM;
descr.activación = LReLU;
if(!critic.Add(descr))
{
eliminar descr;
return false;
}
//--- capa 3
if(!(descr = new CLayerDescription())))
return false
descr.type = defNeuronBaseOCL;
descr.count = 512;
descr.activación = LReLU;
descr.optimización = ADAM;
if(!critic.Add(descr))
{
borrar descr;
return false;
}
//--- capa 4
if(!(descr = new CLayerDescription())))
return false
descr.type = defNeuronBaseOCL;
descr.count = 512;
descr.activación = LReLU;
descr.optimización = ADAM;
if(!critic.Add(descr))
{
borrar descr;
return false;
}
//--- capa 5
if(!(descr = new CLayerDescription())))
return false
descr.type = defNeuronBaseOCL;
descr.count = 512;
descr.activación = LReLU;
descr.optimización = ADAM;
if(!critic. Add(descr))
{
borrar descr;
return false;
}
--- capa 6
if(!( descr = new CLayerDescription())))
return false
descr.type = defNeuronBaseOCL;
descr.count = 1;
descr.optimisation = ADAM;
descr.activation = None;
if(!critic. Add(descr))
{
borrar descr;
return false;
}
//---
return true;


La imagen también puede ser simplemente arrastrada al texto o pegada con Ctrl+V
 
La investigación no consigue ninguna transacción positiva. No hay archivos en el directorio de datos. El archivo SoftAC.bd de la carpeta de datos compartida parece estar vacío (12 bytes). El estudio no se aferra al gráfico. ¿Puede decirme qué hacer?
 
star-ik #:
La investigación no consigue ninguna transacción positiva. No hay archivos en el directorio de datos. El archivo SoftAC.bd de la carpeta de datos compartida parece estar vacío (12 bytes). El estudio no se aferra al gráfico. ¿Puede decirme qué hacer?

1. La diferencia de operaciones positivas en los primeros pases de Estudio es bastante natural, porque se utilizan redes absolutamente aleatorias. Y las operaciones serán igual de aleatorias. Al iniciar el Asesor Experto, establezca MinProfit tan negativo como sea posible. Entonces el archivo SoftAC.bd se llenará de ejemplos para el entrenamiento inicial del modelo.

2. Hay una comprobación en el archivo Estudio. No funciona en ausencia de ejemplos en SoftAC.bd. No tiene datos para el entrenamiento del modelo.

 
Gracias, ayudó. Los puntos verdes comenzaron a aparecer. No me di cuenta de que MinProfit se puede establecer en el rango negativo. Pero hay una pregunta más. ¿Es necesario eliminar manualmente la primera base de datos? ¿Y qué archivo?
 
star-ik #:
Gracias, ayudó. Los puntos verdes comenzaron a aparecer. No me di cuenta de que MinProfit se puede establecer en el rango negativo. Pero hay una pregunta más. ¿Es necesario eliminar manualmente la primera base de datos? ¿Y qué archivo?

Toda la base de datos de ejemplo está en SoftAC.bd. He borrado la primera manualmente. Pero en el EA hay una constante MaxReplayBuffer 500, que limita el tamaño de la base de datos de ejemplos a 500 trayectorias. Si quieres, puedes cambiar y recompilar los archivos. Esto le permite mantener sólo las últimas 500 trayectorias en la base de datos de ejemplos.

 
Dmitriy Gizlyk #:

Toda la base de datos de ejemplo está en SoftAC.bd. He borrado el primero manualmente. Pero el Asesor Experto tiene una constante MaxReplayBuffer 500, que limita el tamaño de la base de datos de ejemplos a 500 trayectorias. Si lo desea, puede cambiar y volver a compilar los archivos. Esto le permite mantener sólo las últimas 500 trayectorias en la base de datos de ejemplos.

Gracias de nuevo.

 

Dmitry, cuando se llena la base de datos de ejemplos y se añaden nuevos ejemplos, ¿se borran los ejemplos más antiguos o se borran accidentalmente? ¿O es necesario tener una base de datos de ejemplos para todo el número de operaciones, teniendo en cuenta las adiciones en el entrenamiento, una base de datos de 1000 trayectorias?

Y está escrito que usted hizo la prueba con el Asesor Experto Test.mqh (después de 500 000 iteraciones de entrenamiento) 10 veces. si he entendido bien. Y entonces usted dijo que usted hizo la colección - entrenamiento - prueba 15 veces más (ciclos). Y obtuviste un modelo de trabajo. Entonces no entiendo, ¿ejecutaste el Expert Advisor Test.mqh 10 veces en cada etapa del ciclo o no? El problema que tengo es que si lo hago así, tengo más ejemplos negativos en la base y el Asesor Experto al final empieza a operar en negativo.

Supongamos que he recogido una base de 200 trayectorias. Lo he entrenado durante 100.000 iteraciones. Luego he añadido 10 pasadas de la prueba. y Research.mqh añadido 10-15 nuevos ejemplos a la base de datos. He establecido el límite MinProfit por ejemplo -3000.

Hago el siguiente entrenamiento (100 000 iteraciones). De nuevo añado 10 pases de prueba y 10-15 de Research.mqh. Establezco MinProfit por ejemplo -2500.

Vuelvo a entrenar (100 000 iteraciones). De nuevo 10 pruebas y 10-15 ejemplos de Research.mqh. MinProfit=-2000.

Y así sucesivamente. ¿Entendido? Lo que me confunde es que la prueba a menudo da pases negativos muy grandes con -7000 o incluso -9000. Y habrá muchos de ellos en la base. ¿No está la red entrenada para operar en negativo a propósito?

¿Y qué hacer si las pasadas de prueba dan un resultado peor que la vez anterior? ¿Debo cambiar MinProfit al lado negativo? ¿Y qué hacer si Research.mqh no puede encontrar y añadir nada a la base de datos para 100 pases con un límite especificado (por ejemplo, MinProfit=-500)?

 
Viktor Kudriavtsev número de operaciones, teniendo en cuenta las adiciones en el entrenamiento, una base de digamos 1000 trayectorias?

Se borran los más antiguos. Se organiza según el principio FIFO: primero en entrar, primero en salir.

 
Viktor Kudriavtsev #:

Y aquí está escrito que usted hizo la prueba con el Asesor Experto Test.mqh (después de 500 000 iteraciones de entrenamiento) 10 veces. si he entendido bien. Y entonces usted dijo que usted hizo colección - formación - prueba 15 veces más (ciclos). Y obtuviste un modelo de trabajo. Entonces no entiendo, ¿ejecutaste el Expert Advisor Test.mqh 10 veces en cada etapa del ciclo o no? El problema que tengo es que si lo hago así, me salen más ejemplos negativos en la base y el Asesor Experto al final empieza a operar en negativo.

Hago condicionalmente 10 ejecuciones únicas en el probador de estrategias para estimar los límites de dispersión de los resultados del modelo. Y elijo el cuantil superior para seleccionar las mejores trayectorias durante la posterior recopilación de trayectorias en el modo de optimización.