Diskussion zum Artikel "Neuronale Netze leicht gemacht (Teil 49): Soft Actor-Critic"

 

Neuer Artikel Neuronale Netze leicht gemacht (Teil 49): Soft Actor-Critic :

Wir setzen unsere Diskussion über Algorithmen des Verstärkungslernens zur Lösung von Problemen im kontinuierlichen Aktionsraum fort. In diesem Artikel werde ich den Soft Actor-Critic (SAC) Algorithmus vorstellen. Der Hauptvorteil von SAC ist die Fähigkeit, optimale Strategien zu finden, die nicht nur die erwartete Belohnung maximieren, sondern auch eine maximale Entropie (Vielfalt) von Aktionen aufweisen.

In den vorangegangenen Artikeln haben wir die Algorithmen Deep Deterministic Policy Gradient (DDPG) und Twin Delayed Deep Deterministic Policy Gradient (TD3) besprochen. In diesem Artikel werden wir uns auf einen anderen Algorithmus konzentrieren - Soft Actor-Critic (SAC). Sie wurde erstmals in dem Artikel „Soft Actor-Critic: Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor“ (Januar 2018) vorgestellt. Die Methode wurde fast gleichzeitig mit TD3 vorgestellt. Es gibt einige Ähnlichkeiten, aber auch Unterschiede in den Algorithmen. Das Hauptziel von SAC ist die Maximierung der erwarteten Belohnung bei maximaler Entropie der Strategie, wodurch eine Vielzahl optimaler Lösungen in stochastischen Umgebungen gefunden werden kann.

Soft Actor-Critic verwendet einen Akteur mit einer stochastischen Politik. Das bedeutet, dass der Akteur im Zustand S die Aktion A' aus dem gesamten Aktionsraum mit einer bestimmten Wahrscheinlichkeit Pa' wählen kann. Mit anderen Worten, die Politik des Akteurs in jedem spezifischen Zustand erlaubt es uns, nicht eine bestimmte optimale Handlung zu wählen, sondern eine beliebige der möglichen Handlungen (jedoch mit einem bestimmten Grad an Wahrscheinlichkeit). Während des Trainings lernt der Akteur diese Wahrscheinlichkeitsverteilung für das Erreichen der maximalen Belohnung.

Diese Eigenschaft einer stochastischen Akteurspolitik ermöglicht es uns, verschiedene Strategien zu erforschen und optimale Lösungen zu entdecken, die bei Verwendung einer deterministischen Politik möglicherweise verborgen bleiben. Darüber hinaus berücksichtigt die stochastische Politik des Akteurs die Unsicherheit in der Umwelt. Im Falle von Rauschen oder zufälligen Faktoren können solche Strategien widerstandsfähiger und anpassungsfähiger sein, da sie eine Vielzahl von Maßnahmen entwickeln können, um effektiv mit der Umwelt zu interagieren.

Autor: Dmitriy Gizlyk

 
Hey Dimitriy,

Ich habe eine neue NN-Sequenz entdeckt: viel Spaß <3

bool CreateDescriptions(CArrayObj *Schauspieler, CArrayObj *Kritik)
{
//---
CLayerDescription *descr;
//---
if(!actor)
{
actor = new CArrayObj();
if(!actor)
return false;
}
if(!critic)
{
critic = new CArrayObj();
if(!critic)
return false;
}
//--- Akteur
actor.Clear();
//--- Eingabeschicht
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
int prev_count = descr.count = (HistoryBars * BarDescr);
descr.window = 0;
descr.activation = Keine;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 1
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBatchNormOCL;
descr.count = prev_count;
descr.batch = 1000;
descr.activation = Keine;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 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.optimisation = ADAM;
if(!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 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.optimisation = ADAM;
if(!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 4
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = 1024;
descr.optimise = ADAM;
descr.activation = LReLU;
if(!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 5
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = 1024;
descr.optimise = ADAM;
descr.activation = LReLU;
if(!actor.Add(descr))
{
descr löschen;
return false;
}
// Softmax-Schicht
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronSoftMaxOCL;
descr.count = 1024;
descr.optimise = ADAM;
descr.activation = LReLU;
if(!actor.Add(descr))
{
descr löschen;
return false;
}
// Mehrschichtige Multi-Head-Aufmerksamkeitsschicht
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.optimisation = ADAM;
descr.activation = LReLU;
if(!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 6
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronConcatenate;
descr.count = LatentCount;
descr.window = prev_count;
descr.step = AccountDescr + 6;
descr.optimise = ADAM;
descr.activation = SIGMOID;
if(!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 7
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 8
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 9
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 6;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
if(!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Kritisch
critic.Clear();
//--- Eingabeschicht
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = LatentCount;
descr.window = 0;
descr.activation = Keine;
descr.optimisation = ADAM;
if(!critic.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 1
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronConcatenate;
descr.count = 512;
descr.window = prev_count;
descr.step = 6;
descr.optimise = ADAM;
descr.activation = LReLU;
if(!critic.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 2
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 512;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!critic.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 3
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 512;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!critic. Add(descr))
{
Descr. löschen;
return false;
}
--- Schicht 4
if(!( descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 1;
descr.optimise = ADAM;
descr.activation = Keine;
if(!critic. Add(descr))
{
löschen descr;
return false;
}
//---
return true;
}

Das Bild kann auch einfach in den Text gezogen oder mit Strg+V eingefügt werden
 
Ich kann mich nicht mit meinem mt4-Konto verbinden und kann nicht handeln, um Aufträge zu erteilen. Was ist das Problem?