飛槳paddlepaddle強化學習打卡營

總體評價:課程的定位很精確,因爲時間受限,不可能從理論推導開始教學。面向應用的方式,會積累一定學習的興趣,也便於後續的學習。課程知識的分佈也比較合理,分別是:面對離散動作的Q-learning和Sarsa;因爲不可數的動作和狀態組合與神經網絡結合(擬合的方式),面向連續動作的DQN,採取隨機策略的policy-gradient以及採取確定性策略的DDPG。這些只能算是RL最入門基礎的算法(只包括應用),之後對原理的學習需要補齊。
個人感受:首先用PARL實現RL算法的框架性很強(針對每一類算法而言),對於初學者而言需要改變的決定算法本質的數行代碼。其次,RL對複雜問題的訓練時間真的很長,需要耐心。然後,相比於調參,算法或者技巧的作用要更大(在大作業中體現非常明顯)。最後,科科老師天下第一。

Day1初步瞭解相關概念:

1.基本組成:所以本質就是agent做出與env的交互,通過其執行action和得到reward
在這裏插入圖片描述
2.強化學習(RL)給的是延遲獎勵,即機器做出預測後纔會給出反饋。
3.強化學習和深度學習的關係:兩者有交集,即深度強化學習(DeepRL,利用類似supervised learning的模型結合RL的方法,輸出action)
在這裏插入圖片描述

4.與監督學習的區別:強化學習是決策,監督學習是認知(比如遇到一頭熊向你招手,RL給出裝死或者快跑,監督學習說這就是頭熊;當熊向你衝來,RL給你快裝死(因爲生存機率大),supervised learning給你說這還是頭熊啊)
5.Agent學習的兩種方案:基於價值(value-based)具體的算法有(確定性策略):Sarsa、DQN、Q-learning;基於策略(policy-based),具體的算法有(隨機性策略):policy-gradient。
總體評價:
基於價值會向固定方向走,基於策略隨機性更高一些。

6.gym是一個(可視化的)RL評估環境。核心接口是environment,核心的接口有以下:reset(),step(action),render()。
step(action)做的就是一步交互,返回observation(對環境的觀察),reward(獎勵,有正負),done(是否需要重置)和info(調試信息)。

7.PARL是百度的一個RL算法庫,性能據說全世界領先。而且集羣部署很靈活。
在這裏插入圖片描述

Day 2 可數動作

python基礎相關:
1.np.random.uniform(0, 1) 在一定範圍內,樣點均勻分佈,隨機取樣(定義是左開右閉)#常用於根據table的Q值選動作
2.np.random.choice(a, size=None, replace=True, p=None)從a中抽取size個,replace表示是否放回抽取 #用於有一定概率隨機探索選取一個動作

1. Q-learning簡介
• Q-learning也是採用Q表格的方式存儲Q值(狀態動作價值),決策部分與Sarsa是一樣的,採用ε-greedy方式增加探索。
• Q-learning跟Sarsa不一樣的地方是更新Q表格的方式。
• Sarsa是on-policy的更新方式,先做出動作再更新。
• Q-learning是off-policy的更新方式,更新learn()時無需獲取下一步實際做出的動作next_action,並假設下一步動作是取最大Q值的動作。
• Q-learning的更新公式爲:
在這裏插入圖片描述

2. Sarsa 簡介
• Sarsa全稱是state-action-reward-state’-action’,目的是學習特定的state下,特定action的價值Q,最終建立和優化一個Q表格,以state爲行,action爲列,根據與環境交互得到的reward來更新Q表格,更新公式爲:
在這裏插入圖片描述
• Sarsa在訓練中爲了更好的探索環境,採用ε-greedy方式來訓練,有一定概率隨機選擇動作輸出。

ε-greed方法:
本質是一種以一定概率探索的策略,對應到代碼中:首先,建立的agent包含此成員;其次,在採樣輸出動作的時候。
在這裏插入圖片描述

Q-learning和sarsa區別
簡單講就是Target_Q更新(分別是Q-learning和Sarsa)
Q-learning選的是Q的下一步觀測值列最大值,(off-policy)不需要at+1(下一步實際執行的動作),默認下一個action就是最優的動作。(相當於就是“膽子更大”,表現爲貼着懸崖走)
Sarsa選的是Q【下一步觀測值】【下一步動作】,只優化策略(on-policy 離懸崖最遠)
對應到代碼中的區別就如下:
在這裏插入圖片描述
在這裏插入圖片描述

學習策略和與環境交互的策略上:
Q-learning:一個目標策略,一個行爲策略
Sarsa:相同都是目標策略

Day3 DQN

爲了解決Day2遇到的使用Q表格存儲狀態數量有限的問題,引出DQN的神經網絡求解RL的方法。本質是用神經網絡近似替代Q表格。

DQN本質還是Q-learning算法,也同樣可以使用
ε-greedy的方法訓練。
除此之外,DQN還使用了兩個tricks使得網絡的更新迭代更穩定。
1.
經驗回放 Experience Replay:主要解決樣本關聯性和利用效率的問題。使用一個經驗池存儲多條經驗s,a,r,s’,再從中隨機抽取一批數據送去訓練。
舉個例子:類似於一個軍師(traget policy)一個士兵(behavior policy),士兵通過戰鬥獲取經驗傳給經驗池(append方法),軍師不斷總結經驗(sample方法取)更新Q表格。相當於是軍師可以從replay memory隨機取(消除時間關聯)batch_size的經驗。

2.固定Q目標 Fixed-Q-Target:主要解決算法訓練不穩定的問題。複製一個和原來Q網絡結構一樣的Target Q網絡,用於計算Q目標值。
Model 和target_Model(sync方法把model同步到targetmodel)

Q和target_Q
用Q網絡產生action,targetQ產生Q目標值,網絡就是優化二者之間的loss(learn函數的作用)#DQN的精髓
DQN訓練模型的大體框架如下
1.模型訓練的超參數:LEARN_FREQ(不是每個step都學習,這是一個積攢經驗的做法)、
MEMORY_SIZE(replay佔用內存,經驗池,實現trick:經驗回放)、
MEMORY_WARMUP_SIZE(預存的經驗)、
BATCH_SIZE(從replay memory每次讀取個數)、
LEARNING_RATE(學習率)、
GAMMA(reward的衰減因子)。

2.搭建model、Algorithm、Agent
Model:神經網絡結構,包括網絡結構定義,值傳遞(輸入輸出與網絡結構的函數關係)
Algorithm:定義損失函數更新model。比如一個DQN算法類,參數有model,action空間的維度,gamma,lr。其中的predict函數就是通過model前向傳播得到action。learn函數:先計算target_Q(記得阻止target_model的梯度傳遞,因爲paddle優化器會找到並更新所有相關參數),獲取預測Q,計算二者均方差的到loss,結果扔給優化方法。

Day4 Policy-gradient策略梯度求解策略

從這一節開始訓練市場大幅度增加,老師說6h是正常情況。
1.基於策略(policy-based)直接輸出動作概率
區別:
value-based產生Q網絡、優化Q網絡,間接確定策略。輸出的是確定策略。
policy-base 神經網絡擬合policy直接輸出動作概率,採樣隨機輸出動作。
例如:石頭剪刀布,訓練好的Q網絡輸出的是固定的;而另一個不固定。

2.優化方向:每個episode總reward最大。
policy網絡的action沒有標籤,用目標函數Rθ確定優化方向(梯度上升過程)。

  1. Loss函數類比cross entrophy(但是需要乘一個獎勵回報Gt,根據這個標識優化力度)
    需要注意,policy-gradient只是一種想法。在解決實際問題時,用的是算法。比如Day4解決Carpole問題時用的是REINFORCE算法。

Day5 DDPG

提出的目的是爲了解決DQN無法輸出連續動作。首先用於仿真的環境必然是連續動作的輸入。其次,在繼承DQN經驗回放和固定Q網絡的方法後,使用Actor-Critic的模型結構(這裏的名字是一個形象地類比)

既然最後的大作業拿了第一,就來分析一下我的解決方法。我的探索過程大概持續了三天三夜(訓練過程睡覺)。

首先,使用Day5給出的DDPG參考代碼是無法達到老師給的效果的。最高的測試成績大概在5600左右。可能有以下幾種原因:輸出的動作並不是相近的,收斂性真的不好;訓練輪數或者超參數的原因(個人認爲可以基本排除:大致50萬步得到了100萬步中最好的成績,超參數也經過了調整,效果並不好)。

其次,老師提到當輸出的4個動作值相近的時候比較容易收斂。這個在討論區有同學做過了測試,完全相等沒有這個效果。於是可以想到對於每一個動作,應該是基礎值上加一個小的偏移量。我一開始的做法是對所有輸出求平均再加上自己本身值的0.01倍,訓練結果不是很好。反思可能的原因是:平均值由於是由4個動作的輸出確定,網絡在優化的時候無法跨過這個mean求梯度(不是針對性的優化)。
之後有大佬在羣裏說把網絡輸出size改成5。在與環境交互前,通過一個主值加上剩餘四個的一定倍數(0.2),作爲Actor輸出的 動作。經過一晚上的訓練,得到了最後9700的評分。這裏對動作值調整的位置有一定的講究:
+
這一步我測試過,要想達到如此效果必須加在探索前。(原因未知)
由於此時官方評分標準對100分的要求是過14000。所以我扒了以下PARL在Github中給的DDPG的demo。發現區別在於Model(actor和Critic)的結構不同,於是又去改這部分。結果沒有簡單結構的成績高。(原因未知)

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