Обсуждение статьи "Нейросети — это просто (Часть 57): Стохастический маргинальный актер-критик (SMAC)"

 

Опубликована статья Нейросети — это просто (Часть 57): Стохастический маргинальный актер-критик (SMAC):

Предлагаем познакомиться с довольно новым алгоритмом Stochastic Marginal Actor-Critic (SMAC), который позволяет строить политики латентных переменных в рамках максимизации энтропии.

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

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


Введение латентных переменных в политику Агента позволяет охватить более разнообразные сценарии, совместимые с историей наблюдений. Здесь следует отметить, что политики с латентными переменными не допускают простого выражения для определения их энтропии. Наивная оценка энтропии может привести к катастрофическим сбоям при оптимизации политики. Кроме того, стохастические обновления с высокой дисперсией для максимизации энтропии не сразу различают между собой локальные случайные воздействия и многомодальное исследование.

Один из вариантов решения указанных недостатков политик с латентными переменными был предложен в статье "Latent State Marginalization as a Low-cost Approach for Improving Exploration". В ней авторы предлагают простой, но эффективный алгоритм оптимизации политики, который способен обеспечивать более эффективное и устойчивое исследование как в полностью наблюдаемых, так и в частично наблюдаемых средах.

Автор: Dmitriy Gizlyk

 
Не компилируются.
Файлы:
 
У меня тоже не компилируется. Тоже самое.
 
star-ik #:
Не компилируются.

В статье обновили архив файлов.

 

Дмитрий, спасибо за ваш труд. Все работает. 

Собираю примеры советником  Research на 100 проходов, обучаю модель советником Study, тестирую Test-ом. Далее 50 проходов собираю снова, обучаю на 10 000 итераций, опять тест. 

И так пока модель не научится. Вот только у меня пока Test выдает постоянно разные результаты после цикла и не всегда положительные. Т е цикл прогнал, 2-3 теста и результаты разные. 

На каком примерно цикле результат станет стабильный? Или это бесконечная работа и результат будет всегда разный?

Спасибо! 

 
Nikolai Fedotov #:

Дмитрий, спасибо за ваш труд. Все работает. 

Собираю примеры советником  Research на 100 проходов, обучаю модель советником Study, тестирую Test-ом. Далее 50 проходов собираю снова, обучаю на 10 000 итераций, опять тест. 

И так пока модель не научится. Вот только у меня пока Test выдает постоянно разные результаты после цикла и не всегда положительные. Т е цикл прогнал, 2-3 теста и результаты разные. 

На каком примерно цикле результат станет стабильный? Или это бесконечная работа и результат будет всегда разный?

Спасибо! 

Советник обучает модель со стохастической политикой. Это означает, что модель учит вероятности получения максимальных вознаграждений за совершение  конкретных действий в отдельных состояния системы. В процессе взаимодействия со средой происходит семплирование действий с выученной вероятностью. На начальном этапы вероятности всех действий одинаковые и модель выбирает действие случайным образом. В процессе обучения вероятности будут смещаться и выбор действий будет более осознанным.

 

Дмитрий здравствуйте. А сколько у вас заняло циклов как описал выше Николай до получения стабильного положительного результата?

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

 

Доброго времени.

Дмитрий, спасибо за вашу работу.

Хочу уточнить для всех...

То что Дмитрий выкладывает это не "Грааль"

это  Классический пример академической ЗАДАЧИ,  которая предполагает подготовку к научно исследовательской деятельности теоретико-методического характера.  

А все хотят видеть на своём счету, прямо здесь и сейчас, положительный результат...

Дмитрий учит нас, как решить (нашу/мою/твою/его) задачу всеми представленными, Дмитрием методами.

Популярные ИИ (GPT) имеют более 700 Миллионов параметров!!!! А сколько данная ИИ?

Если хотите получить хороший результат, обменивайтесь идеями (добавляйте параметры), приводите результаты тестирований и т.д.

Создайте отдельный ЧАТ и там "получайте" результат. Хвастаться можно тут :-), тем самым покажите эффективность работы Дмитрия...

 
Oleg_Filatov #:

Доброго времени.

Дмитрий, спасибо за вашу работу.

Хочу уточнить для всех...

То что Дмитрий выкладывает это не "Грааль"

это  Классический пример академической ЗАДАЧИ,  которая предполагает подготовку к научно исследовательской деятельности теоретико-методического характера.  

А все хотят видеть на своём счету, прямо здесь и сейчас, положительный результат...

Дмитрий учит нас, как решить (нашу/мою/твою/его) задачу всеми представленными, Дмитрием методами.

Популярные ИИ (GPT) имеют более 700 Миллионов параметров!!!! А сколько данная ИИ?

Если хотите получить хороший результат, обменивайтесь идеями (добавляйте параметры), приводите результаты тестирований и т.д.

Создайте отдельный ЧАТ и там "получайте" результат. Хвастаться можно тут :-), тем самым покажите эффективность работы Дмитрия...

Друг, тут никто не ждёт грааля! Я вот просто хотел бы увидеть, что то что выкладывает Дмитрий в действительности работает. Не со слов Дмитрия в его статьях (у него во всех статьях практически положительный результат), а у себя на компе. Вот я  скачал его советник допустим с этой статьи и провёл уже 63 цикла обучения (досбор данных -> тренировка). И она до сих пор льёт в минус. За все 63 цикла было только пара сборов данных, когда из 50 новых примеров было 5-6 положительных. Всё остальное в минус.  Как мне увидеть что это действительно работает?

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

Друг если у тебя получился стабильный результат, то напиши сколько ты сделал циклов до стабильного результата допустим в этой статье? Если изменять, то что изменять чтобы увидеть результат у себя на компе, просто в тестере? Не грааль, а хотя бы увидеть что это работает...?

 
Oleg_Filatov #:

Good time.

Dmitry, thank you for your work.

I want to clarify for everyone ...

The fact that Dmitry lays out this is not the "Grail"

This is a classic example of an academic TASK, which involves preparation for research activities of a theoretical and methodological nature.

And everyone wants to see a positive result on their account, right here and now...

Dmitry teaches us how to solve (our/my/your/his) problem with all the methods presented by Dmitry.

Popular AI (GPT) has more than 700 Million parameters!!! And how much is this AI?

If you want to get a good result, exchange ideas (add parameters), give test results, etc.

Create a separate CHAT and "get" the result there. You can brag here :-), thereby showing the effectiveness of Dmitry's work ...

Enjoy <3

Here are the Params: (based on Dmitry and some research.)
// Input parameters for RSI
input group                   "---- RSI ----"
input                         int RSIPeriod  = 14;              // Period
input ENUM_APPLIED_PRICE      RSIPrice       = PRICE_CLOSE; // Applied price

// Input parameters for CCI
input group                   "---- CCI ----"
input int                     CCIPeriod      = 14;              // Period
input ENUM_APPLIED_PRICE      CCIPrice       = PRICE_TYPICAL; // Applied price

// Input parameters for ATR
input group                   "---- ATR ----"
input int                     ATRPeriod      = 14;              // Period

// Input parameters for MACD
input group                   "---- MACD ----"
input int                     FastPeriod     = 12;             // Fast
input int                     SlowPeriod     = 26;             // Slow
input int                     SignalPeriod   = 9;            // Signal
input ENUM_APPLIED_PRICE      MACDPrice      = PRICE_CLOSE; // Applied price

// Input parameters for Momentum
input group                   "---- Momentum ----"
input int                     MomentumPeriod = 14;        // Period for Momentum
input ENUM_APPLIED_PRICE      AppliedPrice   = PRICE_CLOSE; // Applied price for Momentum

// Input parameters for SAR
input group                   "---- SAR ----"
input float                   SARStep        = 0.02f;             // SAR Step
input float                   SARMaximum     = 0.2f;           // SAR Maximum

// Input parameters for Bands
input group                   "---- Bands ----"
input int                     BandsPeriod    = 20;           // Period for Bands
input int                     BandsDeviation = 2.0;    // Bands Deviation
input int                     BandsShift     = 0;             // Bands Shift

#include "FQF.mqh"
//---
#define        HistoryBars             72            //Depth of history
#define        BarDescr                14             //Elements for 1 bar description
#define        AccountDescr            12            //Account description
#define        NActions                6             //Number of possible Actions
#define        NRewards                5             //Number of rewards
#define        EmbeddingSize           64
#define        Buffer_Size             6500
#define        DiscFactor              0.99f
#define        FileName                "zJimReaper_NNM_Neural_Network_"
#define        LatentLayer             11
#define        LatentCount             2048
#define        SamplLatentStates       32
#define        MaxSL                   1000
#define        MaxTP                   1000
#define        MaxReplayBuffer         500
#define        StartTargetIteration    50000
#define        fCAGrad_C               0.5f
#define        iCAGrad_Iters           15
#define        KNN                     32
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CreateDescriptions(CArrayObj *actor, CArrayObj *critic, CArrayObj *convolution)
{
//---
     CLayerDescription *descr;
//---
     if(!actor)
          {
               actor = new CArrayObj();
               if(!actor)
                    return false;
          }
     if(!critic)
          {
               critic = new CArrayObj();
               if(!critic)
                    return false;
          }
     if(!convolution)
          {
               convolution = new CArrayObj();
               if(!convolution)
                    return false;
          }
//--- Actor
     actor.Clear();
//--- Input layer
     if (!(descr = new CLayerDescription())) return false;
     descr.type = defNeuronBaseOCL;
     int prev_count = descr.count = (HistoryBars * BarDescr);
     descr.activation = None;
     descr.optimization = ADAM;
     if(!actor.Add(descr))
          {
               delete descr;
               return false;
          }
//--- layer 1
     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;
          }
//--- layer 2
     if (!(descr = new CLayerDescription())) return false;
     descr.type = defNeuronConvOCL;
     prev_count = descr.count = BarDescr;
     descr.window = HistoryBars;
     descr.step = HistoryBars;
     int prev_wout = descr.window_out = HistoryBars / 2;
     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 - 1;
     descr.window = 7;
     descr.step = 3;
     descr.window_out = 32;
     descr.activation = LReLU;
     descr.optimization = ADAM;
     if(!actor.Add(descr))
          {
               delete descr;
               return false;
          }
//--- layer 4
     if (!(descr = new CLayerDescription())) return false;
     descr.type = defNeuronConvOCL;
     prev_count = descr.count = prev_count - 1;
     descr.window = 5;
     descr.step = 2;
     descr.window_out = 16;
     descr.activation = LReLU;
     descr.optimization = ADAM;
     if(!actor.Add(descr))
          {
               delete descr;
               return false;
          }

The length of the message should not exceed 64000 characters

 


//--- layer 5
     if (!(descr = new CLayerDescription())) return false;
     descr.type = defNeuronConvOCL;
     prev_count = descr.count = prev_count - 1;
     descr.window = 3;
     descr.step = 1;
     descr.window_out = 8;
     descr.activation = LReLU;
     descr.optimization = ADAM;
     if(!actor.Add(descr))
          {
               delete descr;
               return false;
          }
//--- layer 6
     if (!(descr = new CLayerDescription())) return false;
     descr.type = defNeuronConvOCL;
     prev_count = descr.count = BarDescr;
     descr.window = HistoryBars;
     descr.step = HistoryBars;
     prev_wout = descr.window_out = HistoryBars / 2;
     descr.activation = LReLU;
     descr.optimization = ADAM;
     if(!actor.Add(descr))
          {
               delete descr;
               return false;
          }
//--- layer 7
     if (!(descr = new CLayerDescription())) return false;
     descr.type = defNeuronConvOCL;
     prev_count = descr.count = prev_count;
     descr.window = prev_wout;
     descr.step = prev_wout;
     descr.window_out = 32;
     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 = 2 * LatentCount;
     descr.optimization = ADAM;
     descr.activation = LReLU;
     if(!actor.Add(descr))
          {
               delete descr;
               return false;
          }
//--- layer 9
     if (!(descr = new CLayerDescription())) return false;
     descr.type = defNeuronBaseOCL;
     prev_count = descr.count = LatentCount;
     descr.activation = LReLU;
     descr.optimization = ADAM;
     if(!actor.Add(descr))
          {
               delete descr;
               return false;
          }
//--- layer 10
     if (!(descr = new CLayerDescription())) return false;
     descr.type = defNeuronConcatenate;
     descr.count = 4 * LatentCount;
     descr.window = prev_count;
     descr.step = AccountDescr;
     descr.optimization = ADAM;
     descr.activation = SIGMOID;
     if(!actor.Add(descr))
          {
               delete descr;
               return false;
          }
//--- layer 11
     if (!(descr = new CLayerDescription())) return false;
     descr.type = defNeuronVAEOCL;
     descr.count = 2 * LatentCount;
     descr.optimization = ADAM;
     if(!actor.Add(descr))
          {
               delete descr;
               return false;
          }
//--- layer 12
     if (!(descr = new CLayerDescription())) return false;
     descr.type = defNeuronBaseOCL;
     descr.count = 2 * LatentCount;
     descr.activation = LReLU;
     descr.optimization = ADAM;
     if(!actor.Add(descr))
          {
               delete descr;
               return false;
          }
//--- layer 13
     if (!(descr = new CLayerDescription())) return false;
     descr.type = defNeuronBaseOCL;
     descr.count = LatentCount;
     descr.activation = LReLU;
     descr.optimization = ADAM;
     if(!actor.Add(descr))
          {
               delete descr;
               return false;
          }
//--- layer 14
     if (!(descr = new CLayerDescription())) return false;
     descr.type = defNeuronBaseOCL;
     descr.count = LatentCount;
     descr.activation = LReLU;
     descr.optimization = ADAM;
     if(!actor.Add(descr))
          {
               delete descr;
               return false;
          }
//--- layer 15
     if (!(descr = new CLayerDescription())) return false;
     descr.type = defNeuronBaseOCL;
     descr.count = 2 * NActions;
     descr.activation = SIGMOID;
     descr.optimization = ADAM;
     if(!actor.Add(descr))
          {
               delete descr;
               return false;
          }
//--- layer 16
     if (!(descr = new CLayerDescription())) return false;
     descr.type = defNeuronVAEOCL;
     descr.count = NActions;
     descr.optimization = ADAM;
     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 = 2 * LatentCount;
     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 = 2 * LatentCount;
     descr.window = prev_count;
     descr.step = NActions;
     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 = 2 * LatentCount;
     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 = LatentCount;
     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 = LatentCount;
     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 = NRewards;
     descr.optimization = ADAM;
     descr.activation = None;
     if(!critic.Add(descr))
          {
               delete descr;
               return false;
          }
//--- Convolution
// Define common parameters
     int input_size = (HistoryBars * BarDescr) + AccountDescr;
     int num_actions = NActions;
     int embedding_size = EmbeddingSize;
// Create a neural network
     convolution.Clear();
// Input layer 0
     if (!(descr = new CLayerDescription())) return false;
     descr.type = defNeuronBaseOCL;
     descr.count = 4 * input_size;
     descr.activation = None;
     descr.optimization = ADAM;
     if (!convolution.Add(descr))
          {
               delete descr;
               return false;
          }
// Layer 1
     if (!(descr = new CLayerDescription())) return false;
     descr.type = defNeuronBaseOCL;
     descr.count = 2 * LatentCount;
     descr.window = 2 * input_size;
     descr.step = 2 * num_actions;
     descr.activation = SIGMOID;
     descr.optimization = ADAM;
     if (!convolution.Add(descr))
          {
               delete descr;
               return false;
          }
// Layer 2
     if (!(descr = new CLayerDescription())) return false;
     descr.type = defNeuronBaseOCL;
     descr.count = LatentCount;
     descr.window = input_size;
     descr.step = num_actions;
     descr.activation = SIGMOID;
     descr.optimization = ADAM;
     if (!convolution.Add(descr))
          {
               delete descr;
               return false;
          }
// Convolutional layers
     for (int i = 0; i < 6; i++)
          {
               if (!(descr = new CLayerDescription())) return false;
               descr.type = defNeuronConvOCL;
               descr.count = 2 * LatentCount / (1 << i);  // Halve the count with each layer
               descr.window = 64;
               descr.step = 64;
               descr.window_out = 32 / (1 << i);  // Halve the window_out
               descr.activation = LReLU;
               descr.optimization = ADAM;
               if (!convolution.Add(descr))
                    {
                         delete descr;
                         return false;
                    }
          }
// Output layer
     if (!(descr = new CLayerDescription())) return false;
     descr.type = defNeuronBaseOCL;
     descr.count = embedding_size;
     descr.activation = LReLU;
     descr.optimization = ADAM;
     if (!convolution.Add(descr))
          {
               delete descr;
               return false;
          }
// Successfully created the network
     return true;
}
#ifndef Study
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsNewBar(void)
{
===I CUT THE LAST PARTS as Comments are limited to 64000 Chars but you know what to do... =)
The length of the message should not exceed 64000 characters

 -----------------------------------------------------+