Простая среда обучения с подкреплением с использованием PPO и нескольких рабочих - PullRequest
0 голосов
/ 16 июня 2020

Я новичок в области изучения армирования, и мне может понадобиться помощь.

Я попытался реализовать свою собственную очень простую среду роботов. Разница в том, что я хочу использовать в качестве наблюдения угол одной оси 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 они также не используются. У кого-нибудь есть идеи, почему моя векторизованная среда так плохо обучается?

...