久久久精品2019中文字幕神马_欧美亚洲一区三区_欧美大人香蕉在线_精品88久久久久88久久久_中文字幕一区二区三区在线播放 _精品国产一区二区三区久久影院_欧洲av在线精品_粉嫩av一区二区三区_亚洲欧美一区二区三区极速播放_国产亚洲精品久久

首頁 > 互聯網

Q-learning解決懸崖問題 獨家焦點

來源:程序員客棧 時間:2023-06-23 21:07:32

Q-learning是一個經典的強化學習算法,是一種基于價值(Value-based)的算法,通過維護和更新一個價值表格(Q表格)進行學習和預測。


(資料圖片僅供參考)

Q-learning是一種off-policy的策略,也就是說,它的行動策略和Q表格的更新策略是不一樣的。

行動時,Q-learning會采用epsilon-greedy的方式嘗試多種可能動作。

更新時,Q-learning會采用潛在收益最大化的動作進行價值更新。

總體來說,Q-learning是一個非常勇敢的策略,在有限動作和有限狀態情況下,它能夠收斂找到全局最優策略。

公眾號算法美食屋后臺回復關鍵詞:torchkeras,獲取本文notebook源代碼~

〇,強化學習基本概念 1, 環境(env)和智能體(agent)

在第n步,agent處于狀態 state(n)中,然后采取行動action(n),env給agent獎勵reward(n+1),同時agent的狀態變成 state(n+1)

---reward(n+1),state(n+1)-->envagent(state)<------action(n)----------

以我們玩一個俄羅斯方塊游戲為例。

環境env就是這個游戲背后的程序,智能體agent就是玩家。

假設現在是第n步,state(n)就是目前游戲所處的狀態,可以表示為一個矩陣,也就是游戲界面每個格子的明暗狀態。

我們可以采取某個 action(n) (向左,向右,向下,變形)。

然后我們會獲得一個獎勵reward(n),即得分。獎勵很多時候是稀疏的,即大部分時候為0,操作很多步才有一個不為0的獎勵。

同時游戲界面發生變化,狀態由 state(n) 變成 state(n+1)。

2, 馬爾科夫交互鏈

env和agent交互作用若干個步驟,到達結束狀態,通常叫做一個episode(片段)。

在俄羅斯方塊游戲的例子中,一局完整的游戲構成一個馬爾科夫交互鏈,叫做一個episode.

之所以叫做馬爾科夫交互鏈,是因為這個過程滿足馬爾科夫假設。

第n+1步驟的狀態state(n+1)和獎勵reward(n+1)只和第n步驟的狀態stage(n)和action(n)有關,而與之前的狀態和action無關。

馬爾科夫假設要求我們在設計state和action的時候,要考慮到所有相關變量。

并且,只要設計出合理的state變量和action變量,任何游戲都可以表示為這樣一個馬爾科夫交互鏈。

3, 獎勵折現公式

為了衡量每個步驟中action的價值,需要將該步驟之后的獎勵,以及未來的全部獎勵按照類似金融學中的折現算法求和。

在俄羅斯方塊游戲的例子中,一個操作action的價值,不僅跟這個操作完成后立刻獲得的獎勵reward有關,還要考慮到這個操作的長遠影響。

但這種長遠影響不太好精確地計算,因為后面獲得的獎勵,不僅跟當前的action有關,還跟后面的操作有關,所以跟當前操作的相關性是小于1的。

作為簡化起見,我們通過類似金融學中現金流折現的方式將未來的獎勵全部折算到當前步驟。折算因子gamma一般取值在0.9~1.0之間。

4, epsilon-greedy 學習策略

訓練時使用epsilon探索,預測時使用greedy貪心。

訓練階段: 以一定epsilon概率選擇隨機動作,以(1-epsilon)選擇最大化Q(s,a)的動作。

預測階段: 貪心策略,直接選擇最大化Q(s,a)的動作。

為了讓模型去探索更優策略,我們在訓練過程中會允許模型以一定的概率去實施隨機動作,以便評估不同動作的價值。

這樣也能夠讓模型對狀態動作空間進行更分散的采樣,學到的結果也會更加魯棒。

但在測試過程,為了獲得更好的結果,我們應該采用預期價值最大的動作。

5, Q表格軟更新

獎勵折現公式對每個action的價值的計算方法是一種粗糙的估計算法。

不同的step或者不同的episode中,按照獎勵折現公式對相同state下相同action價值的評估的結果可能差異很大。

為了保持學習過程的穩定性,讓Q值不會過分受到某次評估的影響,我們采用一種軟更新的方式。

也就是我們在更新Q表格的時候,只讓Q值朝著折現公式計算結果靠近一點點(縮小差值),而不是直接調整為折現公式的計算結果。

這樣,我們最終的Q表格中action的價值結果相當是許多次不同episode不同step下獎勵折現公式計算結果的某種平均值。

一,準備環境

gym是一個常用的強化學習測試環境,可以用make創建環境。

env具有reset,step,render幾個方法。

懸崖問題

環境設計如下:

環境一共有48個state狀態。

其中T為目標位置,到達目標位置游戲結束。

10個用C表示的為懸崖,掉入懸崖會拉回到起始位置。

智能體設計如下:

智能體有4種動作action,0表示往上,1往右,2往下,3往左。

reward設計如下:

智能體每走一步都會有-1的reward。

這個問題希望訓練一個能夠盡可能快的從起始位置到達目標位置T的智能體Agent。

importgymimportnumpyasnpimporttimeimportmatplotlibimportmatplotlib.pyplotaspltfromIPythonimportdisplayprint("gym.__version__=",gym.__version__)%matplotlibinline#可視化函數:defshow_state(env,step,info=""):plt.figure(num=0,dpi=180)plt.clf()plt.imshow(env.render())plt.title("Step:%d%s"%(step,info))plt.axis("off")display.clear_output(wait=True)display.display(plt.gcf())env=gym.make("CliffWalking-v0",render_mode="rgb_array")#0up,1right,2down,3leftenv.reset()forstepinrange(20):time.sleep(0.2)action=np.random.randint(0,4)obs,reward,done,truncated,info=env.step(action)#env.render()show_state(env,step=step)#print("step{}:action{},obs{},reward{},done{},truncated{},info{}".format(\#step,action,obs,reward,done,truncated,info))display.clear_output(wait=True)

我們先來看看沒有訓練模型,按照隨機的方式會怎么走。

二,定義Agent

importtorchfromtorchimportnnclassQAgent(nn.Module):def__init__(self,obs_n,act_n,learning_rate=0.01,gamma=0.9,e_greed=0.1):super().__init__()self.act_n=act_n#動作維度,有幾個動作可選self.lr=learning_rate#學習率self.gamma=gamma#reward的衰減率self.epsilon=e_greed#按一定概率隨機選動作self.Q=nn.Parameter(torch.zeros((obs_n,act_n)),requires_grad=False)#根據輸入觀察值,采樣輸出的動作值,帶探索defsample(self,obs):ifnp.random.uniform(0,1)<(1.0-self.epsilon):#根據table的Q值選動作action=self.predict(obs)else:action=np.random.choice(self.act_n)#有一定概率隨機探索選取一個動作returnaction#根據輸入觀察值,預測輸出的動作值defforward(self,obs):Q_list=self.Q[obs,:]maxQ=Q_list.max()action_list=torch.where(Q_list==maxQ)[0].tolist()#maxQ可能對應多個actionaction=np.random.choice(action_list)returnaction@torch.no_grad()defpredict(self,obs):self.eval()returnself.forward(obs)#學習方法,也就是更新Q-table的方法deflearn(self,obs,action,reward,next_obs,done):"""on-policyobs:交互前的obs,s_taction:本次交互選擇的action,a_treward:本次動作獲得的獎勵rnext_obs:本次交互后的obs,s_t+1next_action:根據當前Q表格,針對next_obs會選擇的動作,a_t+1done:episode是否結束"""predict_Q=self.Q[obs,action]ifdone:target_Q=reward#沒有下一個狀態了else:target_Q=reward+self.gamma*self.Q[next_obs,:].max()#Q-learningself.Q[obs,action]+=self.lr*(target_Q-predict_Q)#修正q

我們創建一下env和agent.

#使用gym創建懸崖環境env=gym.make("CliffWalking-v0")#0up,1right,2down,3left#創建一個agent實例,輸入超參數agent=QAgent(obs_n=env.observation_space.n,act_n=env.action_space.n,learning_rate=0.1,gamma=0.9,e_greed=0.1)

三,訓練Agent

下面我們將套用torchkeras的訓練模版來對Agent進行訓練。

由于強化學習問題與常用的監督學習范式有很大的差異,所以我們對torchkeras的訓練模版在

StepRunner, EpochRunner這2個層級上都有少量的修改。

classDataLoader:def__init__(self,env,agent,stage="train"):self.env=envself.agent=agentself.stage=stagedef__iter__(self):obs,info=self.env.reset()#重置環境,重新開一局(即開始新的一個episode)action=self.agent.sample(obs)#根據算法選擇一個動作whileTrue:next_obs,reward,done,_,_=self.env.step(action)#與環境進行一個交互ifself.stage=="train":next_action=self.agent.sample(next_obs)#訓練階段使用探索-利用策略else:next_action=self.agent.predict(next_obs)#驗證階段使用模型預測結果yieldobs,action,reward,next_obs,doneaction=next_actionobs=next_obsifdone:breakdl_train=DataLoader(env,agent,stage="train")dl_train.size=1000dl_val=DataLoader(env,agent,stage="val")dl_val.size=200

importsys,datetimefromtqdmimporttqdmimportnumpyasnpfromaccelerateimportAcceleratorfromtorchkerasimportKerasModelimportpandasaspdfromtorchkeras.utilsimportis_jupyter,colorfulfromcopyimportdeepcopyclassStepRunner:def__init__(self,net,loss_fn,accelerator=None,stage="train",metrics_dict=None,optimizer=None,lr_scheduler=None):self.net,self.loss_fn,self.metrics_dict,self.stage=net,loss_fn,metrics_dict,stageself.optimizer,self.lr_scheduler=optimizer,lr_schedulerself.accelerator=acceleratorifacceleratorisnotNoneelseAccelerator()def__call__(self,batch):obs,action,reward,next_obs,done=batch#backward()ifself.stage=="train":self.net.learn(obs,action,reward,next_obs,done)#losses(orplainmetric)step_losses={self.stage+"_reward":reward,self.stage+"_done":1.0ifdoneelse0.0}#metrics(statefulmetric)step_metrics={}ifself.stage=="train":step_metrics["lr"]=self.net.lrreturnstep_losses,step_metricsclassEpochRunner:def__init__(self,steprunner,quiet=False):self.steprunner=steprunnerself.stage=steprunner.stageself.accelerator=steprunner.acceleratorself.net=steprunner.netself.quiet=quietdef__call__(self,dataloader):dataloader.agent=self.netn=dataloader.sizeifhasattr(dataloader,"size")elselen(dataloader)loop=tqdm(enumerate(dataloader,start=1),total=n,file=sys.stdout,disable=notself.accelerator.is_local_main_processorself.quiet,ncols=100)epoch_losses={}forstep,batchinloop:step_losses,step_metrics=self.steprunner(batch)step_log=dict(step_losses,**step_metrics)fork,vinstep_losses.items():epoch_losses[k]=epoch_losses.get(k,0.0)+vifstep_log[self.stage+"_done"]<1andstep0.5orstep==n:epoch_metrics=step_metricsepoch_metrics.update({self.stage+"_"+name:metric_fn.compute().item()forname,metric_fninself.steprunner.metrics_dict.items()})epoch_losses={k:vfork,vinepoch_losses.items()}epoch_log=dict(epoch_losses,**epoch_metrics)epoch_log[self.stage+"_step"]=steploop.set_postfix(**epoch_log)forname,metric_fninself.steprunner.metrics_dict.items():metric_fn.reset()loop.close()else:breakreturnepoch_logKerasModel.StepRunner=StepRunnerKerasModel.EpochRunner=EpochRunner

keras_model=KerasModel(net=agent,loss_fn=None)dfhistory=keras_model.fit(train_data=dl_train,val_data=dl_val,epochs=600,ckpt_path="checkpoint.pt",patience=500,monitor="val_reward",mode="max",callbacks=None,quiet=True,plot=True,cpu=True)

dfhistory["val_reward"].max()

-13.0

keras_model.load_ckpt("checkpoint.pt")agent=keras_model.net

四,測試Agent

deftest_agent(env,agent):total_reward=0obs,info=env.reset()step=0whileTrue:action=agent.predict(obs)#greedynext_obs,reward,done,_,_=env.step(action)total_reward+=rewardobs=next_obstime.sleep(0.5)show_state(env,step)step+=1ifdone:breakplt.close()returntotal_reward

#全部訓練結束,查看算法效果env=gym.make("CliffWalking-v0",render_mode="rgb_array")#0up,1right,2down,3lefttest_reward=test_agent(env,agent)print("testreward=%.1f"%(test_reward))

test reward = -13.0

可以看到,訓練完成后,這個agent非常機智地在懸崖邊上走了一個最優路線,但卻沒有掉到懸崖里去。

五,保存Agent

torch.save(keras_model.net.state_dict(),"best_ckpt.pt")

公眾號算法美食屋后臺回復關鍵詞:torchkeras,獲取本文notebook源代碼以及更多有趣范例。

相關稿件

Q-learning解決懸崖問題 獨家焦點

環球微動態丨怎么申請銀行停息掛賬退金?停息掛賬容易申請嗎?

當前動態:車輛過戶牌照可以保留多久|環球速遞

每日看點!知名演員王曉晨發文:“未來,我們天堂再相見”,評論區淪陷 當前速看

石家莊公租房可以轉租嗎? 今頭條

天津生態城2023小學招生劃片

618復盤-快遞小哥變忙了,但單量沒有預想中那么大_觀速訊

美國充電樁迎“統一口”?預計明年年底7500個特斯拉充電樁向其他品牌汽車開放

國足新發現,揚科維奇打造新三叉戟+中場雙核心,2將已被淘汰出局

吃母豬肉好還是公豬肉好? 世界看熱訊

上海麗思卡爾頓酒店怎么預訂便宜 世界播報

二七區:河南萌物大象奔奔受邀參加河南國際傳播中心揭牌儀式_全球觀焦點

端午臨中夏 齊魯粽飄香-每日聚焦

山東省2023年普通高等學校招生錄取工作意見發布

立邦中國李漢明解析城市更新三大痛點:老建筑問題檢測診斷機制急需建構 | 城博會專題報道

從淄博到“村超”,城市走紅是偶然,還是必然?_關注

世界視訊!企業所得稅如何征收

天天短訊!中國畫里說夏至 讀懂二十四節氣便是讀懂中國智慧

每日消息!基金最新調研公司名單曝光

39.44億元資金今日流出通信股-天天新視野

曼晚:如果曼聯完成芒特簽約,他們將有精力去引進一名前鋒 全球今熱點

英媒:熱刺正嘗試引進麥迪遜,希望5000萬鎊與萊斯特城達成交易_當前看點

當前熱門:同根同祖 中華共祭 2023(癸卯)年公祭中華人文始祖伏羲大典

國家新聞出版署:6月共89款游戲獲批,中青寶旗下多款游戲在列_每日快報

各大實車賽事在鄭機檢智能網聯汽車封閉測試場正式啟航

水利部和中國氣象局聯合發布橙色山洪災害氣象預警

顧城詩歌《我是一個任性的孩子》全文賞析精選2篇|全球快播報

8月1日起,在廈門過馬路低頭“刷手機” 罰款! 最新

干旱引發的本輪豆粕油脂玉米行情,結束了嗎?

五洲特紙:擬向實控人定增募資不超8.5億元


久久久精品2019中文字幕神马_欧美亚洲一区三区_欧美大人香蕉在线_精品88久久久久88久久久_中文字幕一区二区三区在线播放 _精品国产一区二区三区久久影院_欧洲av在线精品_粉嫩av一区二区三区_亚洲欧美一区二区三区极速播放_国产亚洲精品久久
欧美电影免费观看高清完整版在线 | 国产一区欧美二区| 色视频一区二区| 国产精品国产三级国产aⅴ原创| 九色综合狠狠综合久久| 91精品国产入口| 久久se精品一区精品二区| 精品国产一区二区三区久久影院| 日韩电影在线一区| xvideos.蜜桃一区二区| 国产91露脸合集magnet| 中文字幕综合网| 欧美日本国产视频| 久久99精品国产91久久来源| 精品美女一区二区三区| 国产91精品入口| 亚洲精品久久久久久国产精华液| 欧美在线高清视频| 黑人巨大精品欧美黑白配亚洲| 精品成人a区在线观看| 国产精品一品视频| 亚洲一区二区三区视频在线 | 国产精品三级av在线播放| 色诱视频网站一区| 激情偷乱视频一区二区三区| 中文字幕国产一区| 欧美精品色综合| 99精品国产91久久久久久| 美女被吸乳得到大胸91| 亚洲色图在线看| 精品日韩在线观看| 成人夜色视频网站在线观看| 亚洲一区在线视频| 日本一二三四高清不卡| 91精品国产91热久久久做人人| 成人黄色网址在线观看| 日韩激情视频在线观看| 中文字幕一区免费在线观看| 久久久99久久| 精品福利一区二区三区| 欧美日韩激情在线| 色综合视频在线观看| 国产夫妻精品视频| 国产在线不卡视频| 精品一区二区三区在线观看| 日日欢夜夜爽一区| 亚洲mv在线观看| 亚洲自拍偷拍九九九| 亚洲精品免费在线播放| 亚洲视频资源在线| 1区2区3区欧美| 综合久久久久综合| 国产精品久久久一本精品| 久久网站热最新地址| 欧美一区二区福利在线| 日韩欧美一级特黄在线播放| 欧美刺激脚交jootjob| 欧美一级高清片| 欧美人狂配大交3d怪物一区| 欧美日本在线一区| 日韩精品在线看片z| 日韩精品在线一区| 久久影音资源网| 久久久午夜精品| 亚洲欧美日韩在线| 亚洲国产日产av| 美女国产一区二区三区| 麻豆精品一二三| 国产福利电影一区二区三区| 色综合中文字幕国产 | 亚洲激情av在线| 亚洲欧洲制服丝袜| 亚洲午夜一二三区视频| 奇米色一区二区三区四区| 韩国av一区二区三区四区| 国产激情视频一区二区三区欧美 | 大胆亚洲人体视频| 91美女视频网站| 欧美福利一区二区| 久久久三级国产网站| 一区二区三区免费网站| 另类中文字幕网| 色网站国产精品| 欧美videos中文字幕| 亚洲人精品一区| 国产在线视频一区二区| www.欧美日韩| 欧美va亚洲va在线观看蝴蝶网| 1024国产精品| 国产精品123| 91精品国产乱码| 亚洲欧美电影院| 国产一区二区0| 777亚洲妇女| 亚洲在线视频免费观看| 成人免费毛片片v| 日韩丝袜情趣美女图片| 一二三四社区欧美黄| 国产成人免费视频一区| 日韩一区二区三区在线观看| 亚洲黄色片在线观看| 国产精品一级黄| 精品国偷自产国产一区| 日本少妇一区二区| 欧美三级中文字幕| 亚洲精选免费视频| 91亚洲资源网| 欧美国产激情二区三区| 国产成人免费视频一区| 久久久久久9999| 国产一区二区三区久久久| 在线综合亚洲欧美在线视频| 亚洲丶国产丶欧美一区二区三区| 欧美午夜精品一区二区三区| 亚洲欧美日韩中文字幕一区二区三区 | 日本aⅴ免费视频一区二区三区| 色偷偷一区二区三区| 国产精品污www在线观看| 国产福利一区在线| 国产日韩精品一区| 成人avav在线| 亚洲欧洲精品一区二区三区不卡| 91麻豆免费在线观看| 亚洲美女少妇撒尿| 欧美精品1区2区| 久久不见久久见免费视频1| 精品国产一区二区国模嫣然| 国产乱淫av一区二区三区| 国产欧美日韩亚州综合 | 一区二区三区蜜桃网| 欧美日韩精品一区二区三区蜜桃 | 亚洲特级片在线| 欧美色爱综合网| 美女免费视频一区二区| 日本一区二区三级电影在线观看| 99久久伊人精品| 丝袜美腿亚洲色图| 国产亚洲1区2区3区| 欧美色图片你懂的| 国产一二三精品| 亚洲激情自拍偷拍| 精品国产乱码久久久久久蜜臀| www.色精品| 男女性色大片免费观看一区二区| 久久久久久久久久久黄色| 久久综合狠狠综合久久综合88| 成人av午夜电影| 看电影不卡的网站| 中文字幕在线一区| 日韩女优制服丝袜电影| av一区二区久久| 国产精品一区二区91| 喷水一区二区三区| 一区二区三区在线视频免费| 欧美精品一区二区三区四区| 在线视频综合导航| 99在线热播精品免费| 国产麻豆精品视频| 麻豆一区二区三区| 亚洲h动漫在线| 亚洲国产精品一区二区www | 午夜日韩在线观看| 亚洲天堂2016| 亚洲欧美一区二区三区国产精品 | 一区二区三区视频在线看| 久久久五月婷婷| 久久久五月婷婷| 久久精品网站免费观看| 欧美tickling网站挠脚心| 欧美三级在线播放| 欧美亚洲动漫精品| 91蝌蚪porny九色| 91丨porny丨首页| 91色九色蝌蚪| 91一区二区三区在线观看| 99精品视频在线播放观看| 91免费国产在线观看| av一区二区三区在线| 91在线视频观看| 在线日韩国产精品| 欧美日韩中文字幕一区二区| 欧美精品在线一区二区| 欧美另类久久久品| 日韩一级二级三级| 精品国产乱码久久久久久久 | 国产乱子轮精品视频| 国产精品性做久久久久久| 成人黄色片在线观看| 色婷婷av一区二区三区大白胸| 91久久精品午夜一区二区| 在线观看欧美日本| 欧美一区二区人人喊爽| 久久综合九色综合97婷婷女人| 综合自拍亚洲综合图不卡区| 亚洲小少妇裸体bbw| 美女视频免费一区| www.日韩av| 精品久久久久香蕉网| 日韩欧美国产一二三区| 国产午夜精品一区二区|