In diesem Tutorial untersuchen wir, wie ein intelligenter Agent schrittweise ein prozedurales Gedächtnis aufbauen kann, indem er wiederverwendbare Fähigkeiten direkt aus seinen Interaktionen mit einer Umgebung erlernt. Wir entwerfen ein minimales, aber leistungsstarkes Framework, in dem sich Fähigkeiten wie neuronale Module verhalten: Sie speichern Aktionssequenzen, tragen kontextuelle Einbettungen und werden durch Ähnlichkeit abgerufen, wenn eine neue Scenario einer Erfahrung ähnelt. Während wir unseren Agenten durch mehrere Episoden führen, beobachten wir, wie sein Verhalten effizienter wird und von der primitiven Erkundung zur Nutzung einer Bibliothek von Fähigkeiten übergeht, die er selbstständig erlernt hat. Schauen Sie sich das an VOLLSTÄNDIGE CODES hier.

import numpy as np
import matplotlib.pyplot as plt
from collections import defaultdict


class Talent:
   def __init__(self, title, preconditions, action_sequence, embedding, success_count=0):
       self.title = title
       self.preconditions = preconditions
       self.action_sequence = action_sequence
       self.embedding = embedding
       self.success_count = success_count
       self.times_used = 0
  
   def is_applicable(self, state):
       for key, worth in self.preconditions.gadgets():
           if state.get(key) != worth:
               return False
       return True
  
   def __repr__(self):
       return f"Talent({self.title}, used={self.times_used}, success={self.success_count})"


class SkillLibrary:
   def __init__(self, embedding_dim=8):
       self.abilities = ()
       self.embedding_dim = embedding_dim
       self.skill_stats = defaultdict(lambda: {"makes an attempt": 0, "successes": 0})
  
   def add_skill(self, ability):
       for existing_skill in self.abilities:
           if self._similarity(ability.embedding, existing_skill.embedding) > 0.9:
               existing_skill.success_count += 1
               return existing_skill
       self.abilities.append(ability)
       return ability
  
   def retrieve_skills(self, state, query_embedding=None, top_k=3):
       relevant = (s for s in self.abilities if s.is_applicable(state))
       if query_embedding shouldn't be None and relevant:
           similarities = (self._similarity(query_embedding, s.embedding) for s in relevant)
           sorted_skills = (s for _, s in sorted(zip(similarities, relevant), reverse=True))
           return sorted_skills(:top_k)
       return sorted(relevant, key=lambda s: s.success_count / max(s.times_used, 1), reverse=True)(:top_k)
  
   def _similarity(self, emb1, emb2):
       return np.dot(emb1, emb2) / (np.linalg.norm(emb1) * np.linalg.norm(emb2) + 1e-8)
  
   def get_stats(self):
       return {
           "total_skills": len(self.abilities),
           "total_uses": sum(s.times_used for s in self.abilities),
           "avg_success_rate": np.imply((s.success_count / max(s.times_used, 1) for s in self.abilities)) if self.abilities else 0
       }

Wir definieren, wie Fähigkeiten in einer Gedächtnisstruktur dargestellt und gespeichert werden. Wir implementieren einen auf Ähnlichkeit basierenden Abruf, damit der Agent mithilfe der Kosinusähnlichkeit einen neuen Zustand mit früheren Fähigkeiten abgleichen kann. Während wir diese Ebene durcharbeiten, sehen wir, wie die Wiederverwendung von Fertigkeiten möglich wird, sobald Fertigkeiten Metadaten, Einbettungen und Nutzungsstatistiken erwerben. Schauen Sie sich das an VOLLSTÄNDIGE CODES hier.

class GridWorld:
   def __init__(self, dimension=5):
       self.dimension = dimension
       self.reset()
  
   def reset(self):
       self.agent_pos = (0, 0)
       self.goal_pos = (self.size-1, self.size-1)
       self.objects = {"key": (2, 2), "door": (3, 3), "field": (1, 3)}
       self.stock = ()
       self.door_open = False
       return self.get_state()
  
   def get_state(self):
       return {
           "agent_pos": tuple(self.agent_pos),
           "has_key": "key" in self.stock,
           "door_open": self.door_open,
           "at_goal": self.agent_pos == self.goal_pos,
           "objects": {ok: tuple(v) for ok, v in self.objects.gadgets()}
       }
  
   def step(self, motion):
       reward = -0.1
       if motion == "move_up":
           self.agent_pos(1) = min(self.agent_pos(1) + 1, self.dimension - 1)
       elif motion == "move_down":
           self.agent_pos(1) = max(self.agent_pos(1) - 1, 0)
       elif motion == "move_left":
           self.agent_pos(0) = max(self.agent_pos(0) - 1, 0)
       elif motion == "move_right":
           self.agent_pos(0) = min(self.agent_pos(0) + 1, self.dimension - 1)
       elif motion == "pickup_key":
           if self.agent_pos == self.objects("key") and "key" not in self.stock:
               self.stock.append("key")
               reward = 1.0
       elif motion == "open_door":
           if self.agent_pos == self.objects("door") and "key" in self.stock:
               self.door_open = True
               reward = 2.0
       performed = self.agent_pos == self.goal_pos and self.door_open
       if performed:
           reward = 10.0
       return self.get_state(), reward, performed

Wir konstruieren eine einfache Umgebung, in der der Agent Aufgaben wie das Aufheben eines Schlüssels, das Öffnen einer Tür und das Erreichen eines Ziels lernt. Wir nutzen diese Umgebung als Spielplatz für unser prozedurales Gedächtnissystem und können so beobachten, wie sich primitive Handlungen zu komplexeren, wiederverwendbaren Fähigkeiten entwickeln. Die Struktur der Umgebung hilft uns, klare, interpretierbare Verhaltensverbesserungen über Episoden hinweg zu beobachten. Schauen Sie sich das an VOLLSTÄNDIGE CODES hier.

class ProceduralMemoryAgent:
   def __init__(self, env, embedding_dim=8):
       self.env = env
       self.skill_library = SkillLibrary(embedding_dim)
       self.embedding_dim = embedding_dim
       self.episode_history = ()
       self.primitive_actions = ("move_up", "move_down", "move_left", "move_right", "pickup_key", "open_door")
  
   def create_embedding(self, state, action_seq):
       state_vec = np.zeros(self.embedding_dim)
       state_vec(0) = hash(str(state("agent_pos"))) % 1000 / 1000
       state_vec(1) = 1.0 if state.get("has_key") else 0.0
       state_vec(2) = 1.0 if state.get("door_open") else 0.0
       for i, motion in enumerate(action_seq(:self.embedding_dim-3)):
           state_vec(3+i) = hash(motion) % 1000 / 1000
       return state_vec / (np.linalg.norm(state_vec) + 1e-8)
  
   def extract_skill(self, trajectory):
       if len(trajectory) < 2:
           return None
       start_state = trajectory(0)(0)
       actions = (a for _, a, _ in trajectory)
       preconditions = {"has_key": start_state.get("has_key", False), "door_open": start_state.get("door_open", False)}
       end_state = self.env.get_state()
       if end_state.get("has_key") and never start_state.get("has_key"):
           title = "acquire_key"
       elif end_state.get("door_open") and never start_state.get("door_open"):
           title = "open_door_sequence"
       else:
           title = f"navigate_{len(actions)}_steps"
       embedding = self.create_embedding(start_state, actions)
       return Talent(title, preconditions, actions, embedding, success_count=1)
  
   def execute_skill(self, ability):
       ability.times_used += 1
       trajectory = ()
       total_reward = 0
       for motion in ability.action_sequence:
           state = self.env.get_state()
           next_state, reward, performed = self.env.step(motion)
           trajectory.append((state, motion, reward))
           total_reward += reward
           if performed:
               ability.success_count += 1
               return trajectory, total_reward, True
       return trajectory, total_reward, False
  
   def discover(self, max_steps=20):
       trajectory = ()
       state = self.env.get_state()
       for _ in vary(max_steps):
           motion = self._choose_exploration_action(state)
           next_state, reward, performed = self.env.step(motion)
           trajectory.append((state, motion, reward))
           state = next_state
           if performed:
               return trajectory, True
       return trajectory, False

Wir konzentrieren uns auf die Erstellung von Einbettungen, die den Kontext einer Zustands-Aktionssequenz kodieren und es uns ermöglichen, Fähigkeiten sinnvoll zu vergleichen. Wir extrahieren auch Fähigkeiten aus erfolgreichen Entwicklungen und wandeln rohe Erfahrungen in wiederverwendbare Verhaltensweisen um. Während wir diesen Code ausführen, beobachten wir, wie durch einfache Erkundung nach und nach strukturiertes Wissen entsteht, das der Agent später anwenden kann. Schauen Sie sich das an VOLLSTÄNDIGE CODES hier.

   def _choose_exploration_action(self, state):
       agent_pos = state("agent_pos")
       if not state.get("has_key"):
           key_pos = state("objects")("key")
           if agent_pos == key_pos:
               return "pickup_key"
           if agent_pos(0) < key_pos(0):
               return "move_right"
           if agent_pos(0) > key_pos(0):
               return "move_left"
           if agent_pos(1) < key_pos(1):
               return "move_up"
           return "move_down"
       if state.get("has_key") and never state.get("door_open"):
           door_pos = state("objects")("door")
           if agent_pos == door_pos:
               return "open_door"
           if agent_pos(0) < door_pos(0):
               return "move_right"
           if agent_pos(0) > door_pos(0):
               return "move_left"
           if agent_pos(1) < door_pos(1):
               return "move_up"
           return "move_down"
       goal_pos = (4, 4)
       if agent_pos(0) < goal_pos(0):
           return "move_right"
       if agent_pos(1) < goal_pos(1):
           return "move_up"
       return np.random.alternative(self.primitive_actions)
  
   def run_episode(self, use_skills=True):
       self.env.reset()
       total_reward = 0
       steps = 0
       trajectory = ()
       whereas steps < 50:
           state = self.env.get_state()
           if use_skills and self.skill_library.abilities:
               query_emb = self.create_embedding(state, ())
               abilities = self.skill_library.retrieve_skills(state, query_emb, top_k=1)
               if abilities:
                   skill_traj, skill_reward, success = self.execute_skill(abilities(0))
                   trajectory.lengthen(skill_traj)
                   total_reward += skill_reward
                   steps += len(skill_traj)
                   if success:
                       return trajectory, total_reward, steps, True
                   proceed
           motion = self._choose_exploration_action(state)
           next_state, reward, performed = self.env.step(motion)
           trajectory.append((state, motion, reward))
           total_reward += reward
           steps += 1
           if performed:
               return trajectory, total_reward, steps, True
       return trajectory, total_reward, steps, False
  
   def prepare(self, episodes=10):
       stats = {"rewards": (), "steps": (), "skills_learned": (), "skill_uses": ()}
       for ep in vary(episodes):
           trajectory, reward, steps, success = self.run_episode(use_skills=True)
           if success and len(trajectory) >= 3:
               phase = trajectory(-min(5, len(trajectory)):)
               ability = self.extract_skill(phase)
               if ability:
                   self.skill_library.add_skill(ability)
           stats("rewards").append(reward)
           stats("steps").append(steps)
           stats("skills_learned").append(len(self.skill_library.abilities))
           stats("skill_uses").append(self.skill_library.get_stats()("total_uses"))
           print(f"Episode {ep+1}: Reward={reward:.1f}, Steps={steps}, Expertise={len(self.skill_library.abilities)}, Success={success}")
       return stats

Wir definieren, wie der Agent zwischen der Nutzung bekannter Fähigkeiten und der Erkundung mit primitiven Aktionen wählt. Wir schulen den Agenten über mehrere Episoden hinweg und zeichnen die Entwicklung der erlernten Fähigkeiten, Nutzungszahlen und Erfolgsquoten auf. Bei der Untersuchung dieses Teils stellen wir fest, dass die Wiederverwendung von Fertigkeiten die Episodenlänge verkürzt und die Gesamtbelohnungen verbessert. Schauen Sie sich das an VOLLSTÄNDIGE CODES hier.

def visualize_training(stats):
   fig, axes = plt.subplots(2, 2, figsize=(12, 8))
   axes(0, 0).plot(stats("rewards"))
   axes(0, 0).set_title("Episode Rewards")
   axes(0, 1).plot(stats("steps"))
   axes(0, 1).set_title("Steps per Episode")
   axes(1, 0).plot(stats("skills_learned"))
   axes(1, 0).set_title("Expertise in Library")
   axes(1, 1).plot(stats("skill_uses"))
   axes(1, 1).set_title("Cumulative Talent Makes use of")
   plt.tight_layout()
   plt.savefig("skill_learning_stats.png", dpi=150, bbox_inches="tight")
   plt.present()


if __name__ == "__main__":
   print("=== Procedural Reminiscence Agent Demo ===n")
   env = GridWorld(dimension=5)
   agent = ProceduralMemoryAgent(env)
   print("Coaching agent to be taught reusable abilities...n")
   stats = agent.prepare(episodes=15)
   print("n=== Realized Expertise ===")
   for ability in agent.skill_library.abilities:
       print(f"{ability.title}: {len(ability.action_sequence)} actions, used {ability.times_used} instances, {ability.success_count} successes")
   lib_stats = agent.skill_library.get_stats()
   print(f"n=== Library Statistics ===")
   print(f"Whole abilities: {lib_stats('total_skills')}")
   print(f"Whole ability makes use of: {lib_stats('total_uses')}")
   print(f"Avg success fee: {lib_stats('avg_success_rate'):.2%}")
   visualize_training(stats)
   print("n✓ Talent studying full! Examine the visualization above.")

Wir bringen alles zusammen, indem wir Schulungen durchführen, erlernte Fertigkeiten ausdrucken und Verhaltensstatistiken erstellen. Wir visualisieren den Development bei den Belohnungen und wie die Fertigkeitsbibliothek im Laufe der Zeit wächst. Indem wir dieses Snippet ausführen, schließen wir den Lebenszyklus der prozeduralen Gedächtnisbildung ab und bestätigen, dass der Agent lernt, sich mit Erfahrung intelligenter zu verhalten.

Zusammenfassend sehen wir, wie das prozedurale Gedächtnis auf natürliche Weise entsteht, wenn ein Agent lernt, Fähigkeiten aus seinen eigenen erfolgreichen Trajektorien zu extrahieren. Wir beobachten, wie Fähigkeiten erworben werden, Struktur, Metadaten, Einbettungen und Nutzungsmuster, damit der Agent sie in zukünftigen Situationen effizient wiederverwenden kann. Schließlich wissen wir zu schätzen, dass selbst eine kleine Umgebung und einfache Heuristiken zu sinnvollen Lerndynamiken führen und uns ein konkretes Verständnis dafür vermitteln, was es für einen Agenten bedeutet, im Laufe der Zeit wiederverwendbare interne Kompetenzen zu entwickeln.


Schauen Sie sich das an VOLLSTÄNDIGE CODES hier. Schauen Sie sich gerne bei uns um GitHub-Seite für Tutorials, Codes und Notebooks. Sie können uns auch gerne weiter folgen Twitter und vergessen Sie nicht, bei uns mitzumachen 100.000+ ML SubReddit und Abonnieren Unser Publication. Warten! Bist du im Telegram? Jetzt können Sie uns auch per Telegram kontaktieren.


Asif Razzaq ist CEO von Marktechpost Media Inc.. Als visionärer Unternehmer und Ingenieur setzt sich Asif dafür ein, das Potenzial der künstlichen Intelligenz für das soziale Wohl zu nutzen. Sein jüngstes Unterfangen ist die Einführung einer Medienplattform für künstliche Intelligenz, Marktechpost, die sich durch eine ausführliche Berichterstattung über maschinelles Lernen und Deep-Studying-Nachrichten auszeichnet, die sowohl technisch fundiert als auch für ein breites Publikum leicht verständlich ist. Die Plattform verfügt über mehr als 2 Millionen monatliche Aufrufe, was ihre Beliebtheit beim Publikum verdeutlicht.

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert