docs/si/rl/dqn/experiment.html
මෙමඅත්හදා බැලීම 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()