Время прочтения: 3 мин.
Начать стоит с самого определения. Обучение с подкреплением – это метод машинного обучения, при котором происходит обучение модели, которая не имеет никаких сведений о системе, но имеет возможность производить различные действия в ней и получать обратную связь от своих действий.
Для большего понимания, в качестве примера используем классическую для обучения с подкреплением задачу – многорукого бандита (однорукий бандит – игровой автомат. Многорукий бандит – несколько таких автоматов).
Представим, что перед нами стоят четыре одноруких бандита (система). Для упрощения условимся, что в каждом из них фиксированная вероятность выигрыша. И есть некий игрок (агент), который не знает ничего о том, как работает система, но может совершать действия в ней, а если точнее, дергать за руку одного из четырёх бандитов, и получать обратную связь от своих действий – информацию о выигрыше или проигрыше. Цель обучения агента – это выявление оптимальной стратегии поведения в системе, а в этом конкретном примере – определение бандита с наибольшей вероятностью выигрыша.
С теорией немного разобрались, теперь переходим к коду.
Для начала, опишем систему.
import random
# Вероятности выигрыша в каждом из бандитов от 0 до 1
bandits = [0.2, 0.35, 0.1, 0.65]
banditsCount = len(bandits)
# Функция "дёрганья" бандита
def pullBandit(bandit):
pull = random.random() # Случайная генерация числа от 0 до 1
if pull < bandits[bandit]:
return 1
else:
return -1
Система описана. Для четырёх бандитов заданы вероятности выигрыша в 20, 35, 10 и 65 процентов соответственно. Для нас уже сейчас очевидно, что оптимальным вариантом является четвёртый бандит с вероятностью выигрыша 65 процентов, но агенту только предстоит прийти к такому выводу. Для обучения мы будем использовать tensorflow. С его помощью мы создадим простого агента, который будет состоять из списка вероятность выигрыша для бандитов. Чтобы обновлять веса мы воспользуемся policy gradient, а значит будем выбирать действия, которые минимизируют функцию потерь.
# Создание feed-forward части нейросети
tf.reset_default_graph()
weigths = tf.Variable(tf.ones([banditsCount]))
chosenAction = tf.argmax(weigths, 0)
# Установка процедуры обучения.scoreHolder = tf.placeholder(shape[1], dtype=tf.float32)
actionHolder = tf.placeholder(shape[1], dtype=tf.float32)
responsibleWeight = tf.slice(weigths, actionHolder, [1])
loss = -(tf.log(responsibleWeight) * scoreHolder)
optimize = tf.train.GradientDescentOptimizer(learning_rate = 0.001)
updating = optimize.minimize(loss)
Теперь переходим к обучению агента. Обучение пройдёт путём выбора действий и получения выигрышей или проигрышей. Применяя полученные значения, нам будет понятно, каким образом необходимо менять веса модели, чтобы в отбор чаще подпадали бандиты с большим возможным выигрышем.
totalEpisodes = 1000 # Число итерация для обучения
totalScore = np.zeros(banditsCount) # Стартовый показатель выигрыша - 0
e = 0.1 # Вероятность выбора случайного действия
init = tf.global_variables_initializer()
# Инициализирование графа
with tf.Session() as session:
session.run(init)
i = 0
while i < totalEpisodes:
# Выбор действия
if random.random() < e:
action = random.ranint(banditsCount)
else:
action = session.run(chosenAction)
score = pullBandit(bandits[action])
# Обновление весов
_,resp,ww = session.run([updating, responsibleWeight, weigths], feed_dict={scoreHolder:[score], actionHolder:[action]})
totalScore[action] += scorei += 1
print("Агент понимает, бандит под номером " + str(np.argmax(ww)+1) + " лучше всех...")
if np.argmax(ww) == np,argmax(-np.array(bandits)):
print("...и он попал в точку!")
else:
print("...и он ошибся!")
После выполнения данного кода агентом будет определён оптимальный бандит и он сообщит об этом в терминале.
Сфер же применения данного метода обучения достаточно много. Начиная с того, что таким образом компьютер научился невероятно успешно играть в игры (openAI ) и заканчивая чем-то более сложным, например, обучение торговле ценными бумагами с получением максимальной выгоды.
Стоит заметить, что такой подход к обучению не единственно правильный и существует множество других, например, Q-Learning. У каждого из методов есть свои особенности и каждый стоит того, чтобы уделить ему внимание.