Обсуждение статьи "Нейросети — это просто (Часть 49): Мягкий Актер-Критик (Soft Actor-Critic)"

 

Опубликована статья Нейросети — это просто (Часть 49): Мягкий Актер-Критик (Soft Actor-Critic):

Мы продолжаем рассмотрение алгоритмов обучения с подкреплением в решении задач непрерывного пространства действий. И в данной статье предлагаю познакомиться с алгоритмом Soft Аctor-Critic (SAC). Основное преимущество SAC заключается в способности находить оптимальные политики, которые не только максимизируют ожидаемую награду, но и имеют максимальную энтропию (разнообразие) действий.

В этой статье я предлагаю Вам познакомиться с ещё одним алгоритмом — Soft Аctor-Critic (SAC). Данный алгоритм впервые был представлен в статье "Soft Actor-Critic: Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor" (январь 2018 г). Метод был представлен практически одновременно с TD3 и имеет некоторые схожие моменты, но есть и отличия в алгоритмах. Основной целью SAC является максимизация ожидаемой награды с учетом максимальной энтропии политики, что позволяет находить разнообразные оптимальные решения в стохастических средах.

Soft Actor-Critic использует Актера со стохастической политикой. Это означает, что Актер в состоянии S может выбрать некое действие A' из всего пространства действий с некой вероятностью Pa'. Иными словами, политика Актера в каждом конкретном состоянии позволяет выбрать не одно конкретное оптимальное действие, а любое из возможных действий (но с определенной долей вероятности). И в процессе обучения Актер учит это вероятностное распределения получения максимального вознаграждения.

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

Автор: Dmitriy Gizlyk

 
Hey Dimitriy,

I discovered a new NN sequence: enjoy <3

bool CreateDescriptions(CArrayObj *actor, CArrayObj *critic)
{
//---
     CLayerDescription *descr;
//---
     if(!actor)
          {
               actor = new CArrayObj();
               if(!actor)
                    return false;
          }
     if(!critic)
          {
               critic = new CArrayObj();
               if(!critic)
                    return false;
          }
//--- 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
     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;
     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 = 4;
     descr.activation = LReLU;
     descr.optimization = ADAM;
     if(!actor.Add(descr))
          {
               delete descr;
               return false;
          }
//--- layer 4
     if(!(descr = new CLayerDescription()))
          return false;
     descr.type = defNeuronBaseOCL;
     prev_count = descr.count = 1024;
     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.optimization = ADAM;
     descr.activation = LReLU;
     if(!actor.Add(descr))
          {
               delete descr;
               return false;
          }
// Softmax Layer
     if(!(descr = new CLayerDescription()))
          return false;
     descr.type = defNeuronSoftMaxOCL;
     descr.count = 1024;
     descr.optimization = ADAM;
     descr.activation = LReLU;
     if(!actor.Add(descr))
          {
               delete descr;
               return false;
          }
// Multilayer Multi-Head Attention Layer
     if(!(descr = new CLayerDescription()))
          return false;
     descr.type = defNeuronMLMHAttentionOCL;
     descr.count = 1024;
     descr.optimization = ADAM;
     descr.activation = LReLU;
     if(!actor.Add(descr))
          {
               delete descr;
               return false;
          }
//--- layer 6
     if(!(descr = new CLayerDescription()))
          return false;
     descr.type = defNeuronConcatenate;
     descr.count = LatentCount;
     descr.window = prev_count;
     descr.step = AccountDescr + 6;
     descr.optimization = ADAM;
     descr.activation = SIGMOID;
     if(!actor.Add(descr))
          {
               delete descr;
               return false;
          }
//--- layer 7
     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 8
     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 9
     if(!(descr = new CLayerDescription()))
          return false;
     descr.type = defNeuronBaseOCL;
     descr.count = 6;
     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 = 512;
     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 = 512;
     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 = 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 = 1;
     descr.optimization = ADAM;
     descr.activation = None;
if(!critic. Add(descr))
          {
               delete descr;
               return false;
          }
//---
     return true;
}

Картинку также можно просто перетащить в текст или вставить её с помощью Ctrl+V