强化学习扫盲贴:从Q-learning到DQN
本文轉載自知乎專欄「機器學習筆記」,原文作者「余帥」,鏈接
https://zhuanlan.zhihu.com/p/35882937
1 本文學習目標
1. 復習Q-Learning;
2. 理解什么是值函數近似(Function Approximation);
3. 理解什么是DQN,弄清它和Q-Learning的區別是什么。
2 用Q-Learning解決經典迷宮問題
現有一個5房間的房子,如圖1所示,房間與房間之間通過門連接,編號0到4,5號是房子外邊,即我們的終點。我們將agent隨機放在任一房間內,每打開一個房門返回一個reward。圖2為房間之間的抽象關系圖,箭頭表示agent可以從該房間轉移到與之相連的房間,箭頭上的數字代表reward值。
圖1 房子原型圖
圖2 抽象關系圖
根據此關系,可以得到reward矩陣為
Q-Learning是一種off-policy TD方法,偽代碼如圖所示
Q-Learning偽代碼
我們首先會初始化一個Q表,用于記錄狀態-動作對的值,每個episode中的每一步都會根據下列公式更新一次Q表
這里的迷宮問題,每一次episode的結束指的是到達終點狀態5。為了簡單起見,這里將學習率設為1,更新公式變為
另外,將衰減系數γ設為0.8。Q表初始化為一個5×5的全0矩陣。每次這樣更新,最終Q表會收斂到一個矩陣。
最終Q表收斂為
因此,也可以得到最優路徑如下紅色箭頭所示
Python代碼:
import numpy as np GAMMA = 0.8 Q = np.zeros((6,6)) R=np.asarray([[-1,-1,-1,-1,0,-1],[-1,-1,-1,0,-1,100],[-1,-1,-1,0,-1,-1],[-1,0, 0, -1,0,-1],[0,-1,-1,0,-1,100],[-1,0,-1,-1,0,100]]) def getMaxQ(state):return max(Q[state, :]) def QLearning(state):curAction = Nonefor action in range(6):if(R[state][action] == -1):Q[state, action]=0else:curAction = actionQ[state,action]=R[state][action]+GAMMA * getMaxQ(curAction) count=0 while count<1000:for i in range(6):QLearning(i)count+=1 print(Q/5)Q-Learning方法很好的解決了這個迷宮問題,但是這終究只是一個小問題(狀態空間和動作空間都很小),實際情況下,大部分問題都是有巨大的狀態空間或者動作空間,想建立一個Q表,內存是絕對不允許的,而且數據量和時間開銷也是個問題。
3 值函數近似與DQN
值函數近似(Function Approximation)的方法就是為了解決狀態空間過大,也稱為“維度災難”的問題。通過用函數而不是Q表來表示 ,這個函數可以是線性的也可以使非線性的。
其中ω稱為“權重”。那怎么把這個權重求出來,即擬合出這樣一個合適的函數呢?這里就要結合機器學習算法里的一些有監督學習算法,對輸入的狀態提取特征作為輸入,通過MC/TD計算出值函數作為輸出,然后對函數參數 進行訓練,直到收斂。這里主要說的是回歸算法,比如線性回歸、決策樹、神經網絡等。
這里,就可以引入DQN(Deep Q-Network)了,實際上它就是Q-Learning和神經網絡的結合,將Q-Learning的Q表變成了Q-Network。
好,現在關鍵問題來了。這么去訓練這個網絡呢?換句話說,怎么去確定網絡參ω呢?第一,我們需要一個Loss Function;第二,我們需要足夠的訓練樣本。
訓練樣本好說,通過epsilon-greedy策略去生成就好。回憶一下Q-Learning,我們更新Q表是利用每步的reward和當前Q表來迭代的。那么我們可以用這個計算出來的Q值作為監督學習的“標簽”來設計Loss Function,我們采用如下形式,即近似值和真實值的均方差
采用隨機梯度下降法(SGD)來迭代求解,得到我們想要的,具體公式和過程還請看參考資料,這里不展開了,其實就是求導啦。值得一提的是,上述公式中的q(·)根據不同方法算出來,其形式不一樣,比如利用MC,則為(回報);利用TD(0),則為
Q-Learning呢,就是
在David Silver的課里,他根據每次更新所參與樣本量的不同把更新方法分為增量法(Incremental Methods)和批處理法(Batch Methods)。前者是來一個數據就更新一次,后者是先攢一堆樣本,再從中采樣一部分拿來更新Q網絡,稱之為“經驗回放”,實際上DeepMind提出的DQN就是采用了經驗回放的方法。為什么要采用經驗回放的方法?因為對神經網絡進行訓練時,假設樣本是獨立同分布的。而通過強化學習采集到的數據之間存在著關聯性,利用這些數據進行順序訓練,神經網絡當然不穩定。經驗回放可以打破數據間的關聯。
最后附上DQN的偽代碼
學到這里,其實可以做一個階段性總結了,強化學習算法的基本框架可以用下圖概括
參考文獻
[1]Reinforcement Learning: An Introduction - Chapter 9: On-policy Prediction with Approximation
[2]Reinforcement Learning: An Introduction - Chapter 10: On-policy Control with Approximation
[3]David Silver’s RL Course Lecture 6 - Value Function Approximation (video, slides)
[4]DQN從入門到放棄5 深度解讀DQN算法
[5]一條咸魚的強化學習之路6之值函數近似(Value Function Approximation)和DQN
總結
以上是生活随笔為你收集整理的强化学习扫盲贴:从Q-learning到DQN的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新分类!全总结!最新Awesome-SL
- 下一篇: 科研福利!国内TOP3的超算中心,免费领