Back to Annotated Deep Learning Paper Implementations

අටාරිබ්රේක්අවුට් සමඟ ඩීQN අත්හදා බැලීම

docs/si/rl/dqn/experiment.html

latest15.0 KB
Original Source

homerldqn

View code on Github

#

අටාරිබ්රේක්අවුට් සමඟ ඩීQN අත්හදා බැලීම

මෙමඅත්හදා බැලීම OpenAI ජිම් හි අටාරි බ්රේක් අවුට් ක්රීඩාව සඳහා ගැඹුරු Q ජාලයක් (DQN) පුහුණු කරයි. කාර්යක්ෂමව සාම්පල ලබා ගැනීම සඳහා එය බහු ක්රියාවලීන්හි ක්රීඩා පරිසරයන් ක්රියාත්මක කරයි.

16importnumpyasnp17importtorch1819fromlabmlimporttracker,experiment,logger,monit20fromlabml.internal.configs.dynamic\_hyperparamimportFloatDynamicHyperParam21fromlabml\_helpers.scheduleimportPiecewise22fromlabml\_nn.rl.dqnimportQFuncLoss23fromlabml\_nn.rl.dqn.modelimportModel24fromlabml\_nn.rl.dqn.replay\_bufferimportReplayBuffer25fromlabml\_nn.rl.gameimportWorker

#

උපාංගයතෝරන්න

28iftorch.cuda.is\_available():29device=torch.device("cuda:0")30else:31device=torch.device("cpu")

#

සිට [0, 255] පරිමාණ නිරීක්ෂණ [0, 1]

34defobs\_to\_torch(obs:np.ndarray)-\>torch.Tensor:

#

36returntorch.tensor(obs,dtype=torch.float32,device=device)/255.

#

පුහුණුකරු

39classTrainer:

#

44def\_\_init\_\_(self,\*,45updates:int,epochs:int,46n\_workers:int,worker\_steps:int,mini\_batch\_size:int,47update\_target\_model:int,48learning\_rate:FloatDynamicHyperParam,49):

#

කම්කරුවන්සංඛ්යාව

51self.n\_workers=n\_workers

#

එක්එක් යාවත්කාලීනයේ නියැදි පියවර

53self.worker\_steps=worker\_steps

#

පුහුණුපුනරාවර්තන ගණන

55self.train\_epochs=epochs

#

යාවත්කාලීනගණන

58self.updates=updates

#

පුහුණුවසඳහා කුඩා කණ්ඩායමේ ප්රමාණය

60self.mini\_batch\_size=mini\_batch\_size

#

සෑම250 යාවත්කාලීන ඉලක්ක ජාලය යාවත්කාලීන

63self.update\_target\_model=update\_target\_model

#

ඉගෙනුම්අනුපාතය

66self.learning\_rate=learning\_rate

#

යාවත්කාලීනකිරීමේ කාර්යයක් ලෙස ගවේෂණය කිරීම

69self.exploration\_coefficient=Piecewise(70[71(0,1.0),72(25\_000,0.1),73(self.updates/2,0.01)74],outside\_value=0.01)

#

β යාවත්කාලීන කිරීමේ කාර්යයක් ලෙස බෆරය නැවත ධාවනය කිරීම සඳහා

77self.prioritized\_replay\_beta=Piecewise(78[79(0,0.4),80(self.updates,1)81],outside\_value=1)

#

සමඟබෆරය නැවත ධාවනය කරන්න α=0.6. නැවත ධාවනය කිරීමේ බෆරයේ ධාරිතාව 2 බලයක් විය යුතුය.

84self.replay\_buffer=ReplayBuffer(2\*\*14,0.6)

#

නියැදීම්හා පුහුණු කිරීම සඳහා ආකෘතිය

87self.model=Model().to(device)

#

ලබාගැනීමට ඉලක්ක ආකෘතිය Q(s′;θi−​)

89self.target\_model=Model().to(device)

#

කම්කරුවන්නිර්මාණය

92self.workers=[Worker(47+i)foriinrange(self.n\_workers)]

#

නිරීක්ෂණසඳහා ආතතීන් ආරම්භ කරන්න

95self.obs=np.zeros((self.n\_workers,4,84,84),dtype=np.uint8)

#

කම්කරුවන්යළි පිහිටුවන්න

98forworkerinself.workers:99worker.child.send(("reset",None))

#

මූලිකනිරීක්ෂණ ලබා ගන්න

102fori,workerinenumerate(self.workers):103self.obs[i]=worker.child.recv()

#

පාඩුශ්රිතය

106self.loss\_func=QFuncLoss(0.99)

#

ප්‍රශස්තකරණය

108self.optimizer=torch.optim.Adam(self.model.parameters(),lr=2.5e-4)

#

ϵකෑදර නියැදීම

නියැදීම්ක්රියා කිරීමේදී අපි ϵකෑදර උපාය මාර්ගයක් භාවිතා කරමු, එහිදී අපි සම්භාවිතාව සමඟ කෑදර ක්රියාමාර්ගයක් ගන්නා 1−ϵ අතර අහඹු ක්රියාමාර්ගයක් ගනිමු ϵ. අපි ϵ හඳුන්වන්නේ exploration_coefficient .

110def\_sample\_action(self,q\_value:torch.Tensor,exploration\_coefficient:float):

#

නියැදීම්වලට අනුක්රමික අවශ්ය නොවේ

120withtorch.no\_grad():

#

ඉහළමQ- අගය සමඟ ක්රියාව සාම්පල කරන්න. මෙය කෑදර ක්රියාවකි.

122greedy\_action=torch.argmax(q\_value,dim=-1)

#

ඒකාකාරවනියැදිය සහ ක්රියාව

124random\_action=torch.randint(q\_value.shape[-1],greedy\_action.shape,device=q\_value.device)

#

කෑදරක්රියාව හෝ අහඹු ක්රියාව තෝරා ගත යුතුද යන්න

126is\_choose\_rand=torch.rand(greedy\_action.shape,device=q\_value.device)\<exploration\_coefficient

#

මතපදනම්ව ක්රියාව තෝරන්න is_choose_rand

128returntorch.where(is\_choose\_rand,random\_action,greedy\_action).cpu().numpy()

#

නියැදිදත්ත

130defsample(self,exploration\_coefficient:float):

#

මේසඳහා අනුක්රමික අවශ්ය නොවේ

134withtorch.no\_grad():

#

නියැදිය worker_steps

136fortinrange(self.worker\_steps):

#

වත්මන්නිරීක්ෂණ සඳහා Q_අගයන් ලබා ගන්න

138q\_value=self.model(obs\_to\_torch(self.obs))

#

නියැදික්රියා

140actions=self.\_sample\_action(q\_value,exploration\_coefficient)

#

එක්එක් සේවකයා මත නියැදි ක්රියා ක්රියාත්මක

143forw,workerinenumerate(self.workers):144worker.child.send(("step",actions[w]))

#

එක්එක් සේවකයාගෙන් තොරතුරු රැස් කරන්න

147forw,workerinenumerate(self.workers):

#

ක්රියාවන්ක්රියාත්මක කිරීමෙන් පසු ප්රති results ල ලබා ගන්න

149next\_obs,reward,done,info=worker.child.recv()

#

බෆරයනැවත ධාවනය කිරීම සඳහා සංක්රාන්තිය එක් කරන්න

152self.replay\_buffer.add(self.obs[w],actions[w],reward,next\_obs,done)

#

කථාංගතොරතුරු යාවත්කාලීන කරන්න. කථාංග තොරතුරු එකතු කරන්න, කථාංගයක් අවසන් වුවහොත් ලබා ගත හැකිය; මෙයට කථාංගයේ සම්පූර්ණ විපාකය සහ දිග ඇතුළත් වේ - එය ක්රියාත්මක වන ආකාරය Game බැලීමට බලන්න.

158ifinfo:159tracker.add('reward',info['reward'])160tracker.add('length',info['length'])

#

වත්මන්නිරීක්ෂණ යාවත්කාලීන කරන්න

163self.obs[w]=next\_obs

#

ආකෘතියපුහුණු කරන්න

165deftrain(self,beta:float):

#

169for\_inrange(self.train\_epochs):

#

ප්රමුඛතානැවත ධාවනය කිරීමේ බෆරයෙන් නියැදිය

171samples=self.replay\_buffer.sample(self.mini\_batch\_size,beta)

#

පුරෝකථනයකරන ලද Q-අගය ලබා ගන්න

173q\_value=self.model(obs\_to\_torch(samples['obs']))

#

ද්විත්ව Q- ඉගෙනීම සඳහා ඊළඟ තත්වයේ Q-අගයන්ලබා ගන්න. මේවා සඳහා අනුක්රමික ප්රචාරණය නොකළ යුතුය

177withtorch.no\_grad():

#

ලබාගන්න Q(s′;θi​)

179double\_q\_value=self.model(obs\_to\_torch(samples['next\_obs']))

#

ලබාගන්න Q(s′;θi−​)

181target\_q\_value=self.target\_model(obs\_to\_torch(samples['next\_obs']))

#

තාවකාලිකවෙනස ගණනය කරන්න (TD) දෝෂ δ, සහ අලාභය, L(θ).

184td\_errors,loss=self.loss\_func(q\_value,185q\_value.new\_tensor(samples['action']),186double\_q\_value,target\_q\_value,187q\_value.new\_tensor(samples['done']),188q\_value.new\_tensor(samples['reward']),189q\_value.new\_tensor(samples['weights']))

#

නැවතධාවනය කිරීමේ බෆරය සඳහා ප්රමුඛතා ගණනය කරන්න pi​=∣δi​∣+ϵ

192new\_priorities=np.abs(td\_errors.cpu().numpy())+1e-6

#

නැවතධාවනය කිරීමේ ස්වාරක්ෂක ප්රමුඛතා යාවත්කාලීන කරන්න

194self.replay\_buffer.update\_priorities(samples['indexes'],new\_priorities)

#

ඉගෙනුම්අනුපාතය සකසන්න

197forpginself.optimizer.param\_groups:198pg['lr']=self.learning\_rate()

#

කලින්ගණනය කරන ලද අනුක්රමික ශුන්ය කිරීම

200self.optimizer.zero\_grad()

#

අනුක්රමිකගණනය කරන්න

202loss.backward()

#

ක්ලිප්අනුක්රමික

204torch.nn.utils.clip\_grad\_norm\_(self.model.parameters(),max\_norm=0.5)

#

අනුක්රමිකමත පදනම්ව පරාමිතීන් යාවත්කාලීන කරන්න

206self.optimizer.step()

#

පුහුණුලූපය ධාවනය කරන්න

208defrun\_training\_loop(self):

#

අවසන්100 කථාංග තොරතුරු

214tracker.set\_queue('reward',100,True)215tracker.set\_queue('length',100,True)

#

මුලින්ඉලක්කගත ජාලයට පිටපත් කරන්න

218self.target\_model.load\_state\_dict(self.model.state\_dict())219220forupdateinmonit.loop(self.updates):

#

ϵ, ගවේෂණ භාගය

222exploration=self.exploration\_coefficient(update)223tracker.add('exploration',exploration)

#

β ප්රමුඛතා නැවත ධාවනය සඳහා

225beta=self.prioritized\_replay\_beta(update)226tracker.add('beta',beta)

#

වත්මන්ප්රතිපත්තිය සමඟ නියැදිය

229self.sample(exploration)

#

බෆරයපිරී ගිය පසු පුහුණුව ආරම්භ කරන්න

232ifself.replay\_buffer.is\_full():

#

ආකෘතියපුහුණු කරන්න

234self.train(beta)

#

ඉලක්කජාලය වරින් වර යාවත්කාලීන කරන්න

237ifupdate%self.update\_target\_model==0:238self.target\_model.load\_state\_dict(self.model.state\_dict())

#

ලුහුබැඳඇති දර්ශක සුරකින්න.

241tracker.save()

#

වරින්වර තිරයට නව රේඛාවක් එක් කරන්න

243if(update+1)%1\_000==0:244logger.log()

#

විනාශකරන්න

කම්කරුවන්නවත්වන්න

246defdestroy(self):

#

251forworkerinself.workers:252worker.child.send(("close",None))

#

255defmain():

#

අත්හදාබැලීම සාදන්න

257experiment.create(name='dqn')

#

වින්යාසකිරීම්

260configs={

#

යාවත්කාලීනගණන

262'updates':1\_000\_000,

#

නියැදිදත්ත සමඟ ආකෘතිය පුහුණු කිරීම සඳහා එපොච් ගණන.

264'epochs':8,

#

සේවකක්රියාවලි ගණන

266'n\_workers':8,

#

තනියාවත්කාලීන කිරීම සඳහා එක් එක් ක්රියාවලිය මත ක්රියාත්මක කිරීමට පියවර ගණන

268'worker\_steps':4,

#

කුඩාකණ්ඩායම් ප්රමාණය

270'mini\_batch\_size':32,

#

ඉලක්කගතආකෘති යාවත්කාලීන කිරීමේ පරතරය

272'update\_target\_model':250,

#

ඉගෙනුම්අනුපාතය.

274'learning\_rate':FloatDynamicHyperParam(1e-4,(0,1e-3)),275}

#

වින්යාසකිරීම්

278experiment.configs(configs)

#

පුහුණුකරුආරම්භ කරන්න

281m=Trainer(\*\*configs)

#

අත්හදාබැලීම ධාවනය කර අධීක්ෂණය කරන්න

283withexperiment.start():284m.run\_training\_loop()

#

කම්කරුවන්නවත්වන්න

286m.destroy()

#

එයක්රියාත්මක කරන්න

290if\_\_name\_\_=="\_\_main\_\_":291main()

Trending Research Paperslabml.ai