强化学习——Qlearning
前言
在控制決策領域里面強化學習還是占很重比例的,最近出了幾篇角色控制的論文需要研究,其中部分涉及到強化學習,都有開源,有興趣可以點開看看:
A Deep Learning Framework For Character Motion Synthesis and Editing
Phase-Functioned Neural Networks for Character Control
Terrain-Adaptive Locomotion Skills Using Deep Reinforcement Learning
DeepLoco: Dynamic Locomotion Skills Using Hierarchical Deep Reinforcement Learning
DeepMimic: Example-Guided Deep Reinforcement Learning of Physics-Based Character Skills
為了看懂這些文章,還是得對強化學習做一個基本了解,看文章的時候再去針對具體的方法作深入了解,這里就先看看最基本的Q-learning,其實在強化學習中有一個很重要的理論知識叫做馬爾科夫決策過程(Markov Decision Process,MDP),建議沒事的時候看看
Markov Decision Processes
而Q-learnging就是解決馬爾科夫決策問題的一個方法,參考博文:
增強學習入門之Q-Learning
走近流行強化學習算法:最優Q-Learning
如何用簡單例子講解 Q - learning 的具體過程?
理論
在學習馬爾科夫鏈的時候,我有一篇譯文《馬爾科夫鏈和馬爾科夫鏈蒙特卡洛方法》中提到了對于馬爾科夫鏈,存在唯一的一個穩態分布,也就是說當馬爾科夫鏈達到穩態分布以后,其后得到的所有轉移狀態都具有相同的概率分布。而Q-learning的最終目的就是利用價值迭代算法尋找最優穩態(策略)。
通俗點將Q-learning的根本目的就是尋找在某種狀態下采取某種策略得到的價值是多少,比如踩雷,在某個格子,我標雷或者點開,如果炸了,就懲罰,如果沒炸就獎勵
類似于隱馬爾科夫模型(HMM),我們也需要提前知道一些變量,以掃雷為例:
- S:狀態,當前在哪個格子上
- A:行為,對當前格子標雷還是踩下去
- r:長期獎勵和短期獎勵的折扣因子,短期獎勵就是說炸了我就扣分扣到你懷疑人生,長期獎勵就是價值函數,即根據以往經驗,我去下一個格子標雷或者踩下去是個啥情況
- P:狀態轉移矩陣,維度是[行為*狀態],與HMM不同的是,Qlearning是依據狀態轉移和采取的行動得到下一個狀態,即當前格子選擇完處理行為后,下一個格子我會去哪里踩
- R:短期獎勵
最終目的:
- Q:價值函數
更新價值函數的迭代流程:
- 初始化當前狀態:踩到哪個格子了
- 在當前狀態下采取哪個行動(標雷,踩下去)
- 計算每種行動獲得的反饋,計算哪個行動得到最大的價值
- 根據狀態轉移矩陣得到下一次我可能去探雷的位置,重復2和3步驟
其中最主要的是怎么獲取行動反饋,答案就是一句長期獎勵和短期獎勵,大概意思就是以下兩項的和:
- 短期獎勵:R[當前狀態][當前行為]
- 長期獎勵:折扣因子* 依據當前狀態和行為轉移到下一個狀態后再采取的所有可能行為中依據以往經驗能得到的最大獎勵,即
r×max(q[下一個狀態][所有的下一個行為])r\times max(q[下一個狀態][所有的下一個行為]) r×max(q[下一個狀態][所有的下一個行為])
然后根據這個最大獎勵更新Q[當前狀態][當前行為]
Q[當前狀態][當前行為]=(1?α)Q[當前狀態][當前行為]+α(R+r×max(Q[下一個狀態][所有的行為]))Q[當前狀態][當前行為]=(1-\alpha)Q[當前狀態][當前行為]+\alpha (R+r\times max(Q[下一個狀態][所有的行為])) Q[當前狀態][當前行為]=(1?α)Q[當前狀態][當前行為]+α(R+r×max(Q[下一個狀態][所有的行為]))
其實這部分為看到了好幾種更新方法: - 莫凡Python上面的
你沒看錯,理論到此結束,最主要的就是如何依據短期利益和長期利益去確定當前狀態下采取行動所獲得的最大獎勵。
-
知乎上@牛阿的回答
-
參考博客1的方法
Q=R+r?max(Q[next_state][action_next])Q=R+r*max(Q[next\_state][action\_next]) Q=R+r?max(Q[next_state][action_next]) -
參考博客2的方法更奇怪,這里就不貼了額,有興趣自己去看看
不過所有的代碼意思幾乎都是在長遠利益中選擇最大值,但是長遠利益的計算方法有所不同,最后更新方法也有點區別,這個可能是屬于不同的更新算法,后續繼續學習應該能知道
偽代碼實現:
state=1;//把踩雷游戲的最左上角的格子當做初始狀態 while !finish_game:action=random(0,1);//0是標記雷,1是踩下去next_state=P[state][action];//依據當前狀態和行為得到下一個位置for next_action in [0,1]//踩雷和標雷都計算temp_reward[next_state][next_action]=Q[next_state][next_action]Q[state][action]=(1-a)*Q[state][aciton]+a*[R+max(temp_reward[nextstate][:])]貌似看著不難,后面找個啥例子再深入了解一波。
后記
這里就是初步接觸強化學習,了解何為行為與獎勵,這里有一個憤怒小鳥的強化學習代碼,有興趣去玩玩:
https://github.com/SarvagyaVaish/FlappyBirdRL
總結
以上是生活随笔為你收集整理的强化学习——Qlearning的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【TensorFlow-windows】
- 下一篇: 【TensorFlow-serving】