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)最開始處於第一個格子,機器可以選擇的動作是向左走一格或者向右走一格,初始狀態如下:
不難想到,我們的狀態空間可以設置成5個狀態(對應A處於五個格子的狀態),動作空間可以設置成兩個動作(對應A向左向右的動作),reward可以設置如下,其中表示在當前狀態s採取動作a後,會跳轉到的下一個狀態。
如果機器在初始狀態選擇向右走這一動作,下一個狀態就變成下面,這個轉換帶來的reward就是0。
Q值的更新利用貝爾曼方程
其中,表示在狀態選擇了動作後跳轉到的下一個狀態,表示選取下一個狀態中的最大Q值(對應Q值表中這一行的最大值)。是學習率,是未來reward換算到當前時刻狀態的衰減,表示未來Q值對當前狀態的帶有衰減的影響,如果我們一直套用迭代公式(1),
可以看到,當前時刻Q的目標值其實是未來reward 按照衰減的和。如果,則說明當前狀態的Q值更新,只和跳轉的下一狀態有關;如果,則說明未來決策的所有reward對當前狀態的Q值更新有影響,且影響程度一樣。
一些名詞
transition:一次transition就是執行一次下列過程,對當前狀態,選取動作後,進入下一時刻狀態,拿到獎勵;可以表示爲。
episode:一次episode就是一套完整的決策過程,按照上面的一維迷宮的例子,就是從初始狀態,到找到出口target,之間包含的所有transition。有點類似監督學習中的epoch。
epsilon-greedy
Q值表會有一個初始值,爲了讓Q值表在學習之初,能夠儘可能的探索更多的狀態,可以設置一個概率,即對於每一次transition,有概率,會隨機選擇動作,而不是選取狀態對應的Q值最大的,這樣就能進入不同的下一時刻狀態,探索更多的可能。
隨着episode的增加,可以逐漸增大,這樣在學習晚期能夠更深入的挖掘已經學習到的好的決策過程,減少對未知的探索,所以這是一個explore vs exploit的過程。
算法流程
超參數:learning_rate(), reward_decay(), e_greedy()
DQN
Q-learning如果狀態很多,動作很多時,需要建立的Q值表也會十分的龐大,因此我們可以利用神經網絡來計算Q值,利用神經網絡的輸出來代替查找Q值表得到的Q值。
有兩種可選方案,我們把神經網絡抽象成,方案一:,即利用神經網絡學習狀態s和採用狀態a對應的Q值,相當於學習Q值表的一個表格;方案二:,即利用神經網絡,一次性學習狀態s採取各個動作的Q值,神經網絡輸出是一個向量,長度是動作總數,相當於學習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
在訓練神經網絡參數時用損失函數(Loss function)計算q_eval和y的損失,在梯度反向傳遞即可,就不再用公式(2)了。這個反向更新只更新eval_net。
所謂Fixed Q-targets,就是使得target_net的參數更新延遲發生,從而打亂相關性。經過若干步驟eval_net的更新會發生一次taregt_net的更新,由於taregt_net於eval_net的結構一模一樣,所以taregt_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
AI學習筆記——深度Q-Learning(Deep Q-Learing(DQN)):https://www.jianshu.com/p/72cab5460ebe