百度飞桨7日营——世界冠军带你从零实践强化学习总结
課程大綱
學習感悟
強化學習一直是我非常感興趣的領域。為了了解強化學習的原理,我也曾看過伯克利大學的CS 294-112課程來了解相關的知識,但是一直沒有找到合適的教程去實踐體驗一下。這也是7日營里科科老師提到的國內強化學習存在的一個問題,缺少一個難度適中的實踐教程,導致強化學習的門檻較高。
幸運的是,百度飛槳推出了這期7日營。全程學習下來我能感受到這個課程真的誠意滿滿。首先,這門課的難度適中,省略了絕大部分公式推導,著眼于讓大家能夠盡快上手體驗一下強化學習。這個切入點我覺得是非常合適的,市面上不缺深入推導公式的課程,也不缺科普,缺的正是這種讓人能夠體驗強化學習,引起學習興趣的課程。
省略公式推導并不意味著這次課程的含金量低,相反,科科老師對于sarsa、Q-learning、DQN、DDPG這些強化學習算法的原理都講得非常全面且淺顯易懂,關鍵創新點也沒有落下。建議大家去看看課程,這里就不贅述。
最大的收獲
圖一是DQN算法的流程,從這個流程圖可以很容易看出model、agent、env的交互流程以及obs、action、loss在其中是如何傳遞的。圖二則是在圖一的基礎上,進行代碼層面的抽象,把agent、model和algorithm封裝起來。結合這兩張圖去看代碼就會發現這個代碼層面的封裝真的做得非常好,邏輯清晰。如果想改變網絡結構,只需改動model中的網絡結構即可。如果想對模型更新的算法進行改動,則只需改動algorithm。如果想在交互層面上做文章,則在agent里修改。這樣的設計允許我們在解決不同的強化學習任務時,只需做盡可能少的改動,大部分代碼都直接復制粘貼即可完成遷移。
實際上對于每個算法,科科老師都有給出對應算法的流程圖。對于看過的論文,學過的方法,我一直苦惱于沒法用比較形象的方式表達出來,與別人交流的時候通過文字描述又會啰嗦一大堆事后想起來完全沒必要的解釋。科科老師這種配圖解釋模型運作機理的形式,以及由此延伸出的代碼設計方法都使我深受啟發。
對強化學習的理解
我們來想象一個任務場景,一個探險家(agent)手持一個設備(algorithm,記錄Q信息)在漆黑的地穴(env)中尋找寶藏。
地穴就是強化學習中的environment,又像游戲中的裁判。它需要具備的功能有以下幾點:
- 狀態更新(step)。輸入當前state和action,能夠計算出下一個state是什么。
- 輸出獎勵(step)。根據self.state,計算當前reward的功能。
- 額外的規則判斷(done)。例如,什么時候任務結束,任務的一些邊界設置等等。
- 額外的功能。任務重置(reset),顯示圖像(render)等。
探險家就是強化學習中的agent,它一般是與環境配套的(因為不同的環境需要不同的action來交互,就像礦洞探險需要礦工,菜田探險需要菜農,海底尋寶需要海王一樣,agent都要換,但各個agent之間外在區別估計就在于obs和action接口的不同)。它需要具備的功能有以下幾點:
- 作出行為決策(sample)。根據手中的指示器/隨意走,執行一個行為action,與環境進行交互。
- 看指示器(predict)。看指示器的結果,借鑒結果來行動。sample其實常常包含predict,區別在于sample獲得的動作有可能是看指示器得到的,有依據的,也可能是隨意的。
- 更新手中的指示器(learn)。根據自己試驗得到的經驗更新指示器。
- 拿到一個指示器的殼子(build_program)。對于sarsa和Q-learning方法來說,agent里其實沒有build_program這個函數,但這并不意味著這個探險家不需要拿到指示器殼子。仔細觀察sarsa和Q-learning中agent的代碼就會發現里面有一個Q = np.zeros(…)這就是他們的build_program,只是這個指示器太簡單了,沒必要寫個函數,甚至不需要額外的指示器核心(algorithm),殼子就已經是本體了。而對于DQN和DDPG這種復雜點的方法來說,就需要一個build_program函數。那么這兩種有什么區別呢?sarsa和Q-learning中的指示器就像是一個簡陋的地圖,不需要額外設計核心(algorithm),而DQN和DDPG中的指示器就像是一個導航/小度智能/百度之類的,復雜的指示器。由于它復雜,殼子和核心(algorithm)要分開搭。所以在agent可以先搭建一個指示器的殼子build_program。在示例代碼中我們可以看到,它實現的功能就是初始化兩張動態圖。只要能和里面的核心algorithm交互就行,真正的算法額外抽象出來,這樣也方便更換不同的算法。
指示器核心(algorithm)就是幫助我們做決策(action)的。它需要具備以下功能:
- 預測(predict)。這里預測的結果可以有兩個,action和Q。action是我們的終極預測目標,但是我們缺少預測action的依據。reward對于環境而言是已知量,但它是僅與env中state相關的量,與action無關。如果我們能夠將reward和action產生聯系,那么我們就能通過已知的reward來選擇action。Q就是我們構造的聯系。Q就像是對環境reward的一個拓展,對于爬蟲找終點任務而言,每個state有reward,但是每個格子state對應的各個action的reward’是不可知的;對于一些游戲任務而言,各個狀態對應多少分通常是可知的,但是在各個狀態做出什么action的reward’是不可知的。Q則幫助我們將僅與state相關的reward拓展到了和state、action都相關,從而讓我們對action的預測有了依據。
對于sarsa和Q-learning而言,Q的更新依靠的是公式。而action的選擇依據就是選擇Q最大的action。對于DQN和DDPG而言,由于狀態空間連續,一個簡陋的表格記不下了,那就用一個網絡來記錄Q信息,這就是critic表格。而actor網絡的作用就是在給定state下,選擇使得Q最大的action。所以DDPG的網絡結構是actor網絡輸出action,使得critic網絡輸出的Q最大。 - 學習(learn)。關于學習,我有一個個人理解,不知道正確與否,就是對于給定的任務。只要它每個狀態的reward是固定的,那么最終能學到的Q信息也是固定的。以蟲子走迷宮為例,4*4格的迷宮,終點在(4, 4),終點reward是1,其余全是0。Q網絡的更新就是一個迭代的過程,根據那條Q的更新公式(粘貼不上來)。不斷將終點的reward蔓延到所有state的所有action上,就像波紋一樣傳遞(源?)。這個蔓延是單向的,因為全圖只有一個reward。比如衰減因子是0.6,那么(4,3)和(3, 4)的對應方向的reward就是0.6,再往前一格的對應動作Q就是0.36,不斷蔓延覆蓋整個表格。如果另外一個點也有reward,那么影響就復合。最終迭代到穩定的情況時,表格就固定下來了。連續動作的估計也是這個道理,只要state空間每個點對應的reward是固定的,最終Q空間也會是固定的,critic網絡也會有一個學習的極限。
- 額外的設計。如DQN和DDPG中固定Q目標要用到的更新網絡函數。
上述兩個功能一個是指導我們做出決策,相當于在指示器界面顯示個答案,讓探險家去執行。而另一個就是讓自己不斷完善。個人感覺只要能具備這兩個功能,都能作為algorithm【似乎找到了水論文的切入點】。
舉個例子作為對上述理解的總結吧,正好也作為終極項目的思路記錄。
以股票預測為例。首先這是一個連續狀態連續動作的任務,因為股價state和買入賣出股數action都是連續的,可以使用DDPG。
思考如果要我們設計這個任務的env,要怎么做。為了降低難度,只對一支股票進行操作。那obs/state應該是什么呢,obs應該是有助于判斷買入賣出操作的依據,比如歷史峰值,k線,上一操作日收盤價,開盤價,前幾個時刻的買入賣出數,當前剩余資金,當前已有股數,當前時刻股價等等。然后返回的reward肯定是利潤值,終止條件是破產或者超過一定天數。env的step函數就是加載下一刻的股價(agent與env交互產生的影響可能只在于前幾個時刻的買入賣出數,當前剩余資金,當前已有股數之類的),并且計算state的幾個值,還有當前利潤。
agent自然就是買入賣出的股數,用正負浮點數表示就行,但是這樣的話action的上下限無法確定,因為手中資金一直在變,可以買賣的股數也在變。所以設置action范圍為(-1, 1),表示用當前剩余資金的比例來操作。
algorithm就是調參的事了,看obs維度來確定結構。具體細節還沒想好,待定吧。
總結
以上是生活随笔為你收集整理的百度飞桨7日营——世界冠军带你从零实践强化学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏建模控件Aspose.3D for
- 下一篇: 当你开始听不清这个世界的声音