Эта статья была впервые опубликована на:Уокер ИИ
Потрясающим дебютом DRL (Deep Reinforcement Learning) должен стать алгоритм DQN (Deep Q Network), который DeepMind впервые применил к игре Atari в 2013 году. Сегодня (2017 г.) DRL остается одной из самых передовых областей исследований. Но всего за четыре года DRL превратилась из игры в Atari в игру в го (Alphago), игру в киберспорт (Dota AI, StarCraft AI), снова и снова обновляя все три взгляда.
1. Что такое Q-обучение
Алгоритм Q-Learning — это метод решения задач управления обучением с подкреплением с использованием временной разницы. через текущее состояние,действие, мгновенная награда, коэффициент затухания, скорость обнаружения, оптимальная функция действия-ценностии самое стратегическое.
-
: Указывает состояние окружающей среды всостояние окружающей среды в любой момент
-
: действие агента, вдействия, предпринимаемые постоянно
-
: награда окружающей среды, вВ данный момент агент совершает действие в состоянии Stсоответствующее вознаграждениеБудет ввремя, чтобы получить
-
: коэффициент дисконтирования, вес текущего отложенного вознаграждения
-
: Скорость исследования. В Q-обучении мы выберем действие с наибольшим значением в текущей итерации, что может привести к некоторым действиям, которые никогда не выполнялись снова. Когда агент выбирает действие, существует небольшая вероятность того, что действие с наибольшим значением в текущей итерации не выбрано.
1.1 Введение в алгоритм Q-обучения
Сначала мы основывались на состоянии,использовать(жадный) выбор к действию, а затем выполнить действие, получить вознаграждение, и войти в состояние,Формула обновления значения выглядит следующим образом:
1.2 Поток алгоритма Q-обучения
-
Случайным образом инициализируйте значение, соответствующее состоянию и значению действия. (инициализациялист)
-
for i from 1 to T(T: общее количество раундов итерации)
а) Инициализацияявляется первым состоянием последовательности текущих состояний
б) с− Жадный метод находится в текущем состояниивыбрать действие
в) в состояниивыполнить текущее действие, получить новое состояниеи награды
г) Обновите функцию значения:
д)
е)if завершить текущую итерацию
1.3 Приведите пример с Q_table
(1) Игровая карта
-
черный ящик для ловушки
-
Желтая коробка — это выход (бонусный балл).
(2) Это таблица Q после обучения модели.
(3) Приведите простой пример
- Если агент входит в лабиринт в позиции «1», Q-стола будет больше, а максимальное значение Q спуска вниз равно 0,59, тогда агент перейдет в позицию «5».
- После того, как агент находится в позиции «5», идет еще одна таблица Q. Максимальное значение Q движения вниз равно 0,66, если оно все еще находится в позиции «9», то агент достиг позиции «9».
- После того, как агент находится в позиции «9», появляется еще одна таблица Q. Максимальное значение Q движения вправо составляет 0,73.Если он все еще движется вниз, то агент достиг позиции «10».
- После того, как агент находится в позиции «10», идет еще одна таблица Q. Максимальное значение Q движения вниз равно 0,81, если оно все еще находится в позиции «14», то агент достиг позиции «14».
- После того, как агент находится в позиции "14", идет еще одна таблица Q. Максимальное значение Q перемещения вправо равно 0,9. Если она все еще идет вниз, то агент достиг позиции "15".
- После того, как агент окажется на позиции «15», есть еще стол Q. Максимальное значение Q перемещения вправо равно 1. Если он все еще идет вниз, то агент перейдет на позицию «16». и дойти до конечной точки.
Конечный маршрут действия агента1-->5-->9-->10-->14-->15-->16
каждый прогон,Табличные значения будутИзменять, но принцип остается тот же.
Если вы хотите увидеть более интуитивное видениекликните сюда
2. DQN(Deep Q Network)
Как упоминалось ранее, решение Q-Learning основано на значении таблицы Q, и вознаграждение, полученное после выполнения этого действия, больше, поэтому это действие выбирается для выполнения. Пространство состояний и пространство действий, упомянутые выше, очень малы.Если пространство состояний и пространство действий станут очень большими, можем ли мы по-прежнему использовать Q-таблицу для их представления? Явно нет, мы ввелиаппроксимация функции цены.
2.1 Аппроксимация функции цены
Поскольку в практических задачах размер состояния проблемы велик, допустимым решением является использование аппроксимации функции ценности. Введем функцию значения состояния, по весуописание по штатамВ качестве входных данных вычисляется состояниезначение:
выше мы упоминалиЭто эквивалентно параметрам в нашей нейронной сети через состояние входа, используя MC (Монте-Карло)/TD (разность временных рядов) для вычисления функции значения в качестве выходных данных, а затем для весаТренируйтесь до схождения. По сути, так называемая DQN — это комбинация нейронных сетей и Q-Learning, превращающая Q-таблицу в Q-сеть.
2.2 Идеи алгоритма глубокого Q-обучения
DQN — это алгоритм вне политики.По словам г-на Ли Хунъи, вы можете наблюдать, как учатся другие, так почему же DQN может смотреть, как учатся другие? DQN использует метод воспроизведения опыта для обучения. Награды, полученные каждый раз, когда агент взаимодействует со средой, текущее состояние и следующее состояние и другие данные сохраняются для последующего обновления сети Q.
Давайте взглянем на Nature DQN.На самом деле, Nature DQN — это второе поколение DQN, DQN NIPS — самый оригинальный DQN, и помимо этого существует множество версий DQN, таких как Double DQN, Dueling DQN и так далее. . Причина, по которой я здесь, чтобы представить вам Nature DQN! Лично я считаю, что эта версия DQN должна быть самой классической. Далее давайте посмотрим, как DQN выполняет обучение с подкреплением.
2.3 Блок-схема алгоритма
Вход: общее количество итераций, размер объекта состояния, измерение действия, размер шага, коэффициент затухания, скорость обнаружения, текущая сеть Q, целевая сеть Q, количество выборок для пакетного градиентного спуска, целевая частота обновления сетевых параметров Q.
Выход: параметры сети Q
-
Произвольно инициализировать все состояния и действия соответствующими значениями, случайным образом инициализировать текущийВсе параметры сети, инициализируйте целевую сеть Qпараметры'=, очистите запас опыта
-
для i от 1 до T (постоянно повторять)
а) Инициализировать среду и получить первое состояние, получить вектор признаков\phi$$(S)
б) виспользовать в сети\phi$$(S)в качестве входных данных получитьQ-значения для всех действий сети, используя- Жадный метод выбирает соответствующее действие в текущем выводе значения Q
в) в состояниивыполнить действие, получить новое состояние, и соответствующий ему\phi$$(S')и награды, является ли это конечным состоянием
г) будет {,,,,} Поместите эти 5 элементов в пул опыта.
д)
f) из пула опытапринятый вобразцы, {,,,,),, рассчитать токценность:
g) Используйте функцию среднеквадратичных потерь\left(\frac{1}{m}\right)$$\sum_{j=1}^m(Обновление параметров через обратное распространение градиентного спуска нейронной сети
h) Если i%P=0, следуйте новой целисетевые параметры
я) еслиВ конечном состоянии текущая итерация завершена, иначе перейти к шагу (2)
2.4 Код реализации DQN
(1) Структура сети
class Net(nn.Module):
def __init__(self, ):
super(Net, self).__init__()
self.fc1 = nn.Linear(N_STATES, 50)
self.fc1.weight.data.normal_(0, 0.1) # initialization
self.out = nn.Linear(50, N_ACTIONS)
self.out.weight.data.normal_(0, 0.1) # initialization
def forward(self, x):
x = self.fc1(x)
x = F.relu(x)
actions_value = self.out(x)
return actions_value
- две сетита же структура.
- Веса параметров разные, одинВ прямом эфире обновление,одинвремя от временив обновлении.
(2) Выбор действий
def choose_action(self, x): #x为当前状态的4个值
x = torch.unsqueeze(torch.FloatTensor(x), 0) #在数据的第0维处增加一维
# input only one sample
if np.random.uniform() < EPSILON: # greedy #贪婪取法
actions_value = self.eval_net.forward(x) ##传入eval_net获取下一个的动作
action = torch.max(actions_value, 1)[1].data.numpy() ##返回这一行中最大值的索引
action = action[0] if ENV_A_SHAPE == 0 else action.reshape(ENV_A_SHAPE) # return the argmax index
else: # random
action = np.random.randint(0, N_ACTIONS)
# action = random.sample(N_ACTIONS)
action = action if ENV_A_SHAPE == 0 else action.reshape(ENV_A_SHAPE)
return action
добавилисследовать ценность, который с меньшей вероятностью будет выбран случайно.
(3) Пул опыта
def store_transition(self, s, a, r, s_): #s和s_都为4个值,分别为 位置 移动速度 角度 移动角度
transition = np.hstack((s, [a, r], s_))
# replace the old memory with new memory #更新经验
index = self.memory_counter % MEMORY_CAPACITY
self.memory[index, :] = transition #将第index经验替换为transition
self.memory_counter += 1
(4) Обновить сетевые параметры
def learn(self):
# target parameter update 目标参数更新
if self.learn_step_counter % TARGET_REPLACE_ITER == 0:
self.target_net.load_state_dict(self.eval_net.state_dict()) ## 每学习200步将eval_net的参数赋值给target_net
self.learn_step_counter += 1
# sample batch transitions #选取过渡
sample_index = np.random.choice(MEMORY_CAPACITY, BATCH_SIZE) #从MEMORY_CAPACITY随机选取BATCH_SIZE个
b_memory = self.memory[sample_index, :]
b_s = torch.FloatTensor(b_memory[:, :N_STATES]) #第一个状态
b_a = torch.LongTensor(b_memory[:, N_STATES:N_STATES+1].astype(int)) #动作
print("--------")
print(b_a)
print("-----")
b_r = torch.FloatTensor(b_memory[:, N_STATES+1:N_STATES+2]) #得分
b_s_ = torch.FloatTensor(b_memory[:, -N_STATES:]) #下一个状态
# q_eval w.r.t the action in experience
q_eval = self.eval_net(b_s).gather(1, b_a) # shape (batch, 1) 当前状态的Q值使用eval_net计算
# print("++++++")
# print(self.eval_net(b_s))
# print(self.eval_net(b_s).gather(1,b_a))
# print("+++++++")
q_next = self.target_net(b_s_).detach() #使用target_net计算下一步Q值 # detach from graph, don't backpropagate detach防止targent——net反向传播
q_target = b_r + GAMMA * q_next.max(1)[0].view(BATCH_SIZE, 1) # shape (batch, 1)
loss = self.loss_func(q_eval, q_target)
self.optimizer.zero_grad() #zer——grad设置所有优化器的梯度为0
loss.backward() #反向传播
self.optimizer.step() #执行下个优化
DQN — это порог глубокого обучения с подкреплением.Пока вы входите в дверь, последующее обучение будет очень легким.
PS: Для получения дополнительной технической галантереи, пожалуйста, обратите внимание на [Публичный аккаунт | xingzhe_ai] и обсудите с ходоками!