Простое обучение с подкреплением в Tensorflow: Часть 1 - Двурукий бандит

Простое обучение с подкреплением в Tensorflow: Часть 1 - Двурукий бандит

Nuances of programming

Перевод статьи Arthur Juliani: Simple Reinforcement Learning in Tensorflow: Part 1 - Two-armed Bandit

Это продолжение серии обучающих статей о нейронных сетях и алгоритмах обучения. В этой части рассматриваются основы создания алгоритма обучения нейронной сети с подкреплением.

Введение

Обучение с подкреплением позволяет не только обучить искусственного «посредника» между человеком и средой, но и дает ему возможность самостоятельно обучаться посредством самостоятельных взаимодействий с окружающей средой. Объединив в RL-агенты, комплексные методы обучения с обратным логическим выводом многослойных нейронных сетей, удалось добиться серьезных побед в сфере искусственного интеллекта, например, компьютер смог победить людей в более чем десятке игр Atari, а также искусственный интеллект смог одержать победу на чемпионате мира по игре Го.

Пояснение переводчика: в данной сфере также используется более очевидным образом переводимый на русский язык термин «artificial intelligence agent» – искусственный интеллектуальный агент. Термин «агент» перешел в сферу искусственного интеллекта из области мультиагентного моделирования (по англ. – multi-agent system или сокращенно – MAS).

Изучение методов создания агента такого типа требует некоторого изменения в мышлении для тех, кто привык работать с системами контролируемого обучения. В данном случае имеется в виду, что такой агент просто способен получить алгоритм на основе поиска парной корреляции между определенными стимулами и ответными реакциями на них. В отличие от RL-алгоритмов в данном случае мы должны позволить искусственному интеллектуальному агенту самостоятельно изучать правильные пары «стимул-реакция», используя наблюдения, вознагражения и действия. Поскольку при таком подходе не рассматривается «истинное» правильное действие агента, при любых обстоятельствах, мы можем просто говорить, что здесь все становится немного сложнее. В этой и последующих частях нашей серии я буду рассматривать создание и обучение агентов на основе метода обучения с подкреплением. Мы начнем с простых агентов и задач, чтобы понять ключевые концепции, а уже затем начнем работать с более сложными задачами и средами.

Примечание переводчика: контролируемое обучение или по англ. learning with a teacher (обучение искусственной нейронной сети (ИНС) называется контролируемым, если для него существует внешний критерий, которому должен соответствовать выход ИНС, иначе оно именуется неконтролируемым (unsupervised learning) и рассматривается как самообучение (self-organizing).

Двурукий бандит

Простейшей задачей обучения подкреплением является N-рукий бандит. По сути, рассматривается N игровых автоматов, каждый из которых имеет определенную вероятность фиксированной величины денежного выигрыша, выдаваемого игроку, в том случае, если он выиграл. Цель заключается в том, чтобы найти машину с наилучшей выплатой выигрыша и максимизировать выдаваемое ей вознаграждение, каждый раз выбирая именно этот вариант. Сначала мы упростим задачу и будем рассматривать только два игровых автомата. Фактически, эта задача настолько проста, что она скорее является идеализированным вариантом RL-задач. Позволь мне объяснить несколько подробнее. Типичными аспектами задачи, которые превращают ее в задачу типа RL, являются следующие:

  • Различные действия приносят разные выигрыши. Например, если вы ищете сокровища в лабиринте, то если на развилке дорог выбрать путь налево можно найти сокровища, тогда как ход вправо может, например, привести к яме со змеями.
  • Со временем получение награды начинает задерживаться. Это означает, что даже если пойти правильном направлении, как к в приведенном выше примере, мы будем узнавать, правильное ли оказалось направление несколько позже – потребуется дольше пройти по лабиринту, чтобы достичь награды (получить выигрыш).
  • Получение вознаграждения за выбранные действия теперь уже будет зависеть от состояния окружающей среды. Продолжая пример лабиринта, заметим, что, к примеру, движение влево может оказаться идеальным только на определенной развилке на пути, тогда как на других – нет.

N-рукий бандит – хорошее начало, потому что нам не нужно беспокоиться о аспектах №2 и 3. Все, на чем мы должны сосредоточиться, ‑ только обучение, которое является результатом каждого из возможных действий, и уверенность в том, что мы наиболее оптимальное действие из всех возможных. В контексте RL-обучения такой подход называется стратегическим обучением. Мы будем использовать метод, называемый градиентной стратегией, при котором наша простая нейронная сеть изучает стратегии выбора действий путем корректировки их весов с помощью метода градиентного спуска, используя обратную связь (реакцию) среды. Имеется также еще один подход к обучению подкреплению, при котором искусственные интеллектуальные агенты изучают функции ценности. В подобных подходах вместо того, чтобы изучать оптимальное поведение при определенных обстоятельствах, искусственный интеллектуальный агент учится прогнозировать то, насколько хорошим может быть данное состояние или действие для него самого. Оба данных подхода позволяют агентам хорошо учиться, но метод градиентного спуска является более прямым путем и быстрым получения результатов обучения.

Процедура градиентной стратегии

Простейшим способом понять, как применяется градиентная стратегия для обучения нейронной сети – получить явные и очевидные результаты такого обучения. В случае нашего бандита нам нет необходимости оговаривать эти результаты при любом состоянии. Таким образом, наша сеть будет состоять только из набора весов, каждый из которых соответствует каждому из возможных рук, за которые можно дернуть бандита, и будет представлять то, насколько хорошо обучаемый нами искусственный агент разобрался, за какую руку он должен потянуть руку. Если мы инициализируем эти веса единичными значениями, то наш агент будет несколько оптимистично оценивать потенциальную возможность награду от любой из рук.

Чтобы обновить нашу сеть, мы просто попробуем применить к руке е-жадную стратегию (см. в Части 7 более детальное изложение различных стратегий выбора действий - ссылка будет позже, после перевода 7 части статьи цикла). Это означает, что большую часть времени обучаемый искусственный агент будет выбирать действие, соответствующее наиболее ожидаемому результату, но иногда с вероятностью e он будет выбирать свое действие случайным образом. Таким образом, агент может попробовать дернуть за каждую из рук, чтобы продолжить изучать эффекты своих действий. При этом за каждое свое действие обучаемый нами искусственный агент получает вознаграждение величиной 1 или -1. По результатам полученного вознаграждения мы можем обновить состояния нашей нейронной сети на основании уравнения оценки стратегии потерь:

где

  • A – есть величина полученного преимущества, которая является важным аспектом всех алгоритмов обучения на основе подкрепления. Интуитивно она соответствует тому, насколько лучше оказалось рассматриваемое поведение по сравнению с некоторой базовой стратегией. В дальнейшем мы разработаем более сложные базовые стратегии поведения для сравнения выигрышей, но на данный момент мы принимаем ббазовый уровень за нуль, и будем считать его простейшим (элементарным) вознаграждением, которое можно получить за каждое действие.
  • π - это стратегия. В данном случае она соответствует весу выбранного действия.

Интуитивно понятно, что такая функция потерь позволяет нам увеличить вес для тех действий, которые привели к положительному подкреплению, и уменьшить их для действий, которые дали отрицательное подкрепление (отрицательный выигрыш). Таким образом, обучаемый искусственный агент будет с большей или меньшей вероятностью выбирать это действие в будущем. Действуя, получая подкрепление (выигрыши) и обновляя состояние нашей нейронной сети подобным повторяющимся образом, мы быстро обучаем нашего искусственного агента тому, как можно успешно решить наш бандитский вопрос! Но ни в коем случае не верьте мне на слово. Попробуйте сами.

Многорукий бандит

Это руководство содержит простой пример построения градиентной стратегии для искусственного агента, решающего задачу многорукого бандита. Более подробную информацию можно найти здесь - Medium post.

Другие алгоритмы с подкреплением, включая DQN и модельное обучение в Tensorflow вы сможете найти на моей Github, DeepRL-Agents.

In [1]:

import tensorflow as tf
import numpy as np

Бандиты

Здесь мы определяем наших бандитов. В данном примере мы используем четырехрукого бандита. Функция pullBandit генерирует нормально распределенную случайную величину со средним значением 0. Чем меньше число бандитов, тем выше вероятность получить положительное подкрепление (вознаграждение). Мы хотим, чтобы наш искусственный агент (то есть обучаемая нейронная сеть) научился всякий раз выбирать такого бандита, который принесет ему положительное подкрепление.

In [2]:

#List out our bandits. Currently bandit 4 (index#3) is set to most often provide a positive reward.
bandits = [0.2,0,-0.2,-5]
num_bandits = len(bandits)
def pullBandit(bandit):
    #Get a random number.
    result = np.random.randn(1)
    if result > bandit:
        #return a positive reward.
        return 1
    else:
        #return a negative reward.
        return -1

Искусственный агент

Приведенный ниже код описывает нашего простейшего искуственного нейронного агента. Он состоит из набора значений для каждого из бандитов. Каждое значение представляет собой оценку выигрыша при выборе бандита. Мы используем метод градиентной стратегии для обновления состояний агента, помещая в качестве результата от каждого выбранного действия полученную агентом награду (положительное или отрицательное подкрепление).

In [3]:

tf.reset_default_graph()

#These two lines established the feed-forward part of the network. This does the actual choosing.
weights = tf.Variable(tf.ones([num_bandits]))
chosen_action = tf.argmax(weights,0)

#The next six lines establish the training proceedure. We feed the reward and chosen action into the network
#to compute the loss, and use it to update the network.
reward_holder = tf.placeholder(shape=[1],dtype=tf.float32)
action_holder = tf.placeholder(shape=[1],dtype=tf.int32)
responsible_weight = tf.slice(weights,action_holder,[1])
loss = -(tf.log(responsible_weight)*reward_holder)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
update = optimizer.minimize(loss)

Обучение Агента

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

In [4]:

total_episodes = 1000 #Set total number of episodes to train agent on.
total_reward = np.zeros(num_bandits) #Set scoreboard for bandits to 0.
e = 0.1 #Set the chance of taking a random action.

init = tf.initialize_all_variables()

# Launch the tensorflow graph
with tf.Session() as sess:
    sess.run(init)
    i = 0
    while i < total_episodes:
        
        #Choose either a random action or one from our network.
        if np.random.rand(1) < e:
            action = np.random.randint(num_bandits)
        else:
            action = sess.run(chosen_action)
        
        reward = pullBandit(bandits[action]) #Get our reward from picking one of the bandits.
        
        #Update the network.
        _,resp,ww = sess.run([update,responsible_weight,weights], feed_dict={reward_holder:[reward],action_holder:[action]})
        
        #Update our running tally of scores.
        total_reward[action] += reward
        if i % 50 == 0:
            print "Running reward for the " + str(num_bandits) + " bandits: " + str(total_reward)
        i+=1
print "The agent thinks bandit " + str(np.argmax(ww)+1) + " is the most promising...."
if np.argmax(ww) == np.argmax(-np.array(bandits)):
    print "...and it was right!"
else:
    print "...and it was wrong!"
Running reward for the 4 bandits: [ 1.  0.  0.  0.]
Running reward for the 4 bandits: [  0.  -2.  -1.  38.]
Running reward for the 4 bandits: [  0.  -4.  -2.  83.]
Running reward for the 4 bandits: [   0.   -6.   -1.  128.]
Running reward for the 4 bandits: [   0.   -8.    1.  172.]
Running reward for the 4 bandits: [  -1.   -9.    2.  219.]
Running reward for the 4 bandits: [  -1.  -10.    4.  264.]
Running reward for the 4 bandits: [   0.  -11.    4.  312.]
Running reward for the 4 bandits: [   2.  -10.    4.  357.]
Running reward for the 4 bandits: [   2.   -9.    4.  406.]
Running reward for the 4 bandits: [   0.  -11.    4.  448.]
Running reward for the 4 bandits: [  -1.  -10.    3.  495.]
Running reward for the 4 bandits: [  -3.  -10.    2.  540.]
Running reward for the 4 bandits: [  -3.  -10.    3.  585.]
Running reward for the 4 bandits: [  -3.   -8.    3.  629.]
Running reward for the 4 bandits: [  -2.   -7.    1.  673.]
Running reward for the 4 bandits: [  -4.   -7.    2.  720.]
Running reward for the 4 bandits: [  -4.   -7.    3.  769.]
Running reward for the 4 bandits: [  -6.   -8.    3.  814.]
Running reward for the 4 bandits: [  -7.   -7.    3.  858.]
The agent thinks bandit 4 is the most promising....
...and it was right!

Исходный код можно найти в SimplePolicy.ipynb, размещенный на GitHub

(Дополнение от 09/10/2016): Сегодня я переписал пошаговое руководство по iPython для этого мини-курса. Уравнение потерь, используемое ранее, было менее очевидно, чем хотелось бы. Я заменил его более стандартной версией, которая определенно будет более полезной для тех, кто заинтересован в применении методов градиентной стратегии к решению более сложным задач.)

Вы можете найти мои работы по глубокому обучению, искусственному интеллекту и когнитивным наукам в моем твиттере @awjliani.

Статью перевел Владислав Семёнов.

Report Page