Как вычислить переменную температуры в исследовании с использованием softmax (болцмановского) метода.

Вопрос или проблема

Привет, я разрабатываю агента обучения с подкреплением для непрерывного пространства состояний/дискретного пространства действий. Я пытаюсь использовать метод болцманна/софтмакс в качестве стратегии выбора действий. Мое пространство действий имеет размер 5000.

Моя реализация болцмановского исследования:

def get_action(state,episode,temperature = 1):
    state_encod = np.reshape(state, [1, state_size])
    q_values = model.predict(state_encod)         
    prob_act = np.empty(len(q_values[0]))

    for i in range(len(prob_act)):
        prob_act[i] = np.exp(q_values[0][i]/temperature)

    #numpy матричное деление поэлементно для знаменателя (сумма числителей)
    prob_act = np.true_divide(prob_act,sum(prob_act))

    action_q_value = np.random.choice(q_values[0],p=prob_act)
    action_keys = np.where(q_values[0] == action_q_value)
    action_key = action_keys[0][0]
    action = index_to_action_mapping[action_key]
    return action    

Если моя переменная температуры равна 200, после 100 эпизодов я получаю ошибку

ValueError: probabilities contain NaN

Если моя температура равна 1, в очень немногих эпизодах я получаю ошибку NaN.

Почему это происходит? Делаю ли я что-то неправильно? Как выбрать переменную температуры? Может кто-то помочь с этим?

Спасибо.

Причина, по которой вы получаете ошибку, заключается в том, что когда температура уменьшается, софтмакс получает большое значение, которое экспонента не может вычислить. Софтмакс приближает это значение до nan или 0 или 1, что и вызывает ошибку. У меня была такая же проблема, и я все еще ее исправляю. В моем случае я просто следил, чтобы награда не была слишком большой, что гарантирует софтмаксу непроблематичное значение q.

Как сказал Лиуян в своем ответе, причина этой ошибки заключается в том, что ваша температура в конечном итоге достигает точки, которая вызывает переполнение экспоненты (и приводит к NaN).

Есть несколько способов справиться с этим. Например, вы можете нормализовать значения в q_values, деля их на np.max(q_values). Таким образом, максимум q_values становится 1, и контролировать переполнения становится гораздо проще. Другой альтернативой является обрезка q_values[0][i]/temperature перед возведением в степень, используя np.min(q_values[0][i]/temperature, 10) или другое значение, которое вы считаете подходящим. Однако это приводит к потере важной информации при ранжировании действий (если все значения q_values[0][i]/temperature выше 10, вы получаете тот же результат, который получили бы, если бы температура была бесконечно большой). Я предпочитаю альтернативу нормализации.

Ответ или решение

Для расчета переменной температуры в методе Болтманна (softmax) в контексте исследования и выбора действий в задачах с непрерывным состоянием и дискретным пространством действий необходимо учитывать несколько ключевых моментов. Ваша реализация и ошибки, которые вы наблюдаете, связаны с выбором температуры и последующим вычислением вероятностей действий на основе значений Q.

Причины возникновения ошибки NaN

Когда температура устанавливается слишком низкой, значения Q могут привести к слишком большому числу при вычислении экспоненты,что может вызвать переполнение (overflow) и, в результате, привести к NaN. С другой стороны, если температура слишком велика, значения вероятностей станут практически неразличимы, что также может вызвать проблемы.

Расчет температуры

Для корректного выбора значения температуры и уменьшения вероятности возникновения NaN есть несколько стратегий:

  1. Нормализация Q-значений: Это один из самых простых и эффективных подходов. Вы можете нормализовать значения Q, деля их на максимальное Q-значение. Это предотвратит переполнение, поскольку каждое значение будет находиться в диапазоне от 0 до 1.

    q_values_normalized = q_values[0] / np.max(q_values[0])
    prob_act = np.exp(q_values_normalized / temperature)
  2. Использование обрезки (clipping): Вместо того, чтобы позволить значениям Q увеличиваться бесконечно, вы можете установить пороговое значение, при котором все значения выше него будут обрезаны. Например, это может быть значение 10 или любое значение, которое вы считаете подходящим.

    q_values_clipped = np.clip(q_values[0] / temperature, None, 10)
    prob_act = np.exp(q_values_clipped)
  3. Постепенное изменение температуры (annealing): Вместо того, чтобы фиксировать температуру, вы можете постепенно уменьшать её в процессе обучения. Это позволит вам использовать большую температуру в начале обучения, что создаёт больше случайности и помогает избежать застревания в локальных минимумах, и впоследствии уменьшать температуру для более детального исследования.

    temperature = initial_temperature / (1 + decay_rate * episode)

Подбор температуры

  • Начальные значения: Температура часто начинается с 1.0 или выше, чтобы обеспечить случайный выбор действий; её можно увеличивать в зависимости от сложности задачи.
  • Динамическое изменение: Используйте адаптивные методы, позволяющие изменять температуру на основе успешности агента. Например, если агент успешно выполняет задачу, можно уменьшить температуру.
  • Эксперименты: Подбор температуры часто требует экспериментирования. Попробуйте несколько значений и проверьте, как это влияет на обучение агента и его производительность.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...