強(qiáng)化學(xué)習(xí)(Reinforcement Learing),機(jī)器學(xué)習(xí)重要分支,解決連續(xù)決策問題。強(qiáng)化學(xué)習(xí)問題三概念,環(huán)境狀態(tài)(Environment State)、行動(dòng)(Action)、獎(jiǎng)勵(lì)(Reward),目標(biāo)獲得最多累計(jì)獎(jiǎng)勵(lì)。強(qiáng)化學(xué)習(xí)模型根據(jù)環(huán)境狀態(tài)、行動(dòng)和獎(jiǎng)勵(lì),學(xué)習(xí)出最佳策略,以最終結(jié)果為目標(biāo),不能只看某個(gè)行動(dòng)當(dāng)下帶來的利益,還要看行動(dòng)未來帶來的價(jià)值。
AutoEncoder屬于無監(jiān)督學(xué)習(xí),MLP、CNN、RNN屬于監(jiān)督學(xué)習(xí),強(qiáng)化學(xué)習(xí)目標(biāo)變化、不明確,或不存絕對正確標(biāo)簽。
Google DeepMind結(jié)合強(qiáng)化學(xué)習(xí)和深度學(xué)習(xí),提出DQN(Deep Q-Network,深度Q網(wǎng)絡(luò))。AlphaGo結(jié)合策略網(wǎng)絡(luò)(Policy Network)、估值網(wǎng)絡(luò)(Value Network,DQN)、蒙特卡洛搜索樹(Monte Carlo Tree Search)。
無人駕駛是非常復(fù)雜、困難強(qiáng)化學(xué)習(xí)任務(wù)。無人駕駛汽車通過攝像頭、雷達(dá)、激光測距儀、傳感器觀測環(huán)境,獲取豐富環(huán)境信息,深度強(qiáng)化學(xué)習(xí)模型CNN、RNN處理、抽象、轉(zhuǎn)化環(huán)境信息,結(jié)合強(qiáng)化學(xué)習(xí)算法框架預(yù)測最應(yīng)執(zhí)行動(dòng)作(加速、減速、轉(zhuǎn)換方向),實(shí)現(xiàn)自動(dòng)駕駛。每次執(zhí)行動(dòng)作,到目的地路程更短,作為每次行動(dòng)獎(jiǎng)勵(lì)。最終目標(biāo)是安全順利到達(dá)目的地,得到獎(jiǎng)勵(lì)最多。
強(qiáng)化學(xué)習(xí)兩大類,Policy-Based(Policy Gradients)和Value-Based(Q-Learning)。Policy-Based直接預(yù)測環(huán)境狀態(tài)下應(yīng)采取Action,Value-Based預(yù)測環(huán)境狀態(tài)下所有Action期望價(jià)值(Q值),選擇Q值最高Action執(zhí)行。Value-Based適合少量離散取值A(chǔ)ction,Policy-Based適合Aciton種類多或連續(xù)取值A(chǔ)ction環(huán)境。Policy Network、Value Network。
根據(jù)環(huán)境狀態(tài)和采取行動(dòng)預(yù)測后續(xù)環(huán)境狀態(tài),利用信息訓(xùn)練強(qiáng)化學(xué)習(xí)模型,是Model-Based RL。Model-Free RL直接對策略或Action期望價(jià)值預(yù)測,計(jì)算效率高。復(fù)雜環(huán)境,主要用Model-Free RL,供給更多樣本訓(xùn)練,彌補(bǔ)沒有Model預(yù)測環(huán)境狀態(tài)問題。
環(huán)境中,強(qiáng)化學(xué)習(xí)模型載體Agent,負(fù)責(zé)執(zhí)行模型行動(dòng)。環(huán)境,Agent無法控制,可以觀察。根據(jù)觀察結(jié)果,模型給出行動(dòng),Agent執(zhí)行。Reward,環(huán)境狀態(tài)下執(zhí)行Action獲得,模型爭取目標(biāo)。Reward延遲獲到Delayed。Action即時(shí)獲得Reward,和未來獲得Reward有很大關(guān)系。
策略網(wǎng)絡(luò),建立神經(jīng)網(wǎng)絡(luò)模型,通過觀察環(huán)境狀態(tài),直接預(yù)測目前最應(yīng)該執(zhí)行策略(Policy),執(zhí)行策略獲得最大期望收益(包括現(xiàn)在、未來Reward)。沒有絕對正確學(xué)習(xí)目標(biāo),樣本feature不再和label對應(yīng)。特定環(huán)境狀態(tài),不知道對應(yīng)最好Action,只知道當(dāng)前Action獲得Reward,試驗(yàn)后獲得未來Reward,強(qiáng)化學(xué)習(xí)模型通過試驗(yàn)樣本學(xué)習(xí)環(huán)境狀態(tài)下比較好的Action。樣本沒有絕對正確label,只有估算label。策略網(wǎng)絡(luò),不只用當(dāng)前Reward作label,用Discounted Future Reward,所有未來獎(jiǎng)勵(lì)依次乘以衰減系數(shù)y。衰減系數(shù),略小于但接近1,防止沒有損耗積累導(dǎo)致Reward目標(biāo)發(fā)散,代表未來獎(jiǎng)勵(lì)不確定性估計(jì)。
Policy Gradients方法訓(xùn)練策略網(wǎng)絡(luò)。模型通過學(xué)習(xí)Action在Environment獲得反饋,用梯度更新模型參數(shù)。訓(xùn)練過程,模型接觸到好Action及高期價(jià)值,和差A(yù)ction及低期望價(jià)值。通過樣本學(xué)習(xí),模型逐漸增加選擇好Action概率,降低選擇壞Action概率,完成策略學(xué)習(xí)。直接學(xué)習(xí)當(dāng)前環(huán)境應(yīng)該采取策略,如選擇Actionc概率,或Action具體數(shù)值。策略網(wǎng)絡(luò)是End-to-End(端對端)方法,直接產(chǎn)生最終策略。
Policy-Based比Value-Based,收斂性更好,通常可以保證收斂到局部最優(yōu),且不會(huì)發(fā)散。對高維、連續(xù)值A(chǔ)ction,訓(xùn)練、輸出結(jié)果都更高效。能學(xué)習(xí)出帶有隨機(jī)性的策略。
Gym輔助策略網(wǎng)絡(luò)訓(xùn)練。Gym,OpenAI開源強(qiáng)化學(xué)習(xí)環(huán)境生成工具。OpenAI,Tesla、Space X CEO Elon Musk發(fā)起非營利人工智能研究機(jī)構(gòu)。研究安全、開放人工智能技術(shù),確保人工智能技術(shù)廣泛、公平普及服務(wù)社會(huì)。Gym,提供方便強(qiáng)化學(xué)習(xí)任務(wù)環(huán)境,強(qiáng)化學(xué)習(xí)算法效率、性能比較。Gym提供大量標(biāo)準(zhǔn)化環(huán)境,用來公平橫向?qū)Ρ葟?qiáng)化學(xué)習(xí)模型性能。Gym用戶上傳模型效果、訓(xùn)練日志到OpenAI Gym Service接口,參與任務(wù)排名,比較模型效果,分享算法思路。
OpenAI Gym,對用戶開發(fā)模型方式無限制,和其他機(jī)器學(xué)習(xí)庫完全兼容(TensorFlow、Theano)。可以用Python語言、任何Python Library編寫強(qiáng)化學(xué)習(xí)模型Agent。如創(chuàng)建簡單經(jīng)驗(yàn)規(guī)則,使用State-Action一一對應(yīng)策略表,深度神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練。
Gym,兩個(gè)核心概念。Environment,任務(wù)、問題。Agent,策略、算法。Agent將執(zhí)行Action傳給Environment,Environment接受Action,結(jié)果Observation(環(huán)境狀態(tài))和Reward返回Agent。Gym提供完整Environment接口,Agent完全由用戶編寫。Gym包含環(huán)境,Algorithmic(算法)、Atari游戲(Arcade Learning Environment)、Board Games(棋牌類游戲 Pachi)、Box2D(二維物理引擎)、Classic Control(經(jīng)典控制)、MuJoCo(高效處理引擎)、Toy Text(文本類型)任務(wù)。執(zhí)行full install安裝全部環(huán)境依賴程序。
Gym環(huán)境接口,Env類。env=gym.make('Copy-v0')創(chuàng)建任務(wù)環(huán)境。env.reset()初始化環(huán)境,返回初始o(jì)bservation state。evn.step(action)當(dāng)前狀態(tài)執(zhí)行一步Action,返回observation、reward、done(完成標(biāo)記)、info(調(diào)試信息)。env.render()渲染一幀任務(wù)圖像,Agent直接從圖像像素學(xué)習(xí)信息策略。
Gym CartPole環(huán)境,《Neuronlike Adaptive Elements That Can Solve Difficult Learning Control Problem》,經(jīng)典可用強(qiáng)化學(xué)習(xí)解決控制問題。CartPole環(huán)境有小車,一維無阻力軌道,行動(dòng)。車上綁連接不太結(jié)實(shí)桿,左右搖晃。環(huán)境信息observation 是有4個(gè)值數(shù)組,包含小車位置、速度,桿角度、速度。不需要知道數(shù)值物理含義。設(shè)計(jì)策略網(wǎng)絡(luò),從數(shù)值學(xué)習(xí)環(huán)境信息,制定最佳策略。Action,小車施加正向力、負(fù)向力。Action Space,Action離散數(shù)值空間。CartPole Action Space,Discrete(2),只有0?1。只要模型學(xué)習(xí)到采取Action后帶來的影響。Action只是編碼。CartPole任務(wù),盡可能保持桿豎直不傾倒,小車偏離中心超過2.4個(gè)單位距離,桿傾角超過15度,任務(wù)失敗,自動(dòng)結(jié)束。每堅(jiān)持一步,reward+1。Reward恒定。模型要考慮到長遠(yuǎn)利益,不只是學(xué)習(xí)當(dāng)前Reward。
env.reset()方法初始化環(huán)境,獲取環(huán)境第一個(gè)Observation。根據(jù)Observation預(yù)測應(yīng)該采取Action,用env.step(action),在環(huán)境中執(zhí)行Action,返回Observation(CartPole 4維抽象特征)、reward(當(dāng)前Action即時(shí)獎(jiǎng)勵(lì))、done(任務(wù)是否結(jié)束標(biāo)記,True,reset任務(wù))、info(額外診斷信息)。進(jìn)入Action-Observation循環(huán),期望任務(wù)結(jié)束時(shí)盡可能高獎(jiǎng)勵(lì)。Action在CartPole離散數(shù)值空間,有限幾種可能。別的任務(wù)可能是連續(xù)數(shù)值空間。環(huán)境名稱后帶版本號,環(huán)境發(fā)生更新或變化,不修改之前環(huán)境,創(chuàng)建新版本,Agent性能公平比較。調(diào)用env.monitor方法,監(jiān)控、記錄模型訓(xùn)練過程。gym.upload,訓(xùn)練日志上傳到gym service展示,與他人算法比較。簡單問題評測標(biāo)準(zhǔn),需要多少步訓(xùn)練可以穩(wěn)定達(dá)到理想分?jǐn)?shù)。復(fù)雜問題評測標(biāo)準(zhǔn),獲得分?jǐn)?shù)越高越好。
TensorFlow創(chuàng)建基于策略網(wǎng)絡(luò)Agent,解決CartPole問題。先安裝OpenAI Gym。pip install gym 。載入Numpy、TensorFlow、gym。gym.make('CartPole-v0')創(chuàng)建CartPole問題環(huán)境env。
先測試CartPole環(huán)境隨機(jī)Action表現(xiàn),作對比baseline。env.reset()初始化環(huán)境,10次隨機(jī)試驗(yàn),env.render()渲染CartPole問題圖像。np.random.randint(0,2)產(chǎn)生隨機(jī)Action。env.step()執(zhí)行隨機(jī)Action,獲取返回observation、reward、done。如done標(biāo)記為True,一次試驗(yàn)結(jié)束,傾角超過15度或偏離中心過遠(yuǎn),任務(wù)失敗。展示試驗(yàn)累計(jì)獎(jiǎng)勵(lì)reward_sum,重啟環(huán)境。
隨機(jī)策略獎(jiǎng)勵(lì)總值在1040,均值在2030。任務(wù)完成目標(biāo)設(shè)定200 Reward,通過盡量少次數(shù)試驗(yàn)完成。
策略網(wǎng)絡(luò)用簡帶一個(gè)隱含層MLP。設(shè)置網(wǎng)絡(luò)超參數(shù),隱含節(jié)點(diǎn)數(shù)H設(shè)50,bactch_size設(shè)25,學(xué)習(xí)速率learning_rate 0.1,環(huán)境信息observation維度D 4,gamma Reward discount比例0.99。估算Action期望價(jià)值(估算樣本學(xué)習(xí)目標(biāo)),考慮Delayed Reward,Action之后獲得所有Reward做discount累加,讓模型學(xué)習(xí)未來可能出現(xiàn)的潛在Reward。discount比例小于1,防止Reward無損耗累加導(dǎo)致發(fā)散,可以區(qū)分當(dāng)前Reward和未來Reward價(jià)值,Action直接帶來的Reward不需要discount,未來Reward存在不確定性需要discount。
定義策略網(wǎng)絡(luò)結(jié)構(gòu),網(wǎng)絡(luò)接受observation 輸入信息,輸出概率值,用以選擇Action,向左施加力,向右施加力。創(chuàng)建輸入信息observation placeholder,維度D。tf.contrib.layers.xavier_initializer初始化算法創(chuàng)建隱含層權(quán)重W1,維度[D,H]。tf.matmul,環(huán)境信息observation乘W1,用ReLU激活函數(shù)處理得到隱含層輸出layer1,不加偏置。xavier_initializer算法創(chuàng)建最后Sigmoid輸出層權(quán)重W2,隱含層輸出layer1乘W2,Sigmoid激活函數(shù)處理得到最后輸出概率。
模型優(yōu)化器用Adam算法。設(shè)置兩層神經(jīng)網(wǎng)絡(luò)參數(shù)梯度placeholder,W1Grad、W2Grad。adam.apply_gradients定義更新模型參數(shù)操作updateGrads。計(jì)算參數(shù)梯度,積累一定樣本量梯度,傳入W1Grad和W2Grad,執(zhí)行updateGrads更新模型參數(shù)。深度強(qiáng)化學(xué)習(xí)訓(xùn)練用batch training。不逐個(gè)樣本更新參數(shù),累計(jì)一個(gè)batch_size樣本梯度再更新參數(shù),防止單一樣本隨機(jī)擾動(dòng)噪聲對模型帶來不良影響。
定義函數(shù)discount_rewards,估算每個(gè)Action對就潛在價(jià)值discount_r。CartPole問題每次獲得Reward和前面Action有關(guān),屬于delayed reward。需要比較精準(zhǔn)衡量每個(gè)Action實(shí)際帶來價(jià)值,不能只看當(dāng)前這步Reward,要考慮后面Delayed Reward。讓Pole長時(shí)間保持在空中豎直Action,應(yīng)該有較大期望價(jià)值。最終導(dǎo)致Pole傾例Action,有較小期望價(jià)值。越靠后Acion期望價(jià)值越小,越靠前Acion期望價(jià)值越大。倒推過程,最后Action開始計(jì)算所有Action應(yīng)該對應(yīng)期望價(jià)值。輸入數(shù)據(jù)r ,每個(gè)Action實(shí)際獲得Reward,CartPole,最后結(jié)束時(shí)Action 0,其余 1。定義每個(gè)Action除直接獲得Reward外,潛在價(jià)值running_add。running_add,從后向前累計(jì),經(jīng)過discount衰減。每個(gè)Action潛在坐,后一Action潛在價(jià)值乘以衰減系數(shù)gamma,加直接獲得reward,running_add*gamma+r[t]。從最后Action,向前累計(jì)計(jì)算,得到全部Action潛在價(jià)值。
定義人工設(shè)置虛擬label placeholder input_y。每個(gè)Action潛在價(jià)值placeholder advangtages。loglik,Action取值 1概率probability(策略網(wǎng)絡(luò)輸出概率),Action取值 0概率 1-probability。label取值,label=1-Action。Action 1,label 0,loglik=tf.log(probability),Action取值為1的概率對數(shù)。Action 0,label 1,loglik=tf.log(1-probability),Action取值為0的概率對數(shù)。loglik,當(dāng)前Action對應(yīng)概率對數(shù)。loglik與潛在坐advantages相乘,取負(fù)數(shù)作損失,優(yōu)化目標(biāo)。優(yōu)化器優(yōu)化,能獲得較多advantages Action概率變大,能獲得較少advantages Action概率變小,損失變小。不斷訓(xùn)練,持續(xù)加大能獲得較多advantages Action概率,學(xué)習(xí)到一個(gè)能獲得更多潛在價(jià)值策略。tf.trainable_variables()獲取策略網(wǎng)絡(luò)全部可訓(xùn)練參數(shù)tvars,tf.gradients求解模型參數(shù) loss梯度。
定義參數(shù),xs環(huán)境信息observation列表,ys label列表,drs記錄每個(gè)Action Reward,reward_sum累計(jì)Reward,總試驗(yàn)次數(shù)total_episodes10000。達(dá)到200 Reward停止訓(xùn)練。
創(chuàng)建默認(rèn)Session,初始化全部參數(shù),一開始render標(biāo)志關(guān)閉。render較大延遲,一開始不太成熟模型沒必要觀察。初始化CartPole環(huán)境,獲得初始狀態(tài)。sess.run執(zhí)行tvars獲取所有模型參數(shù),創(chuàng)建儲(chǔ)存參數(shù)梯度緩沖器gradBuffer,gardBuffer全部初始化零。每次試驗(yàn)收集參數(shù)梯度存儲(chǔ)到gradBuffer,直到完成一個(gè)batch_size試驗(yàn),匯總梯度更新模型參數(shù)。
試驗(yàn)循環(huán),最大循環(huán)次數(shù)total_episodes。batch 平均Reward達(dá)到100以上,Agent表現(xiàn)良好,調(diào)用env.render()展示試驗(yàn)環(huán)境。tf.reshape將observation變形策略網(wǎng)絡(luò)輸入格式,傳入網(wǎng)絡(luò),sess.run執(zhí)行probability獲得網(wǎng)絡(luò)輸出概率tfprob,Action取值1的概率。(0,1)間隨機(jī)抽樣,隨機(jī)值小于tfprob,令A(yù)ction取1,否則取0,Action取值 1概率為tfprob。
輸入環(huán)境信息添加到列表xs,制造虛擬label——y,取值與Action相反,y=1-Action,添加到列表ys。env.step執(zhí)行一次Action,獲取observation、reward、done、info,reward 累加到reward_sum,reward添加到列表drs。
done為True,一次試驗(yàn)結(jié)束,episode_number加1。np.vstack 將列表xs、ys、drs元素縱向堆疊,得到epx、epy、epr,將xs、ys、drs清空,下次試驗(yàn)用。epx、epy、epr,一次試驗(yàn)中獲得的所有observation、label、reward列表。discount_rewards函數(shù)計(jì)算每步Action潛在價(jià)值,標(biāo)準(zhǔn)化(減去均值再除以標(biāo)準(zhǔn)差),得零均值標(biāo)準(zhǔn)差1分布。dicount_reward參與模型損失計(jì)算。
epx、epy、discounted_epr輸入神經(jīng)網(wǎng)絡(luò),newGrads求解梯度。獲得梯度累加gradBuffer。
試驗(yàn)次數(shù)達(dá)到batch_size整倍數(shù),gradBuffer累計(jì)足夠梯度,用updateGrads將gradBuffer中梯度更新到策略網(wǎng)絡(luò)模型參數(shù),清空gradBuffer,計(jì)算下一batch梯度準(zhǔn)備。一個(gè)batch梯度更新參數(shù),每個(gè)梯度是使用一次試驗(yàn)全部樣本(一個(gè)Action一個(gè)樣本)計(jì)算,一個(gè)batch樣本數(shù) 25(batch_size)次試驗(yàn)樣本數(shù)和。展示當(dāng)前試驗(yàn)次數(shù)episode_number,batch內(nèi)每次試驗(yàn)平均reward。batch內(nèi)每次試驗(yàn)平均reward大于200,策略網(wǎng)絡(luò)完成任務(wù)終止循環(huán)。如沒達(dá)目標(biāo),清空reward_sum,重新累計(jì)下一batch總reward。每次試驗(yàn)結(jié)束,任務(wù)環(huán)境env重置。
模型訓(xùn)練日志,策略網(wǎng)絡(luò)200次試驗(yàn),8個(gè)batch訓(xùn)練和參數(shù)更新,實(shí)現(xiàn)目標(biāo),batch內(nèi)平均230 reward。可以嘗試修改策略網(wǎng)絡(luò)結(jié)構(gòu)、隱含節(jié)點(diǎn)數(shù)、batch_size、學(xué)習(xí)速率參數(shù)優(yōu)化訓(xùn)練,加快學(xué)習(xí)速度。
import numpy as np
import tensorflow as tf
import gym
env = gym.make('CartPole-v0')
env.reset()
random_episodes = 0
reward_sum = 0
while random_episodes < 10:
env.render()
observation, reward, done, _ = env.step(np.random.randint(0,2))
reward_sum += reward
if done:
random_episodes += 1
print("Reward for this episode was:",reward_sum)
reward_sum = 0
env.reset()
# hyperparameters
H = 50 # number of hidden layer neurons
batch_size = 25 # every how many episodes to do a param update?
learning_rate = 1e-1 # feel free to play with this to train faster or more stably.
gamma = 0.99 # discount factor for reward
D = 4 # input dimensionality
tf.reset_default_graph()
#This defines the network as it goes from taking an observation of the environment to
#giving a probability of chosing to the action of moving left or right.
observations = tf.placeholder(tf.float32, [None,D] , name="input_x")
W1 = tf.get_variable("W1", shape=[D, H],
initializer=tf.contrib.layers.xavier_initializer())
layer1 = tf.nn.relu(tf.matmul(observations,W1))
W2 = tf.get_variable("W2", shape=[H, 1],
initializer=tf.contrib.layers.xavier_initializer())
score = tf.matmul(layer1,W2)
probability = tf.nn.sigmoid(score)
#From here we define the parts of the network needed for learning a good policy.
tvars = tf.trainable_variables()
input_y = tf.placeholder(tf.float32,[None,1], name="input_y")
advantages = tf.placeholder(tf.float32,name="reward_signal")
# The loss function. This sends the weights in the direction of making actions
# that gave good advantage (reward over time) more likely, and actions that didn't less likely.
loglik = tf.log(input_y*(input_y - probability) + (1 - input_y)*(input_y + probability))
loss = -tf.reduce_mean(loglik * advantages)
newGrads = tf.gradients(loss,tvars)
# Once we have collected a series of gradients from multiple episodes, we apply them.
# We don't just apply gradeients after every episode in order to account for noise in the reward signal.
adam = tf.train.AdamOptimizer(learning_rate=learning_rate) # Our optimizer
W1Grad = tf.placeholder(tf.float32,name="batch_grad1") # Placeholders to send the final gradients through when we update.
W2Grad = tf.placeholder(tf.float32,name="batch_grad2")
batchGrad = [W1Grad,W2Grad]
updateGrads = adam.apply_gradients(zip(batchGrad,tvars))
def discount_rewards(r):
""" take 1D float array of rewards and compute discounted reward """
discounted_r = np.zeros_like(r)
running_add = 0
for t in reversed(range(r.size)):
running_add = running_add * gamma + r[t]
discounted_r[t] = running_add
return discounted_r
xs,ys,drs = [],[],[]
#running_reward = None
reward_sum = 0
episode_number = 1
total_episodes = 10000
init = tf.global_variables_initializer()
# Launch the graph
with tf.Session() as sess:
rendering = False
sess.run(init)
observation = env.reset() # Obtain an initial observation of the environment
# Reset the gradient placeholder. We will collect gradients in
# gradBuffer until we are ready to update our policy network.
gradBuffer = sess.run(tvars)
for ix,grad in enumerate(gradBuffer):
gradBuffer[ix] = grad * 0
while episode_number <= total_episodes:
# Rendering the environment slows things down,
# so let's only look at it once our agent is doing a good job.
if reward_sum/batch_size > 100 or rendering == True :
env.render()
rendering = True
# Make sure the observation is in a shape the network can handle.
x = np.reshape(observation,[1,D])
# Run the policy network and get an action to take.
tfprob = sess.run(probability,feed_dict={observations: x})
action = 1 if np.random.uniform() < tfprob else 0
xs.append(x) # observation
y = 1 if action == 0 else 0 # a "fake label"
ys.append(y)
# step the environment and get new measurements
observation, reward, done, info = env.step(action)
reward_sum += reward
drs.append(reward) # record reward (has to be done after we call step() to get reward for previous action)
if done:
episode_number += 1
# stack together all inputs, hidden states, action gradients, and rewards for this episode
epx = np.vstack(xs)
epy = np.vstack(ys)
epr = np.vstack(drs)
xs,ys,drs = [],[],[] # reset array memory
# compute the discounted reward backwards through time
discounted_epr = discount_rewards(epr)
# size the rewards to be unit normal (helps control the gradient estimator variance)
discounted_epr -= np.mean(discounted_epr)
discounted_epr /= np.std(discounted_epr)
# Get the gradient for this episode, and save it in the gradBuffer
tGrad = sess.run(newGrads,feed_dict={observations: epx, input_y: epy, advantages: discounted_epr})
for ix,grad in enumerate(tGrad):
gradBuffer[ix] += grad
# If we have completed enough episodes, then update the policy network with our gradients.
if episode_number % batch_size == 0:
sess.run(updateGrads,feed_dict={W1Grad: gradBuffer[0],W2Grad:gradBuffer[1]})
for ix,grad in enumerate(gradBuffer):
gradBuffer[ix] = grad * 0
# Give a summary of how well our network is doing for each batch of episodes.
#running_reward = reward_sum if running_reward is None else running_reward * 0.99 + reward_sum * 0.01
print('Average reward for episode %d : %f.' % (episode_number,reward_sum/batch_size))
if reward_sum/batch_size > 200:
print("Task solved in",episode_number,'episodes!')
break
reward_sum = 0
observation = env.reset()
參考資料:
《TensorFlow實(shí)戰(zhàn)》
歡迎付費(fèi)咨詢(150元每小時(shí)),我的微信:qingxingfengzi