Обсуждение статьи "Нейросети — это просто (Часть 50): Soft Actor-Critic (оптимизация модели)"

 

Опубликована статья Нейросети — это просто (Часть 50): Soft Actor-Critic (оптимизация модели):

В предыдущей статье мы реализовали алгоритм Soft Actor-Critic, но не смогли обучить прибыльную модель. В данной статье мы проведем оптимизацию ранее созданной модели для получения желаемых результатов её работы.

Продолжаем изучение алгоритма Soft Actor-Critic. В предыдущей статье мы реализовали данный алгоритм, но, к сожалению, не смогли обучить прибыльную модель. Сегодня мы поговорим о вариантах решения этой проблемы. Подобный вопрос уже поднимался в статье "Прокрастинация модели, причины и методы решения". Я предлагаю расширить наши знания в данной области и рассмотреть новые подходы на примере нашей модели Soft Actor-Critic.



И прежде, чем перейти непосредственно к оптимизации построенной нами модели напомню, что Soft Actor-Critic является алгоритмом обучения с подкреплением стохастических моделей в непрерывном пространстве действий. Основной особенностью данного метода является введение энтропийной составляющей в функцию вознаграждения.

Использование стохастической политики Актера позволяет модели быть более гибкой и способной решать задачи в сложных средах, где некоторые действия могут быть неопределенными или невозможными к определению четких правил. Такая политика часто более устойчива в работе с данными, содержащими большое количество шума. Так как учитывает вероятностную составляющую, а не привязана к четким правилам.

Автор: Dmitriy Gizlyk

 
//--- Actor
   actor.Clear();
//--- Input layer
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   int prev_count = descr.count = (HistoryBars * BarDescr);
   descr.window = 0;
   descr.activation = None;
   descr.optimization = ADAM;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
// Layer 1 | Multilayer Multi-Head Attention Layer - 1
   if (!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronMLMHAttentionOCL;
   descr.count = 2048;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 1: Multilayer Multi-Head Attention Layer - 1: Data successfully passed.\n");
//--- layer 2 | Batch Normalization Layer
   if (!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBatchNormOCL;
   descr.count = prev_count;
   descr.batch = 1000;
   descr.activation = None;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 2: Batch Normalization Layer: Data successfully passed.\n");
// Layer 3 | Multilayer Multi-Head Attention Layer - 2
   if (!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronMLMHAttentionOCL;
   descr.count = 2048;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 3: Multilayer Multi-Head Attention Layer - 2: Data successfully passed.\n");
//--- layer 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.activation = LReLU;
   descr.optimization = ADAM;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 3
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronConvOCL;
   prev_count = descr.count = prev_count;
   descr.window = 8;
   descr.step = 8;
   descr.window_out = 8;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 7 | Convolutional Layer - 4
   if (!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronConvOCL;
   prev_count = descr.count = BarDescr;
   descr.window = 8;
   descr.step = 1;
   descr.window_out = 9;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 7: Convolutional Layer - 4: Data successfully passed.\n");
//--- layer 8 | Convolutional Layer - 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.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 8: Convolutional Layer - 5: Data successfully passed.\n");
//--- layer 9 | Convolutional Layer - 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.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 9: Convolutional Layer - 6: Data successfully passed.\n");
//--- layer 10 | Convolutional Layer - 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.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 10: Convolutional Layer - 7: Data successfully passed.\n");
// Layer 11 | Multilayer Multi-Head Attention Layer - 3
   if (!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronMLMHAttentionOCL;
   descr.count = 2048;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 11: Multilayer Multi-Head Attention Layer - 3: Data successfully passed.\n");
// Layer 12 | Multilayer Multi-Head Attention Layer - 4
   if (!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronMLMHAttentionOCL;
   descr.count = 2048;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 12: Multilayer Multi-Head Attention Layer - 4: Data successfully passed.\n");
// Layer 13 | Multilayer Multi-Head Attention Layer - 5
   if (!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronMLMHAttentionOCL;
   descr.count = 2048;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 13: Multilayer Multi-Head Attention Layer - 5: Data successfully passed.\n");
//--- layer 4
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   descr.count = 2048;
   descr.optimization = ADAM;
   descr.activation = LReLU;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 5
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   prev_count = descr.count = 1024;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
// Layer 13 | Multilayer Multi-Head Attention Layer - 5
   if (!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronMLMHAttentionOCL;
   descr.count = 1024;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 13: Multilayer Multi-Head Attention Layer - 5: Data successfully passed.\n");
//--- layer 6
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronConcatenate;
   descr.count = LatentCount;
   descr.window = prev_count;
   descr.step = AccountDescr;
   descr.optimization = ADAM;
   descr.activation = SIGMOID;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 16 |  Softmax Layer
   if (!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronSoftMaxOCL;
   descr.count = 1024;
   descr.optimization = ADAM;
   descr.activation = SIGMOID;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Softmax Layer: Data successfully passed.\n");
//--- layer 7
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   descr.count = 2048;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 8
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   descr.count = 2048;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 8
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   descr.count = 2048;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 9
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronSoftActorCritic;
   descr.count = NActions;
   descr.window_out = 32;
   descr.optimization = ADAM;
   descr.activation = SIGMOID;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
//--- Critic
   critic.Clear();
//--- Input layer
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   prev_count = descr.count = LatentCount;
   descr.window = 0;
   descr.activation = None;
   descr.optimization = ADAM;
   if(!critic.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 1
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronConcatenate;
   descr.count = 1024;
   descr.window = prev_count;
   descr.step = 6;
   descr.optimization = ADAM;
   descr.activation = LReLU;
   if(!critic.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 2
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   descr.count = 1024;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if(!critic.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 3
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   descr.count = 1024;
   descr.activation = LReLU;
   descr.optimization = ADAM;
if(!critic. Add(descr))
      {
         delete descr;
         return false;
      }
--- layer 4
if(!( descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   descr.count = 1;
   descr.optimization = ADAM;
   descr.activation = None;
if(!critic. Add(descr))
      {
         delete descr;
         return false;
      }
//---
   return true;
}
 
//--- Actor
   actor.Clear();
//--- Input layer
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   int prev_count = descr.count = (HistoryBars * BarDescr);
   descr.window = 0;
   descr.activation = None;
   descr.optimization = ADAM;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
// Layer 1 | Multilayer Multi-Head Attention Layer - 1
   if (!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronMLMHAttentionOCL;
   descr.count = 1024;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 1: Multilayer Multi-Head Attention Layer - 1: Data successfully passed.\n");
//--- layer 2 | Batch Normalization Layer
   if (!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBatchNormOCL;
   descr.count = prev_count;
   descr.batch = 1024;
   descr.activation = None;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 2: Batch Normalization Layer: Data successfully passed.\n");
// Layer 3 | Multilayer Multi-Head Attention Layer - 2
   if (!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronMLMHAttentionOCL;
   descr.count = 1024;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 3: Multilayer Multi-Head Attention Layer - 2: Data successfully passed.\n");
//--- layer 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.activation = LReLU;
   descr.optimization = ADAM;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 5
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronConvOCL;
   prev_count = descr.count = prev_count;
   descr.window = 8;
   descr.step = 8;
   descr.window_out = 8;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 6 | Convolutional Layer - 4
   if (!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronConvOCL;
   prev_count = descr.count = BarDescr;
   descr.window = 8;
   descr.step = 1;
   descr.window_out = 9;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 7: Convolutional Layer - 4: Data successfully passed.\n");
//--- layer 7 | Convolutional Layer - 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.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 8: Convolutional Layer - 5: Data successfully passed.\n");
//--- layer 8 | Convolutional Layer - 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.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 9: Convolutional Layer - 6: Data successfully passed.\n");
//--- layer 9 | Convolutional Layer - 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.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 10: Convolutional Layer - 7: Data successfully passed.\n");
// Layer 10 | Multilayer Multi-Head Attention Layer - 3
   if (!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronMLMHAttentionOCL;
   descr.count = 1024;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 11: Multilayer Multi-Head Attention Layer - 3: Data successfully passed.\n");
// Layer 11 | Multilayer Multi-Head Attention Layer - 4
   if (!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronMLMHAttentionOCL;
   descr.count = 1024;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 12: Multilayer Multi-Head Attention Layer - 4: Data successfully passed.\n");
//--- layer 12
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronLSTMOCL;
   descr.count = 1024;
   descr.optimization = ADAM;
   descr.activation = SIGMOID;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 13
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   prev_count = descr.count = 1024;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
// Layer 14 | Multilayer Multi-Head Attention Layer - 5
   if (!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronMLMHAttentionOCL;
   descr.count = 1024;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 13: Multilayer Multi-Head Attention Layer - 5: Data successfully passed.\n");
//--- layer 15
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronConcatenate;
   descr.count = LatentCount;
   descr.window = prev_count;
   descr.step = AccountDescr;
   descr.optimization = ADAM;
   descr.activation = SIGMOID;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 16 |  Softmax Layer
   if (!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronSoftMaxOCL;
   descr.count = 1024;
   descr.optimization = ADAM;
   descr.activation = SIGMOID;
   if (!actor.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Softmax Layer: Data successfully passed.\n");
//--- layer 17
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   descr.count = 512;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 18
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   descr.count = 1024;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 19
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   descr.count = 1024;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 20
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   descr.count = 1024;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 21
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronSoftActorCritic;
   descr.count = NActions;
   descr.window_out = 32;
   descr.optimization = ADAM;
   descr.activation = SIGMOID;
   if(!actor.Add(descr))
      {
         delete descr;
         return false;
      }
//--- Critic
   critic.Clear();
//--- Input layer
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   prev_count = descr.count = LatentCount;
   descr.window = 0;
   descr.activation = None;
   descr.optimization = ADAM;
   if(!critic.Add(descr))
      {
         delete descr;
         return false;
      }
// Layer 1 | Multilayer Multi-Head Attention Layer - 4
   if (!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronMLMHAttentionOCL;
   descr.count = 512;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if (!critic.Add(descr))
      {
         delete descr;
         return false;
      }
   PrintFormat("[Actor] Layer 12: Multilayer Multi-Head Attention Layer - 4: Data successfully passed.\n");
//--- layer 2
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronConcatenate;
   descr.count = 512;
   descr.window = prev_count;
   descr.step = 6;
   descr.optimization = ADAM;
   descr.activation = LReLU;
   if(!critic.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 3
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   descr.count = 512;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if(!critic.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 4
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   descr.count = 512;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if(!critic.Add(descr))
      {
         delete descr;
         return false;
      }
//--- layer 5
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   descr.count = 512;
   descr.activation = LReLU;
   descr.optimization = ADAM;
if(!critic. Add(descr))
      {
         delete descr;
         return false;
      }
--- layer 6
if(!( descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   descr.count = 1;
   descr.optimization = ADAM;
   descr.activation = None;
if(!critic. Add(descr))
      {
         delete descr;
         return false;
      }
//---
   return true;


Картинку также можно просто перетащить в текст или вставить её с помощью Ctrl+V
 
Research не удается добиться ни одной положительной сделки. В каталоге данных файлов нет.  Файл SoftAC.bd в общей папке данных, по-видимому, пустой (12 байт). Study не цепляется на график. Подскажите, что делать?
 
star-ik #:
Research не удается добиться ни одной положительной сделки. В каталоге данных файлов нет.  Файл SoftAC.bd в общей папке данных, по-видимому, пустой (12 байт). Study не цепляется на график. Подскажите, что делать?

1. Отличие положительных сделок при первых проходах Research вполне естественно, так как используются абсолютно случайные сети. И сделки будут такие же случайные. При запуксе советника установите максимально отрицательный MinProfit. Тогда файл SoftAC.bd наполнится примерами для первичного обучения модели.

2. В файле Study стоит проверка. Он не работает при остутствии примеров в SoftAC.bd. Ему банально нет данных для обучения моделей.

 
Спасибо, помогло. Начали появляться зеленые точки. Не мог додуматься, что значение MinProfit можно устанавливать в отрицательном диапазоне. Но есть еще один вопрос. Первую базу данных надо удалять вручную? И какой именно файл?
 
star-ik #:
Спасибо, помогло. Начали появляться зеленые точки. Не мог додуматься, что значение MinProfit можно устанавливать в отрицательном диапазоне. Но есть еще один вопрос. Первую базу данных надо удалять вручную? И какой именно файл?

Вся база примеров в SoftAC.bd. Первую я удалял вручную. Но в советнике есть константа MaxReplayBuffer 500, которая ограничивает размер база примеров в 500 траекторий. При желании можно изменить и перекомпилировать файлы. Это позволяет в базе примеров держать только 500 последних траекторий.

 
Dmitriy Gizlyk #:

Вся база примеров в SoftAC.bd. Первую я удалял вручную. Но в советнике есть константа MaxReplayBuffer 500, которая ограничивает размер база примеров в 500 траекторий. При желании можно изменить и перекомпилировать файлы. Это позволяет в базе примеров держать только 500 последних траекторий.

Еще раз спасибо.

 

Дмитрий подскажите, а вот в базе примеров при её заполнении и добавлении новых примеров, удаляются самые старые примеры или случайно? Или надо иметь базу примеров на всё количество сделок с учётом добавлений на тренировках, те базу допустим в 1000 траекторий?

И вот у Вас написано что вы делали проверку советником Test.mqh (после 500 000 итераций обучения) 10 раз. если я правильно понял. А потом Вы сказали что делали сбор - обучение - тест ещё 15 раз (циклов). И получили рабочую модель. Дак вот мне непонятно, вот на каждом этапе цикла Вы прогоняли по 10 раз советник Test.mqh или нет? Просто проблема у меня в том что если я так делаю то отрицательных примеров в базе у меня получается больше и советник в итоге начинает сам торговать в минус.

Допустим я собрал базу 200 траекторий. Провёл на ней обучение в 100 000 итераций. Потом добавил 10 проходов от теста. и  Research.mqh мне добавил в базу к примеру 10-15 новых примеров. у него границу  MinProfit я поставил к примеру -3000.

Делаю следующее обучение (100 000 итераций). Опять добавляю 10 проходов теста и 10-15 от  Research.mqh.   MinProfit ставлю к примеру -2500.

Опять обучаю (100 000 итераций). Опять 10 тестов и 10-15 примеров с  Research.mqh.  MinProfit=-2000.

И тд. Я привольно понимаю? Меня смущает, то что тест часто даёт очень большие отрицательные проходы с -7000 или даже -9000. И их будет очень много в базе. Не обучится ли сеть специально торговать в минус?

И что делать если проходы тестов дают результат хуже предыдущего раза? Менять ли  MinProfit в отрицательную сторону? И что делать если с заданной границей (к примеру MinProfit=-500)  Research.mqh ничего не может найти и добавить в базу за 100 проходов?

 
Viktor Kudriavtsev #:

Дмитрий подскажите, а вот в базе примеров при её заполнении и добавлении новых примеров, удаляются самые старые примеры или случайно? Или надо иметь базу примеров на всё количество сделок с учётом добавлений на тренировках, те базу допустим в 1000 траекторий?

Удаляются самые старые. Организовано по принципу FIFO - первый пришел-первый ушел.

 
Viktor Kudriavtsev #:

И вот у Вас написано что вы делали проверку советником Test.mqh (после 500 000 итераций обучения) 10 раз. если я правильно понял. А потом Вы сказали что делали сбор - обучение - тест ещё 15 раз (циклов). И получили рабочую модель. Дак вот мне непонятно, вот на каждом этапе цикла Вы прогоняли по 10 раз советник Test.mqh или нет? Просто проблема у меня в том что если я так делаю то отрицательных примеров в базе у меня получается больше и советник в итоге начинает сам торговать в минус.

Я условно делаю 10 одиночных проходов в тестере стратегий, чтобы оценить границы разброса результатов модели. И выбираю верхний квантиль, чтобы при последующем сборе траекторий в режиме оптимизации отобрать лучшие.