Diskussion zum Artikel "Neuronale Netze leicht gemacht (Teil 51): Behavior-Guided Actor-Critic (BAC)"

 

Neuer Artikel Neuronale Netze leicht gemacht (Teil 51): Behavior-Guided Actor-Critic (BAC) :

Die letzten beiden Artikel befassten sich mit dem Soft Actor-Critic-Algorithmus, der eine Entropie-Regularisierung in die Belohnungsfunktion integriert. Dieser Ansatz schafft ein Gleichgewicht zwischen Umwelterkundung und Modellnutzung, ist aber nur auf stochastische Modelle anwendbar. In diesem Artikel wird ein alternativer Ansatz vorgeschlagen, der

sowohl auf stochastische als auch auf deterministische Modelle anwendbar ist.

Lassen Sie uns zunächst über die Notwendigkeit sprechen, die Umgebung im Allgemeinen zu untersuchen. Ich denke, alle sind sich einig, dass dieser Prozess notwendig ist. Aber wofür genau und in welchem Stadium?

Lassen Sie uns mit einem einfachen Beispiel beginnen. Angenommen, wir befinden uns in einem Raum mit drei identischen Türen und müssen auf die Straße gehen. Was sollen wir tun? Wir öffnen die Türen eine nach der anderen, bis wir die richtige gefunden haben. Wenn wir denselben Raum wieder betreten, öffnen wir nicht mehr alle Türen, um nach draußen zu gelangen, sondern gehen sofort zu dem bereits bekannten Ausgang. Wenn wir eine andere Aufgabe haben, dann sind einige Optionen möglich. Wir können wieder alle Türen öffnen, bis auf den Ausgang, den wir schon kennen, und nach dem richtigen suchen. Oder wir können uns erst einmal daran erinnern, welche Türen wir früher auf der Suche nach einem Ausweg geöffnet haben und ob die, die wir brauchen, darunter war. Wenn wir uns an die richtige Tür erinnern, gehen wir auf sie zu. Ansonsten prüfen wir die Türen, die wir noch nicht ausprobiert haben.

Schlussfolgerung: In einer ungewohnten Situation müssen wir die Umgebung studieren, um das richtige Verhalten zu wählen. Nachdem die gewünschte Route gefunden wurde, kann eine weitere Erkundung der Umgebung nur hinderlich sein.


Wenn sich jedoch die Aufgabe in einem bekannten Zustand ändert, müssen wir möglicherweise zusätzlich die Umgebung untersuchen. Dazu kann auch die Suche nach einer optimaleren Route gehören. Im obigen Beispiel könnte dies der Fall sein, wenn wir durch mehrere Räume gehen müssen oder uns auf der falschen Seite des Gebäudes befinden.

Daher benötigen wir einen Algorithmus, der es uns ermöglicht, die Erkundung der Umgebung in unerforschten Zuständen zu verbessern und in bereits erforschten Zuständen zu minimieren.

Autor: Dmitriy Gizlyk

 
#Enjoy! <3

Danke Sir @Dmitriy

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CreateDescriptions(CArrayObj *Schauspieler, CArrayObj *Kritik, CArrayObj *Autoencoder)
{
--- Intelligente Druckanweisung für die Fehlersuche
Print("Creating layer descriptions...");
CLayerDescription *descr;
int layerNumber = 0; Um die Ebenennummern zu verfolgen
--- Überprüfen und Initialisieren der Eingabefelder, falls sie null sind
if (!actor)
{
actor = new CArrayObj();
if (!actor)
false zurückgeben;
}
if (!critic)
{
critic = new CArrayObj();
if (!critic)
return false;
}
if (!autoencoder)
{
autoencoder = new CArrayObj();
if (!autoencoder)
return false;
}
--- Schauspieler
actor. Clear();
--- Ebene 1: Eingabeschicht
layerNumber++;
Print("Akteur erstellen - Eingabeschicht ", layerNumber, ": Eingabeschicht");
if (!( descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
int prev_count = descr.count = (HistoryBars * BarDescr);
descr.activation = Keine;
descr.optimisation = ADAM;
if (!actor. Add(descr))
{
descr. löschen;
return false;
}
--- Schicht 2
layerNumber++;
Print("Akteur erstellen - Batch-Normalisierungsebene ", layerNumber);
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 3
layerNumber++;
Print("Akteur erstellen - Faltungsschicht ", layerNumber);
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.optimisation = ADAM;
if (!actor. Add(descr))
{
descr löschen;
return false;
}
--- Schicht 4
layerNumber++;
Print("Akteur erstellen - Faltungsschicht ", layerNumber);
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.optimisation = ADAM;
if (!actor. Add(descr))
{
descr löschen;
return false;
}
--- Schicht 5
layerNumber++;
Print("Akteur erstellen - Dichte/Basisschicht ", layerNumber);
if (!( descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 2048;
descr.optimisation = ADAM;
descr.activation = LReLU;
if (!actor. Add(descr))
{
descr löschen;
return false;
}
--- Schicht 6
layerNumber++;
Print("Akteur erstellen - Dichte/Basisschicht ", layerNumber);
if (!( descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 7
layerNumber++;
Print("Akteur erstellen - SoftMax Layer ", layerNumber);
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronSoftMaxOCL;
prev_count = descr.count = prev_count / 16;
descr.step = 16;
descr.optimisation = ADAM;
descr.activation = Keine;
if(!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 8 Mehrschichtige Multi-Head Aufmerksamkeitsschicht
SchichtNummer++;
Print("Akteur erstellen - Multilayer Multi-Head Attention Layer ", layerNumber);
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = prev_count;
descr.window = 16;
descr.window_out = 8;
descr.step = 4;
descr.layers = 3;
descr.optimisation = ADAM;
descr.activation = Keine;
if(!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 9
layerNumber++;
Print("Akteur erstellen - Ebene verketten ", layerNumber);
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConcatenate;
descr.count = LatentCount;
descr.window = prev_count;
descr.step = AccountDescr;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
if (!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 10
layerNumber++;
Print("Akteur erstellen - SoftMax Layer ", layerNumber);
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronSoftMaxOCL;
prev_count = descr.count = prev_count / 16;
descr.step = 16;
descr.optimisation = ADAM;
descr.activation = Keine;
if(!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 11 Mehrschichtige Multi-Head Aufmerksamkeitsschicht
SchichtNummer++;
Print("Akteur erstellen - Multilayer Multi-Head Attention Layer ", layerNumber);
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = prev_count;
descr.window = 16;
descr.window_out = 8;
descr.step = 4;
descr.layers = 3;
descr.optimisation = ADAM;
descr.activation = Keine;
if(!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 12
layerNumber++;
Print("Akteur erstellen - Dichte/Basisschicht ", layerNumber);
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 13
layerNumber++;
Print("Akteur erstellen - Dichte/Basisschicht ", layerNumber);
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 14
layerNumber++;
Print("Akteur erstellen - Dichte/Basisschicht ", layerNumber);
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 2 * NActions;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 15
SchichtNummer++;
Print("Akteur erstellen - VAE-Ausgabeschicht ", layerNumber);
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronVAEOCL;
descr.count = NActions;
descr.optimise = ADAM;
if (!actor.Add(descr))
{
descr löschen;
return false;
}
//--- Critic
critic.Clear();
//--- Ebene 1: Eingabeschicht
SchichtNummer++;
Print("Kritiker erstellen - Eingabeschicht ", layerNumber, ": Eingabeschicht");
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = LatentCount;
descr.activation = Keine;
descr.optimisation = ADAM;
if (!critic.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 2
layerNumber++;
Print("Kritik erstellen - Ebene verketten ", layerNumber);
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConcatenate;
descr.count = LatentCount;
descr.window = prev_count;
descr.step = NActions;
descr.optimisation = ADAM;
descr.activation = LReLU;
if (!critic.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 3
layerNumber++;
Print("Kritik erstellen - Dichte/Basisschicht ", layerNumber);
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
descr.count = LatentCount;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!critic.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 4
layerNumber++;
Print("Kritik erstellen - Dichte/Basisschicht ", layerNumber);
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
descr.count = LatentCount;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!critic.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 5
layerNumber++;
Print("Kritik erstellen - Dichte/Basisschicht ", layerNumber);
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 1;
descr.optimisation = ADAM;
descr.activation = None;
if (!critic.Add(descr))
{
descr löschen;
return false;
}
//--- Autoencoder
autoencoder.Clear();
//--- Ebene 1: Eingabeschicht
SchichtNummer++;
Print("Autoencoder erstellen - Dichte/Basisschicht ", layerNumber, ": Eingabeschicht");
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = LatentCount;
descr.activation = Keine;
descr.optimisation = ADAM;
if (!autoencoder.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 2
layerNumber++;
Print("Autoencoder erstellen - Dense/Base Layer ", layerNumber);
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = prev_count / 2;
descr.optimisation = ADAM;
descr.activation = LReLU;
if (!autoencoder.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 3
layerNumber++;
Print("Autoencoder erstellen - Dense/Base Layer ", layerNumber);
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = prev_count / 2;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!autoencoder.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 4
layerNumber++;
Print("Autoencoder erstellen - Dense/Base Layer ", layerNumber);
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = 20;
descr.count = LatentCount;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!autoencoder.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 5
layerNumber++;
Print("Autoencoder erstellen - Dense/Base Layer ", layerNumber);
if (!(descr = new CLayerDescription()))
return false;
if (!(descr.Copy(autoencoder.At(2))))
{
descr. löschen;
return false;
}
if (!autoencoder.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 6
layerNumber++;
Print("Autoencoder erstellen - Ausgabeschicht ", layerNumber);
if (!(descr = new CLayerDescription()))
return false;
if (!(descr.Copy(autoencoder.At(1))))
{
descr. löschen;
return false;
}
if (!autoencoder.Add(descr))
{
descr löschen;
return false;
}
//--- Schicht 7
layerNumber++;
Print("Erstellen des Autoencoders - Output Layer ", layerNumber);
if (!(descr = new CLayerDescription()))
return false;
if (!(descr.Copy(autoencoder.At(0))))
{
descr. löschen;
return false;
}
if (!autoencoder.Add(descr))
{
descr löschen;
return false;
}
//--- Intelligente Druckanweisung für die Fehlersuche
Print("Ebenenbeschreibungen erfolgreich erstellt!");
return true;
}

 
Hallo, der Research schafft es wieder nicht, in den grünen Bereich zu kommen . Negativer MinProfit hilft nicht. Ich habe den Wert auf -10000 gebracht. Generell ist es seltsam. Wenn die Anfangswerte der Parameter zufällig gewählt werden, dann sollten zumindest einige von ihnen zu einem Plus geführt haben. Aber das ist nicht einmal annähernd zu beobachten.
 

Hallo zusammen. Ich habe diese Version nach etwa 3-4 Zyklen (Datenbank Sammlung - Training - Test) begann, nur eine gerade Linie auf Tests geben. Die Deals öffnen sich nicht. Training hat alle Zeiten 500 000 Iterationen. Ein weiterer interessanter Punkt - zu einem bestimmten Zeitpunkt der Fehler von einem der Kritiker wurde sehr groß, und dann allmählich die Fehler der beiden Kritiker sank auf 0. Und für 2-3 Zyklen die Fehler der beiden Kritiker sind bei 0. Und auf die Tests Test.mqh gibt eine gerade Linie und keine Geschäfte. In Research.mqh gibt es Durchgänge mit negativem Gewinn und Abschlüssen. Es gibt auch Durchgänge ohne Abschlüsse und mit einem Ergebnis von Null. In einem der Zyklen gab es nur 5 Durchgänge mit einem positiven Ergebnis.

Im Allgemeinen ist das seltsam. Ich habe strikt nach Dmitrys Anweisungen in allen Artikeln trainiert, und ich war nicht in der Lage, ein Ergebnis aus irgendeinem Artikel zu erhalten. Ich verstehe nicht, was ich falsch mache....

 
MetaQuotes:

Der neue Artikel Neuronale Netze leicht gemacht (Teil 51): Behavioral Actor-Criticism (BAC) wurde veröffentlicht:

Autor: Dmitriy Gizlyk

Ich habe den gezippten Ordner heruntergeladen, aber es waren viele andere Ordner darin.

Wenn möglich, möchte ich, dass Sie mir erklären, wie ich das Programm einsetze und trainiere.

Herzlichen Glückwunsch zu einer großartigen Arbeit!

Herzlichen Dank!