Время прочтения: 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. У каждого из методов есть свои особенности и каждый стоит того, чтобы уделить ему внимание.