Я новичок в области изучения армирования, и мне может понадобиться помощь.
Я попытался реализовать свою собственную очень простую среду роботов. Разница в том, что я хочу использовать в качестве наблюдения угол одной оси 6 вместо декартовых координат TCP. Таким образом, пространство наблюдения складывается в вектор из 13 элементов. Первые 6: текущие значения оси, следующие 6: целевое значение, а последнее - оценка текущего состояния. Я подсчитываю эту «оценку» каждого действия с вычитанием фактической позиции и целевой позиции. Затем я беру сумму по абсолютным значениям и делю ее на шесть. При этом я получаю от 0 до 100 баллов за каждый шаг, сделанный актером. Если текущий шаг хороший (счет> счет, старый), я награждаю +1, если не -2. За попадание в цель актер получает бонус 200, в то время как
Мое пространство действий состоит из непрерывного angular движения оси 6.
Я использую открытый базовый уровень PPO2 ИИ в качестве алгоритма подкрепления, чтобы проверить свои способности. Окружающая среда. (https://stable-baselines.readthedocs.io/en/master/modules/ppo2.html)
В качестве первой попытки я пытаюсь попасть в одну точку. Поэтому я сбрасываю целевое значение на конкретную c точку после каждого эпизода. Для первого измерения я взял только одного рабочего, и кривая обучения выглядит очень хорошо (см. График: оранжевый). Затем я сложил рабочих до 12 и в моем воображении должен быть такой же результат, но быстрее ?! Я был немного разочарован результатом и не знаю, почему результат такой плохой (см. График: синий).
график наград за эпизод
Для векторизации В моей среде я использую функцию, аналогичную make_vec_env из stable_baselines.common
def make_MY_vec_env(envCallback, n_envs=1, accuracy=100, seed=None, start_index=0,
monitor_dir=None, wrapper_class=None,
env_kwargs=None, vec_env_cls=None, vec_env_kwargs=None,name=""):
"""
Based on stabel_baselines/common/cmd_util.py
"""
env_kwargs = {} if env_kwargs is None else env_kwargs
vec_env_kwargs = {} if vec_env_kwargs is None else vec_env_kwargs
def make_env(rank):
def _init():
env = envCallback(accuracy,name=name)
# Wrap the env in a Monitor wrapper
# to have additional training information
monitor_path = os.path.join(monitor_dir, str(rank)) if monitor_dir is not None else None
# Create the monitor folder if needed
if monitor_path is not None:
os.makedirs(monitor_dir, exist_ok=True)
env = Monitor(env, filename=monitor_path)
# Optionally, wrap the environment with the provided wrapper
if wrapper_class is not None:
env = wrapper_class(env)
return env
return _init
# No custom VecEnv is passed
if vec_env_cls is None:
# Default: use a DummyVecEnv
vec_env_cls = DummyVecEnv
return vec_env_cls([make_env(i + start_index) for i in range(n_envs)], **vec_env_kwargs)
Исходная функция использует идентификатор среды вместо функции обратного вызова. Это код, который я заменил на строку:
env = envCallback (precision, name = name).
if isinstance(env_id, str):
env = gym.make(env_id)
if len(env_kwargs) > 0:
warnings.warn("No environment class was passed (only an env ID) so `env_kwargs` will be ignored")
else:
env = env_id(**env_kwargs)
if seed is not None:
env.seed(seed + rank)
env.action_space.seed(seed + rank)
Я не использую семена в данный момент, потому что в примере с базовым уровнем PPO2 они также не используются. У кого-нибудь есть идеи, почему моя векторизованная среда так плохо обучается?