Говоря о переходе от Q_Learning к DQN

iOS обучение с подкреплением

Эта статья была впервые опубликована на:Уокер ИИ

Потрясающим дебютом DRL (Deep Reinforcement Learning) должен стать алгоритм DQN (Deep Q Network), который DeepMind впервые применил к игре Atari в 2013 году. Сегодня (2017 г.) DRL остается одной из самых передовых областей исследований. Но всего за четыре года DRL превратилась из игры в Atari в игру в го (Alphago), игру в киберспорт (Dota AI, StarCraft AI), снова и снова обновляя все три взгляда.

1. Что такое Q-обучение

Алгоритм Q-Learning — это метод решения задач управления обучением с подкреплением с использованием временной разницы. через текущее состояниеSS,действиеAA, мгновенная наградаRR, коэффициент затуханияγγ, скорость обнаруженияϵϵ, оптимальная функция действия-ценностиQQи самое стратегическоечисло Пичисло Пи.

  • SS: Указывает состояние окружающей среды вttсостояние окружающей среды в любой моментStS_t

  • AA: действие агента, вttдействия, предпринимаемые постоянноAtA_t

  • RR: награда окружающей среды, вttВ данный момент агент совершает действие в состоянии StAtA_tсоответствующее вознаграждениеRt+1R_{t+1}Будет вt+1t+1время, чтобы получить

  • γ\gamma: коэффициент дисконтирования, вес текущего отложенного вознаграждения

  • ϵ\epsilon: Скорость исследования. В Q-обучении мы выберем действие с наибольшим значением в текущей итерации, что может привести к некоторым действиям, которые никогда не выполнялись снова. Когда агент выбирает действие, существует небольшая вероятность того, что действие с наибольшим значением в текущей итерации не выбрано.

1.1 Введение в алгоритм Q-обучения

Сначала мы основывались на состоянииSS,использоватьϵgreedϵ−жадность(жадный) выбор к действиюAA, а затем выполнить действиеAA, получить вознаграждениеRR, и войти в состояниеS'S',QQФормула обновления значения выглядит следующим образом:

Q(S,A)=Q(S,A)+альфа(R+γmaxQ(S',a)Q(S,A))Q(S,A)=Q(S,A)+\alpha(R+\gamma maxQ(S',a)-Q(S,A))

1.2 Поток алгоритма Q-обучения

  • Случайным образом инициализируйте значение, соответствующее состоянию и значению действия. (инициализацияQQлист)

  • for i from 1 to T(T: общее количество раундов итерации)

    а) ИнициализацияSSявляется первым состоянием последовательности текущих состояний

    б) сϵϵ− Жадный метод находится в текущем состоянииSSвыбрать действиеAA

    в) в состоянииSSвыполнить текущее действиеAA, получить новое состояниеS'С'и наградыRR

    г) Обновите функцию значенияQ(S,A)Q(S,A):      Q(S,A)=Q(S,A)+альфа(R+γmaxQ(S',a)Q(S,A))Q(S,A)=Q(S,A)+\alpha(R+\gamma maxQ(S',a)-Q(S,A))

    д)S=S'S=S'

    е)if donedoneзавершить текущую итерацию

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

каждый прогон,QQТабличные значения будутИзменять, но принцип остается тот же.

Если вы хотите увидеть более интуитивное видениекликните сюда

2. DQN(Deep Q Network)

Как упоминалось ранее, решение Q-Learning основано на значении таблицы Q, и вознаграждение, полученное после выполнения этого действия, больше, поэтому это действие выбирается для выполнения. Пространство состояний и пространство действий, упомянутые выше, очень малы.Если пространство состояний и пространство действий станут очень большими, можем ли мы по-прежнему использовать Q-таблицу для их представления? Явно нет, мы ввелиаппроксимация функции цены.

2.1 Аппроксимация функции цены

Поскольку в практических задачах размер состояния проблемы велик, допустимым решением является использование аппроксимации функции ценности. Введем функцию значения состоянияv^\hat v, по весую\omegaописание по штатамssВ качестве входных данных вычисляется состояниеssзначение:v^(s,w)vчисло Пи(s)\hat v(s,w)\approx v_\pi(s)

выше мы упоминалию\omegaЭто эквивалентно параметрам в нашей нейронной сети через состояние входаss, используя MC (Монте-Карло)/TD (разность временных рядов) для вычисления функции значения в качестве выходных данных, а затем для весаю\omegaТренируйтесь до схождения. По сути, так называемая 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 Блок-схема алгоритма

Вход: общее количество итерацийTT, размер объекта состоянияnn, измерение действияAA, размер шагаaa, коэффициент затуханияγ\gamma, скорость обнаруженияϵ\epsilon, текущая сеть QQQ, целевая сеть QQ'Q', количество выборок для пакетного градиентного спускаmm, целевая частота обновления сетевых параметров QPP.

Выход: параметры сети Q

  • Произвольно инициализировать все состояния и действия соответствующими значениямиQQ, случайным образом инициализировать текущийQQВсе параметры сетию\omega, инициализируйте целевую сеть QQ'Q'параметрыю\omega'=ю\omega, очистите запас опытаDD

  • для i от 1 до T (постоянно повторять)

    а) Инициализировать среду и получить первое состояниеss, получить вектор признаков\phi$$(S)

    б) вQQиспользовать в сети\phi$$(S)в качестве входных данных получитьQQQ-значения для всех действий сети, используяϵ\epsilon- Жадный метод выбирает соответствующее действие в текущем выводе значения QAA

    в) в состоянииSSвыполнить действиеAA, получить новое состояниеS'S', и соответствующий ему\phi$$(S')и наградыRR, является ли это конечным состояниемisdoneisdone

    г) будет {ф(S)\phi(S),AA,RR,ф(S')\phi(S'),isdoneisdone} Поместите эти 5 элементов в пул опыта.DD

    д)S=S'S=S'

    f) из пула опытаDDпринятый вmmобразцы, {ф(Sj)\phi(S_j),AjA_j,RjR_j,ф(Sj'\phi(S'_j,isdonejisdone_j),j=1,2,3,4....mj=1,2,3,4....m, рассчитать токQQценностьyjy_j:

g) Используйте функцию среднеквадратичных потерь\left(\frac{1}{m}\right)$$\sum_{j=1}^m(yjQ(ф(Sj),Aj,ю))2y_j-Q(\phi (S_j),A_j,\omega))^2Обновление параметров через обратное распространение градиентного спуска нейронной сетию\omega

h) Если i%P=0, следуйте новой целиQQсетевые параметрыю'=ю\omega'=\omega

я) еслиS'S'В конечном состоянии текущая итерация завершена, иначе перейти к шагу (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

добавилисследовать ценность(ϵ)(\epsilon), который с меньшей вероятностью будет выбран случайно.

(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] и обсудите с ходоками!