python

Развитие стратегий устойчивости

  • суббота, 25 ноября 2017 г. в 03:12:01
https://habrahabr.ru/company/mailru/blog/343008/
  • Параллельное программирование
  • Машинное обучение
  • Занимательные задачки
  • Python
  • Блог компании Mail.Ru Group



В предыдущей статье я описал несколько алгоритмов эволюционных стратегий (evolution strategies, ES), помогающих оптимизировать параметры функции без необходимости явно вычислять градиенты. При решении задач обучения с подкреплением (reinforcement learning, RL) эти алгоритмы можно применять для поиска подходящих наборов параметров модели для агента нейросети (neural network agent). В этой статье я расскажу об использовании ES в некоторых RL-задачах, а также опишу методы поиска более стабильных и устойчивых политик.


Эволюционные стратегии в обучении с подкреплением


Поскольку RL-алгоритмам необходимо, чтобы на каждом такте агенту передавался сигнал подкрепления (reward signal), то для этих алгоритмов важно лишь результирующее накопительное подкрепление, получаемое агентом после его прогона в среде. Во многих случаях нам известны лишь выходные данные в конце задачи, например успешно ли отработал агент, взял ли робот-манипулятор объект, выжил ли агент и т. д. Во всех этих задачах ES может быть эффективнее по сравнению с традиционным RL. Ниже я привёл псевдокод, в котором инкапсулирован прогон агента в среде OpenAI Gym. Здесь нас интересует только накопительное подкрепление:


def rollout(agent, env):
  obs = env.reset()
  done = False
  total_reward = 0
  while not done:
    a = agent.get_action(obs)
    obs, reward, done = env.step(a)
    total_reward += reward
  return total_reward

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


env = gym.make('worlddomination-v0')

# use our favourite ES
solver = EvolutionStrategy()

while True:

  # ask the ES to give set of params
  solutions = solver.ask()

  # create array to hold the results
  fitlist = np.zeros(solver.popsize)

  # evaluate for each given solution
  for i in range(solver.popsize):

    # init the agent with a solution
    agent = Agent(solutions[i])

    # rollout env with this agent
    fitlist[i] = rollout(agent, env)

  # give scores results back to ES
  solver.tell(fitness_list)

  # get best param & fitness from ES
  bestsol, bestfit = solver.result()

  # see if our task is solved
  if bestfit > MY_REQUIREMENT:
    break

Детерминистические и стохастические политики


Результат наблюдения за средой — это входные данные для агента, а выходные — его действие в каждом такте во время прогона внутри среды. Мы можем смоделировать агента как нам хочется и использовать методы из прописанных в коде правил, деревьев принятия решений и линейных функций для рекуррентных нейросетей. В этой статье я воспользуюсь простой упреждающей нейросетью (feed-forward network) с двумя скрытыми уровнями, чтобы результат наблюдения агента за средой (вектор х) напрямую транслировать в действие (вектор у):


h1=fh(W1x+b1)
h2=fh(W2h1+b2)
y=fout(Wouth2+bout)


Функциями активации fh и fout могут быть tanh, sigmoid, relu или любая другая. Во всех своих экспериментах я использовал tanh. Если будет такая потребность, то можно в выходном уровне в качестве сквозной функции (pass-through function) без нелинейностей взять fout. Если мы конкатенируем все веса и параметры погрешности (bias parameters) в единый вектор W, то увидим, что вышеописанная нейросеть — это детерминистическая функция y=F(x,W). Тогда можно использовать ES для нахождения решения W с помощью цикла поиска, описанного в предыдущей статье.


А если мы не хотим, чтобы политика агента была детерминистической? Для некоторых задач, даже таких простых, как камень-ножницы-бумага, оптимальная политика — случайное действие. То есть агент должен обучаться стохастической политике. Один из способов превращения y=F(x,W) в стохастическую политику заключается в том, чтобы сделать W случайным. Каждый параметр модели wi∈W может быть случайным значением, полученным из нормального распределения N(μii).


Такой вид стохастической нейросети называется байесовой нейросетью. Это сеть с предварительным распределением весов. В нашем случае параметры модели, для которой мы ищем решение, являются набором векторов μ и σ, а не весами W. При каждом проходе нейросети мы из N(μ,σI) получаем новый W. Есть много интересных работ об использовании байесовых нейросетей для решения разных задач, а также о проблематике обучения этих сетей. ES можно использовать для непосредственного нахождения решений стохастической политики, установив в качестве пространства решений μ и σ вместо W.


Стохастические сети часто встречаются в работах, посвящённых RL. Например, в алгоритме Proximal Policy Optimization (PPO) последний уровень представляет собой набор параметров μ и σ, а также действие, отобранное из N(μ,σI). Добавление шума к параметрам может стимулировать агента исследовать среду и избежать локального оптимума.


Я обнаружил, что, когда агент должен исследовать среду, нам зачастую не нужно, чтобы вектор W был совершенно случайным — достаточно лишь погрешности (bias). В трудных задачах, связанных с движением, к примеру в среде roboschool, мне нередко приходится использовать ES для нахождения стохастической политики, при которой из нормального распределения извлекаются лишь параметры погрешности.


Развивающиеся политики устойчивости для двуногого ходока


Это одна из сфер, где ES полезны для нахождения политик устойчивости. Я хочу управлять балансом между эффективностью данных и степень устойчивости политики на протяжении нескольких случайных попыток. Я испытал ES в отличной среде BipedalWalkerHardcore-v2, разработанной Олегом Климовым. Среда использует физический движок Box2D Physics Engine, который применялся и в Angry Birds.