Neuronale Netzwerkarchitektur zur Implementierung des RL-Algorithmus mit der Fähigkeit, gleichzeitig laufende Aktionen festzulegen

Eines der klassischen neuronalen Netzwerkschemata zum Implementieren des RL-Algorithmus ist wie folgt:


Wobei: Eingaben - Eingaben in das neuronale Netzwerk; FC - (vollständig verbundene) Hidden-Layer-Architektur oder CNN - FC - Architecture-Hidden-Layer-Architektur (abhängig davon, was den Eingängen zugeführt wird); Ausgänge - Netzwerkausgänge. Netzwerkausgaben sind häufig eine Softmax-Schicht, die die Wahrscheinlichkeit einer der Aktionen aus der Menge aller möglichen Aktionen angibt.

Der Nachteil dieser Architektur besteht darin, dass es schwierig ist, die Auswahl mehrerer gleichzeitig ausgeführter Aktionen zu implementieren.

Um dieses Problem zu lösen, wird eine Architektur mit einer Maskenschicht vorgeschlagen. Die vorgeschlagene Architektur lautet wie folgt:


Diese Architektur stimmt vollständig mit der klassischen Architektur überein, enthält jedoch auch eine Aktionsmaskenschicht. Es gibt nur einen Ausweg aus dieser Architektur - dies ist der Wert des Werts der Aktion (eine Gruppe gleichzeitig ausgeführter Aktionen). Die Aktionsmaskenschicht kann gemäß dem folgenden Pseudocode implementiert werden:

import numpy as np class Layer: def __init__(self, items, item_size, extra_size): assert(items > 0) assert(item_size > 0) assert(extra_size >= 0) self.items = items self.item_size = item_size self.extra_size = extra_size def build(self): self._expand_op = np.zeros((self.items, self.items*self.item_size), \ dtype=np.float32) for i in range(self.items): self._expand_op[i,i*self.item_size:(i+1)*self.item_size] = np.float32(1.0) def call(self, inputs, ops): op_mask_part = inputs[:self.items*self.item_size] if self.extra_size > 0: ext_part = inputs[self.items*self.item_size:] else: ext_part = None # if ops in [-0.5, 0.5] or [-0.5 .. 0.5]: ops1 = np.add(ops, np.float(0.5)) # optional extended_op = np.matmul(ops1, self._expand_op) if self.extra_size > 0: return np.concatenate((np.multiply(op_mask_part, extended_op), ext_part)) else: return np.multiply(op_mask_part,extended_op) 

Die Verwendung dieses Codes zeigt das folgende Codefragment:

 items = 5 item_size = 10 extra_size = 20 l = Layer(items=items, item_size=item_size, extra_size=extra_size) l.build() inputs = np.random.rand(items*item_size+extra_size) ops = np.random.randint(0, 2, (items,), dtype="int") ops = ops.astype(dtype=np.float32) - np.float32(0.5) result = l.call(inputs,ops) 

Aus dem Schichtcode ist ersichtlich, dass das neuronale Netzwerk für jede Aktion lernt, eine Darstellung der Aktion in Form einer Reihe von Gewichten zu bilden. Und diese Darstellungen gehen entweder nach der Maskenschicht ins Netzwerk oder nicht. Abhängig von der Operation können diese Gewichte mit der Aufgabe einer Operation für die gesamte Gruppe von Aktionsgewichten erfolgen (nicht nur Multiplikation mit [0,1]). Somit wird die Aufgabe von Aktionen gebildet, um den Wert der Gruppe von Aktionen zu berechnen, die vom Netzwerk ausgeführt werden. (Im klassischen Fall berechnete die Softmax-Schicht den Wert aller Aktionen. In der vorgeschlagenen Architektur berechnet das neuronale Netzwerk den Wert einer Gruppe ausgewählter Aktionen.)

(Für eine Definition des Werts einer Aktion siehe beispielsweise R. S. Sutton, E. G. Barto Reinforced Learning.)

Beispiele für die Verwendung der vorgeschlagenen Architektur


Tetris-Spiel


Die Idee, diese Architektur zum Spielen von Tetris zu verwenden, ist wie folgt. An den Eingängen senden wir das Bild des Glases des Tetris-Spiels (ein Pixel ein Quadrat). Wir gruppieren einzelne Aktionen in Aktionsgruppen. Die Bewertung einer Aktion für ein neuronales Netzwerk ist eine Maske der Endposition einer Figur in einem Glas. Die Figur wird durch ihre Quadrate in der Aktionsmaske in der Schicht der Aktionsmaske im neuronalen Netzwerk festgelegt. Um eine Gruppe von Aktionen auszuwählen, wählen wir die maximale Bewertung der Aktion (Beenden) aus der Liste aller Endpositionen der aktuellen Figur aus.


Zeichnen. Das Feld (blaue Zellen) und die fallende Form (hellgraue Zellen) werden angezeigt. Die endgültige Position der Figur sind alle möglichen Positionen, von denen sich die Figur gemäß den Spielregeln (nicht gezeigt) nicht bewegen kann.

Agent, der die Bewegung eines Autos simuliert


In diesem Fall wurden jede Beschleunigungsaktion (mehrere Beschleunigungsbeschleunigungen), Bremsen (mehrere mögliche Beschleunigungen beim Bremsen) sowie mehrere Rotationsgrade als Elementaraktionen modelliert. Es versteht sich, dass gleichzeitig eine Rotation und eine der Beschleunigungen beteiligt sein können oder nur eine Rotationsaktion oder eine Beschleunigungsaktion. In diesem Fall können Sie in der Architektur mehrere Elementaraktionen gleichzeitig angeben, um eine komplexe Aktion zu bilden.


Zeichnen. Neben dem Feld zur Durchführung von Aktionen des Automodells (auf dem das Parkziel durch rote und grüne Linien angegeben ist) werden auch die Eingaben des neuronalen Netzes (unten) und die Werte der Bewertung von Aktionen für alle möglichen Aktionen in diesem Zustand des Modells angezeigt.

Andere mögliche Anwendungen der Architektur


In ähnlicher Weise kann bei Verwendung von Tetris in einem Spiel die Architektur für andere Spiele verwendet werden, bei denen eine Reihe von Figuren und mehrere Aktionen gleichzeitig auf dem Spielfeld festgelegt werden können (z. B. Bewegen auf dem Spielfeld).

In der Robotik kann diese Architektur als Metanetzwerk dienen, das einzelne Strukturelemente zu einem gemeinsamen Ensemble koordiniert.

Mit dieser Architektur können Sie auch das Transferlernen verwenden, um den CNN-Teil vorab zu trainieren, und umgekehrt zu Beginn, um den RL-Teil des neuronalen Netzwerks zu trainieren und dann den CNN-Teil im bereits trainierten RL-Netzwerk anhand von Modelldaten zu trainieren. In dem Beispiel wurde beim Programmieren des Tetris-Spiels das Transferlernen mit Training am Anfang des CNN-Teils und des FC-Teils auf die Aktionsmaskenschicht angewendet (was auf das resultierende Netzwerk übertragen wird). Bei dem Parkproblem plane ich auch, nach dem Erlernen des RL-Teils (dh der ersten Kirsche) ein CNN-Training anzuwenden.

→ Beispiele für Programmquellcodes finden Sie hier

Source: https://habr.com/ru/post/de454916/


All Articles