強化學習:Q-learning與DQN(Deep Q Network)

  Q-learning是一種很常用很傳統的強化學習方法,DQN是Q-learning和神經網絡的結合,是近年來很火的強化學習方法。

Q-learning

  Q-learning會輸出一張Q值表,如果有m個狀態,n個動作,這個Q值表的size就是m*n;使用時,查表就行,先確定當前狀態s,在看這個狀態s對應的那一行,在輸出這一行Q 值最大的動作,就完成了一次決策過程。

  所以,使用Q-learning,首先要設計狀態空間s(會有哪些狀態),動作空間a(會有哪些動作),以及reward。最最簡單的例子,一維迷宮,假如一共有五個格子,最後一個格子是出口(T,target),機器(A,agent)最開始處於第一個格子,機器可以選擇的動作是向左走一格或者向右走一格,初始狀態如下:

A _ _ _ TA ~\_~ \_~ \_~ T

不難想到,我們的狀態空間可以設置成5個狀態(對應A處於五個格子的狀態),動作空間可以設置成兩個動作(對應A向左向右的動作),reward可以設置如下,其中ss'表示在當前狀態s採取動作a後,會跳轉到的下一個狀態。

reward(s,a)={1s=T0else reward(s,a)=\begin{cases} 1 & s'= T \\ 0 & else \end{cases}

如果機器在初始狀態選擇向右走這一動作,下一個狀態就變成下面,這個轉換帶來的reward就是0。

_ A _ _ T\_ ~A~ \_~ \_~ T

  Q值的更新利用貝爾曼方程

Qtarget=R+γmaxaQ(s,a)(1)Q_{target} = R + \gamma \max_{a'} Q(s', a') \tag{1}

Q(s,a)=Q(s,a)+α(QtargetQ(s,a))(2)Q(s,a) = Q(s,a)+\alpha(Q_{target}-Q(s,a)) \tag{2}

其中,ss'表示在狀態ss選擇了動作aa後跳轉到的下一個狀態,maxaQ(s,a)\max_{a'} Q(s', a')表示選取下一個狀態ss'中的最大Q值(對應Q值表中ss'這一行的最大值)。α\alpha是學習率,γ\gamma是未來reward換算到當前時刻狀態的衰減,表示未來Q值對當前狀態的帶有衰減的影響,如果我們一直套用迭代公式(1),

Qtarget=R+γmaxaQ(s,a)=R+γ(R+γmaxaQ(s,a))=R+γ(R+γ(R+γmaxaQ(s,a)))==R+γR+γ2R+γ3R+ \begin{aligned} Q_{target} & = R + \gamma \max_{a'} Q(s', a') \\ & = R + \gamma(R'+\gamma\max_{a''} Q(s'', a'')) \\ & = R + \gamma(R'+\gamma(R''+\gamma \max_{a'''} Q(s''', a'''))) \\ & = \dots \\ & = R + \gamma R'+\gamma^2 R''+\gamma^3 R'''+\dots \\ \end{aligned}

可以看到,當前時刻Q的目標值其實是未來reward 按照γ\gamma衰減的和。如果γ=0\gamma=0,則說明當前狀態的Q值更新,只和跳轉的下一狀態有關;如果γ=1\gamma=1,則說明未來決策的所有reward對當前狀態的Q值更新有影響,且影響程度一樣。

一些名詞

  transition:一次transition就是執行一次下列過程,對當前狀態ss,選取動作aa後,進入下一時刻狀態ss',拿到獎勵rr;可以表示爲(s,a,r,s)(s,a,r,s')
  episode:一次episode就是一套完整的決策過程,按照上面的一維迷宮的例子,就是從初始狀態,到找到出口target,之間包含的所有transition。有點類似監督學習中的epoch。

epsilon-greedy

  Q值表會有一個初始值,爲了讓Q值表在學習之初,能夠儘可能的探索更多的狀態,可以設置一個ϵ\epsilon概率,即對於每一次transition,有1ϵ1-\epsilon概率,會隨機選擇動作aa,而不是選取狀態ss對應的Q值最大的aa,這樣就能進入不同的下一時刻狀態ss',探索更多的可能。

  隨着episode的增加,ϵ\epsilon可以逐漸增大,這樣在學習晚期能夠更深入的挖掘已經學習到的好的決策過程,減少對未知的探索,所以這是一個explore vs exploit的過程。

算法流程

  超參數:learning_rate(α\alpha), reward_decay(γ\gamma), e_greedy(ϵ\epsilon

DQN

  Q-learning如果狀態很多,動作很多時,需要建立的Q值表也會十分的龐大,因此我們可以利用神經網絡來計算Q值,利用神經網絡的輸出來代替查找Q值表得到的Q值。

  有兩種可選方案,我們把神經網絡抽象成f()f(·),方案一:Q=f(s,a)Q=f(s,a),即利用神經網絡學習狀態s和採用狀態a對應的Q值,相當於學習Q值表的一個表格;方案二:Q=f(s)Q=f(s),即利用神經網絡,一次性學習狀態s採取各個動作的Q值,神經網絡輸出QQ是一個向量,長度是動作總數,相當於學習Q值表的一行。

  DQN還使用了兩個有效的策略,即Experience replay和Fixed Q-target,來打亂經歷之間的相關性,有助於收斂。

記憶庫(Experience replay)

  記憶庫會存儲過去出現的transition。如果我們設置記憶庫的大小N=500,則超過N之後,存入的transition會覆蓋掉記憶庫中最早存入的transition。

  這樣,神經網絡就可以利用批學習,例如設置batch=32,從記憶庫中打亂順序隨機取出batch個transition,進入神經網絡利用反向傳播學習參數。爲何要隨機取transition,這是爲了打亂transition之間的相關性。

固定Q-目標(Fixed Q-target)

  我們知道,在監督學習中,神經網絡的更新需要計算loss的梯度反向傳播,在DQN中也是如此,那麼DQN的label是什麼呢?這就需要另一個策略————Fixed Q-target。

  在這個策略下,需要維持兩個一模一樣結構的神經網絡,兩個網絡分別叫做eval_net和target_net。看名字就知道,eval_net是用來計算估計值的,target_net是用來計算目標值的。對於一個transition(s, a, r, s’),s會輸入eval_net來計算估計Q值q_eval,s‘會輸入target_net來計算目標Q值q_target,q_target再經過貝爾曼方程得到真正的目標label y

y=r+γ×q_targety = r + \gamma \times q\_target

在訓練神經網絡參數時用損失函數(Loss function)計算q_eval和y的損失,在梯度反向傳遞即可,就不再用公式(2)了。這個反向更新只更新eval_net。

  所謂Fixed Q-targets,就是使得target_net的參數更新延遲發生,從而打亂相關性。經過若干步驟eval_net的更新會發生一次taregt_net的更新,由於taregt_net於eval_net的結構一模一樣,所以taregt_net的更新很簡單,傳值就可以了。

target_net=eval_nettarget\_net = eval\_net

算法流程

  初始化過程:初始化操作。初始化神經網絡的參數,同時也會執行若干次transition來初始化記憶庫。例如,記憶庫的容量N=500,可以選擇執行200次transition來初始化記憶庫,這樣學習過程可以從記憶庫中抽取batch個transition,進行學習了。

  存儲過程:更新記憶庫。每發生一次transition,都會存入記憶庫,超出記憶庫容量N,會先刪去記憶庫中最早存入的transition。在存儲過程中,只執行eval_net來獲取Q值,進而根據實際情況,得到動作,獎勵,和下一狀態。

  學習過程:更新eval_net參數。可以選擇發生若干步存儲過程,執行一次學習過程。

  更新過程:更新target_net參數。一般發生若干步學習過程,執行一次更新過程。


參考文獻:
Q-learning(莫凡):https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/2-1-A-q-learning/

Q-learning參考代碼(莫凡):https://github.com/MorvanZhou/Reinforcement-learning-with-tensorflow/blob/master/contents/2_Q_Learning_maze/RL_brain.py

DQN(莫凡):https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/4-2-DQN2/

DQN參考代碼(莫凡):https://github.com/MorvanZhou/Reinforcement-learning-with-tensorflow/tree/master/contents/5_Deep_Q_Network

強化學習——值函數與Bellman方程:https://blog.csdn.net/VictoriaW/article/details/78839929?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase

AI學習筆記——深度Q-Learning(Deep Q-Learing(DQN)):https://www.jianshu.com/p/72cab5460ebe

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章