Руководство по программированию для создания агента с процедурной памятью, который учится, сохраняет, извлекает и повторно использует навыки в виде нейронных модулей с течением времени

В этом руководстве мы рассмотрим, как интеллектуальный агент может постепенно формировать процедурную память, обучаясь навыкам повторного использования непосредственно в процессе взаимодействия с окружающей средой. Мы разрабатываем минимальную, но мощную структуру, в которой навыки ведут себя как нейронные модули: они хранят последовательности действий, несут контекстуальные вложения и извлекаются по сходству, когда новая ситуация напоминает опыт.

Основные классы и их функции

1. Класс `Skill`:
— Представляет навык, который может быть использован агентом.
— Содержит имя навыка, предварительные условия, последовательность действий, вложение и количество успешных применений.

2. Класс `SkillLibrary`:
— Хранит коллекцию навыков.
— Предоставляет методы для добавления новых навыков и извлечения подходящих навыков на основе состояния среды.

3. Класс `GridWorld`:
— Представляет простую среду, в которой агент учится выполнять задачи.
— Содержит методы для сброса состояния среды, получения состояния и выполнения действий.

4. Класс `ProceduralMemoryAgent`:
— Управляет обучением и использованием навыков агентом.
— Содержит методы для создания вложений, извлечения навыков и выполнения навыков.

Пример кода

«`python
import numpy as np
import matplotlib.pyplot as plt
from collections import defaultdict

class Skill:
def init(self, name, preconditions, actionsequence, embedding, successcount=0):
self.name = name
self.preconditions = preconditions
self.actionsequence = actionsequence
self.embedding = embedding
self.successcount = successcount
self.times_used = 0

def is_applicable(self, state):
for key, value in self.preconditions.items():
if state.get(key) != value:
return False
return True

def repr(self):
return f»Skill({self.name}, used={self.timesused}, success={self.successcount})»

class SkillLibrary:
def init(self, embedding_dim=8):
self.skills = []
self.embeddingdim = embeddingdim
self.skill_stats = defaultdict(lambda: {«attempts»: 0, «successes»: 0})

def add_skill(self, skill):
for existing_skill in self.skills:
if self.similarity(skill.embedding, existingskill.embedding) > 0.9:
existingskill.successcount += 1
return existing_skill
self.skills.append(skill)
return skill

def retrieveskills(self, state, queryembedding=None, top_k=3):
applicable = [s for s in self.skills if s.is_applicable(state)]
if query_embedding is not None and applicable:
similarities = [self.similarity(queryembedding, s.embedding) for s in applicable]
sortedskills = [s for , s in sorted(zip(similarities, applicable), reverse=True)]
return sortedskills[:topk]
return sorted(applicable, key=lambda s: s.successcount / max(s.timesused, 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.skills),
«totaluses»: sum(s.timesused for s in self.skills),
«avgsuccessrate»: np.mean([s.successcount / max(s.timesused, 1) for s in self.skills]) if self.skills else 0
}
«`

Заключение

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

Понимая, как даже небольшая среда и простые эвристики приводят к значимой динамике обучения, мы получаем конкретное представление о том, что значит для агента развивать внутренние компетенции, которые можно использовать повторно с течением времени.

1. Какие основные классы используются для создания агента с процедурной памятью и какие функции они выполняют?

В статье описаны четыре основных класса:
* `Skill` — представляет навык, который может быть использован агентом. Содержит имя навыка, предварительные условия, последовательность действий, вложение и количество успешных применений.
* `SkillLibrary` — хранит коллекцию навыков и предоставляет методы для добавления новых навыков и извлечения подходящих навыков на основе состояния среды.
* `GridWorld` — представляет простую среду, в которой агент учится выполнять задачи. Содержит методы для сброса состояния среды, получения состояния и выполнения действий.
* `ProceduralMemoryAgent` — управляет обучением и использованием навыков агентом. Содержит методы для создания вложений, извлечения навыков и выполнения навыков.

2. Какие методы используются для извлечения навыков из библиотеки навыков (`SkillLibrary`)? Какие параметры влияют на этот процесс?

Для извлечения навыков из библиотеки используется метод `retrieveskills`. Этот метод принимает состояние среды и опциональные параметры `queryembedding` и `topk`. `queryembedding` — это вектор, который используется для поиска наиболее похожих навыков в библиотеке. `top_k` определяет количество навыков, которые будут возвращены.

3. Как в системе обеспечивается выбор наиболее подходящего навыка для текущей ситуации?

Выбор наиболее подходящего навыка осуществляется через метод `retrieveskills` класса `SkillLibrary`. Этот метод сначала фильтрует навыки, которые применимы к текущему состоянию среды. Затем, если задан `queryembedding`, он вычисляет сходство между этим вектором и вложениями применимых навыков. Навыки сортируются по убыванию сходства, и первые `topk` навыков возвращаются. Если `queryembedding` не задан, навыки сортируются по количеству успешных применений.

4. Какие механизмы используются для предотвращения дублирования навыков в библиотеке (`SkillLibrary`)? Как система определяет, что новый навык уже существует в библиотеке?

Для предотвращения дублирования навыков используется метод `add_skill` класса `SkillLibrary`. Этот метод проверяет, есть ли уже в библиотеке навык, который имеет сходство с новым навыком, превышающее заданный порог (в примере это 0,9). Если такой навык найден, его счётчик успешных применений увеличивается, и новый навык не добавляется. Если подходящего навыка не найдено, новый навык добавляется в библиотеку.

5. Какие метрики используются для оценки эффективности системы обучения агента?

В статье не указаны конкретные метрики для оценки эффективности системы обучения агента. Однако упоминается, что можно получить статистику о количестве навыков, их использовании и среднем уровне успешности через метод `get_stats` класса `SkillLibrary`. Это может включать общее количество навыков, общее количество использований и средний уровень успешности навыков.

Источник