Значение итерации не изучает ничего полезного

В настоящее время я пытаюсь выучить оптимальную политику для создания спортивной среды Open AI "Pendulum-v0".
Я знаю, что существуют более подходящие методы для непрерывных доменов, но мы делаем несколько исторический курс об обучении подкреплению. Организаторы предоставили нам вывод среды маятника, которая возвращает (текущий угол [в радианах], угловую скорость) вместо стандартного вывода 3dim (cos, sin, скорость).
Сначала я выполняю регрессию, чтобы узнать функцию перехода состояний и функцию вознаграждения.
После этого я выполняю итерацию значения со следующим кодом:

def value_iteration(regressorState, regressorReward, disc, theta, gamma):

    value_function = np.zeros(shape=disc.state_space_size)
    policy = np.zeros(shape=disc.state_space_size)

    delta = theta

    while_loop_num = 0

    while delta >= theta:

        delta = 0

        while_loop_num += 1

        # Iterate over discrete state space
        for j, s0 in enumerate(disc.state_space[0]):
            for s1 in disc.state_space[1]:

                index = disc.map_to_index([s0, s1])

                v = value_function[index[0], index[1]]

                # Iterate over all actions to get action maximizing expected reward
                amax = 2
                rmax = -100

                for a in disc.action_space:
                    # Get sufficient state and reward from regressors
                    x = np.array([s0, s1, a])
                    x = x.reshape(1, -1)
                    next_s = regressorState.predict(x).T.reshape(-1, )
                    r = regressorReward.predict(x)

                    # Discretize sufficient state
                    next_index = disc.map_to_index([next_s[0], next_s[1]])

                    # Calculate expected reward
                    # Deterministic case; we do not need probability distribution
                    expected_reward = r + gamma * value_function[next_index[0], next_index[1]]

                    if rmax < expected_reward:
                        amax = a
                        rmax = expected_reward

                # Define value function by maximum expected reward per state
                value_function[index[0], index[1]] = rmax

                # Define policy by action achieving maximum expected reward per state
                policy[index[0], index[1]] = amax

                # Update delta
                delta = max(delta, np.abs(v - value_function[index[0], index[1]]))
                print("Delta: ", delta)


    return value_function, policy

Дискретизирующий "диск" имеет 2-мерное дискретное пространство состояний и отображает непрерывные значения в индекс ближайшего дискретного значения. Этот индекс используется для оценки политики и функции стоимости.
После запуска алгоритма dp мы оцениваем производительность, рисуя действия из политики в нескольких эпизодах и возвращая совокупное вознаграждение, усредненное по эпизодам.
Но агент пока не учит ничего полезного. Совокупная награда постоянно снижается (0 - лучшая награда в env.), И рендеринг env. показывает, что маятник не контролируется должным образом (постоянно вращается или качается, вместо того, чтобы удерживать маятник вверх). Иногда функция значения даже не конвертируется (дельта не уменьшается).
Я имею в виду несколько вещей, которые могут быть причиной:

  • действия выполняются случайным образом на этапе регрессии и поэтому редко достигают очень хороших состояний
  • вместо эквидистантных дискретных состояний я должен использовать гауссовскую дискретизацию вокруг оптимума (я уже пробовал, ничего не менял)
  • гиперпараметры: скорость обучения (гамма), функция минимального значения расстояния (тета), формы пространства состояний или пространства действия

Может быть, вы можете увидеть некоторые недостатки моей идеи или кода. Некоторые советы будут очень признательны. Ура!

(Если вы хотите, я могу добавить больше моего кода)

0 ответов

Другие вопросы по тегам