前言
一個多月前第一次參加打卡營,加了交流羣。然後看到羣裏面有新的,本來想着觀衆模式,畢竟高端詞彙。但隨着下班時間不是無聊澆水活動就是其他網站戲耍。除了第一天臨時加班沒有看,後面的幾次直播都看了。發現關鍵學習修改點很簡單,後期的話在羣裏看到各種討論的數據改造,就沒有思路了,試試玩玩還是不錯的。
摘要
PARL GYM 強化訓練
背景
由於上次有python各種不會的經驗,然後我就專門搜了一下python的相關快查指令。gym的使用手冊通過命令行看貌似比較少。parl系列的比較齊全點,但是參數例如激活函數由於以前沒有接觸過,因此可選取值不怎麼清楚。
from parl.algorithms import DDPG
help(DDPG)
from paddle.utils.plot import Ploter
help(layers.fc)
import gym
gym.__all__
dir(gym.make)
help(gym.make)
help(gym)
由於這次參加課程比較早,自己用租任空閒的服務器要部署python環境,發現由於當時服務器沒有注重運行內存,造成下載安裝其他配套環境失敗。最後還沒有本地化運行。這個課程看到一些人有本地化運行的化,看起來感覺會比較直觀。
資源
官網: http://gym.openai.com/envs/
aistudio實驗環境平臺:https://aistudio.baidu.com/aistudio/index
paddle的github首頁:https://github.com/PaddlePaddle
paddle的github強化學習庫即PARL:https://github.com/PaddlePaddle/PARL
本次課程科科講師提供的作業樣例清單:https://github.com/PaddlePaddle/PARL/tree/develop/examples/tutorials/homework
主要課程
第一天直播主要講解學習使用,依舊非常簡單,基本文件已經全部提供,只需順序執行,當然由於網絡問題等,存在裝載套件等問題。我操作比較晚,微信羣中基本討論了還給出瞭解決方案,因此跟着改動嘗試非常快。
第二日課程,正式開始函數填空,表格型的處理,並主要涉及了sarsa和Q-learning。學過動態規劃的都覺得挺像的。就是涉及到env有點,比較晦澀,涉及的環境不是很清楚,我在gym看了一個源碼,就是粗糙看了一下,覺得這個env可以是深搜廣搜的截支。類似大學經典N皇后問題,這個env可以類比是棋盤佈局和規則要馬步行走以及不能對面的中,而sarsa和Qlearning就是類似枚舉出所有,並會逐漸優化最優解,這個過程類型dijkstra這種,用於取最優解最短路徑,而這裏的不一樣的是具有隨機性,或者是偏向優解而不一定要最優解。
第三日課程,爲神經網絡構造DQN(經驗池)解決MountainCar,一個小車從V型底部爬坡的。主要網絡模型組裝,涉及激活函數和網絡層。相對來說這個涉及env沒有具體查看,因此對網絡的處理模式還是比較不是那麼清晰。
第四日課程,爲神經網絡構造PG解決乒乓球問題,區別爲通過定義損失函數更新模型。數據挖掘課程有交叉熵,概率論和數理統計有近似然,數值計算有誤差損失,這種應該和這些構建應該有這些基礎知識的應用。
最後一次的大大作業是四軸飛行器懸浮問題,採用評估模型、演示模型以及經驗池相結合的DDPG神經網絡解決方案,講師給的建議是四個電壓儘可能的相近,保持平穩。跟着高手學習,後面通過帶入調整四個參數極差較小的情況。整個收斂比較穩定,雖然我的測試評估的結果沒有很高,但相對僅僅調整參數,整個收斂比較平穩。
class QuadrotorAgent(parl.Agent): def __init__(self, algorithm, obs_dim, act_dim=5):
-------
act_dim=5
model = QuadrotorModel(act_dim=act_dim) algorithm = DDPG(model, gamma=GAMMA, tau=TAU, actor_lr=alr, critic_lr=clr) agent =QuadrotorAgent(algorithm,obs_dim=obs_dim,act_dim=act_dim)
def run_episode(env, agent, rpm):
obs = env.reset()
total_reward, steps = 0, 0
while True:
steps += 1
batch_obs = np.expand_dims(obs, axis=0)
action = agent.predict(batch_obs.astype('float32'))
action = np.squeeze(action)
actoff=action[1:5]
actcenter=action[0]
action_new= [i*0.15 + actcenter for i in actoff ]
#print(action_new)
# 給輸出動作增加探索擾動,輸出限制在 [-1.0, 1.0] 範圍內
action_new = np.clip(np.random.normal(action_new, 1), -1.0, 1.0)
# 動作映射到對應的 實際動作取值範圍 內, action_mapping是從parl.utils那裏import進來的函數
action_new = action_mapping(action_new, env.action_space.low[0], env.action_space.high[0])
#print(action)
next_obs, reward, done, info = env.step(action_new)
rpm.append(obs, action, REWARD_SCALE * reward, next_obs, done)
if rpm.size() > MEMORY_WARMUP_SIZE:
batch_obs, batch_action, batch_reward, batch_next_obs, \
batch_terminal = rpm.sample_batch(BATCH_SIZE)
critic_cost = agent.learn(batch_obs, batch_action, batch_reward,
batch_next_obs, batch_terminal)
obs = next_obs
total_reward += reward
if done:
break
return total_reward, steps
# 評估 agent, 跑 5 個episode,總reward求平均
def evaluate(env, agent):
eval_reward = []
for i in range(5):
obs = env.reset()
total_reward, steps = 0, 0
while True:
batch_obs = np.expand_dims(obs, axis=0)
action = agent.predict(batch_obs.astype('float32'))
action = np.squeeze(action)
actoff=action[1:5]
actcenter=action[0]
action_new=[i*0.15+actcenter for i in actoff]
action_new = np.clip(np.random.normal(action_new, 1), -1.0, 1.0)
action_new = action_mapping(action_new, env.action_space.low[0],
env.action_space.high[0])
next_obs, reward, done, info = env.step(action_new)
obs = next_obs
total_reward += reward
steps += 1
if done:
break
eval_reward.append(total_reward)
return np.mean(eval_reward)
繪圖是從paddle的其他樣例裏面抓出來用的
#繪圖定義 執行器初始化
%matplotlib inline
train_prompt = "reward"
from paddle.utils.plot import Ploter
plot_prompt = Ploter(train_prompt,"none")
for evaluate_reward in range(10):
plot_prompt.append(train_prompt, evaluate_reward, evaluate_reward)
plot_prompt.plot()
感言
感謝科科老師即相關團隊的付出,微信羣中的討論也受益匪淺。此次強化學習中又一次認識了以前的理論知識奠定基礎的重要性。以前只認識到天氣預測等和分類,對於以前上課的課件涉及圖像識別的等領域的重要性沒有深刻了解,過於注重計算方法而沒有轉換到實際應用的全面瞭解,因此後期在圖像識別語音識別等都沒有回憶起,對於學過的決策樹之類也沒有其應用的概念。此次學習對於人工,數據挖掘、概率論和數理統計的應用有了更全面的認識,當然具體的前後關聯調整以及具體落實到商業設施上面的應用還有待了解。