docs/si/rl/ppo/experiment.html
මෙමඅත්හදා බැලීම OpenAI Gym හි ප්රොක්සිමල් ප්රතිපත්ති ප්රශස්තිකරණය (PPO) නියෝජිත අටාරි බ්රේක් ක්රීඩාව පුහුණු කරයි. කාර්යක්ෂමව සාම්පල ලබා ගැනීම සඳහා එය බහු ක්රියාවලීන්හි ක්රීඩා පරිසරයන් ක්රියාත්මක කරයි.
16fromtypingimportDict1718importnumpyasnp19importtorch20fromtorchimportnn21fromtorchimportoptim22fromtorch.distributionsimportCategorical2324fromlabmlimportmonit,tracker,logger,experiment25fromlabml.configsimportFloatDynamicHyperParam,IntDynamicHyperParam26fromlabml\_helpers.moduleimportModule27fromlabml\_nn.rl.gameimportWorker28fromlabml\_nn.rl.ppoimportClippedPPOLoss,ClippedValueFunctionLoss29fromlabml\_nn.rl.ppo.gaeimportGAE
උපාංගයතෝරන්න
32iftorch.cuda.is\_available():33device=torch.device("cuda:0")34else:35device=torch.device("cpu")
38classModel(Module):
43def\_\_init\_\_(self):44super().\_\_init\_\_()
පළමුකැටි ගැසුණු ස්තරය 84x84 රාමුවක් ගෙන 20x20 රාමුවක් නිපදවයි
48self.conv1=nn.Conv2d(in\_channels=4,out\_channels=32,kernel\_size=8,stride=4)
දෙවනකැටි ගැසුණු ස්තරය 20x20 රාමුවක් ගෙන 9x9 රාමුවක් නිපදවයි
52self.conv2=nn.Conv2d(in\_channels=32,out\_channels=64,kernel\_size=4,stride=2)
තෙවනකැටි ගැසුණු ස්තරය 9x9 රාමුවක් ගෙන 7x7 රාමුවක් නිපදවයි
56self.conv3=nn.Conv2d(in\_channels=64,out\_channels=64,kernel\_size=3,stride=1)
සම්පුර්ණයෙන්මසම්බන්ධිත තට්ටුවක් පැතලි රාමුව තෙවන කැටි ගැසුණු ස්ථරයෙන් ගෙන යන අතර විශේෂාංග 512 ක් ප්රතිදානය කරයි
61self.lin=nn.Linear(in\_features=7\*7\*64,out\_features=512)
සඳහාපිවිසුම් ලබා ගැනීම සඳහා පූර්ණ සම්බන්ධිත තට්ටුවක් π
64self.pi\_logits=nn.Linear(in\_features=512,out\_features=4)
අගයශ්රිතය ලබා ගැනීම සඳහා පූර්ණ සම්බන්ධිත තට්ටුවක්
67self.value=nn.Linear(in\_features=512,out\_features=1)
70self.activation=nn.ReLU()
72defforward(self,obs:torch.Tensor):73h=self.activation(self.conv1(obs))74h=self.activation(self.conv2(h))75h=self.activation(self.conv3(h))76h=h.reshape((-1,7\*7\*64))7778h=self.activation(self.lin(h))7980pi=Categorical(logits=self.pi\_logits(h))81value=self.value(h).reshape(-1)8283returnpi,value
සිට [0, 255] පරිමාණ නිරීක්ෂණ [0, 1]
86defobs\_to\_torch(obs:np.ndarray)-\>torch.Tensor:
88returntorch.tensor(obs,dtype=torch.float32,device=device)/255.
91classTrainer:
96def\_\_init\_\_(self,\*,97updates:int,epochs:IntDynamicHyperParam,98n\_workers:int,worker\_steps:int,batches:int,99value\_loss\_coef:FloatDynamicHyperParam,100entropy\_bonus\_coef:FloatDynamicHyperParam,101clip\_range:FloatDynamicHyperParam,102learning\_rate:FloatDynamicHyperParam,103):
යාවත්කාලීනගණන
107self.updates=updates
නියැදිදත්ත සමඟ ආකෘතිය පුහුණු කිරීම සඳහා එපොච් ගණන
109self.epochs=epochs
සේවකක්රියාවලි ගණන
111self.n\_workers=n\_workers
තනියාවත්කාලීන කිරීම සඳහා එක් එක් ක්රියාවලිය මත ක්රියාත්මක කිරීමට පියවර ගණන
113self.worker\_steps=worker\_steps
කුඩාකණ්ඩායම් ගණන
115self.batches=batches
තනියාවත්කාලීන කිරීම සඳහා මුළු සාම්පල ගණන
117self.batch\_size=self.n\_workers\*self.worker\_steps
කුඩාකණ්ඩායමක ප්රමාණය
119self.mini\_batch\_size=self.batch\_size//self.batches120assert(self.batch\_size%self.batches==0)
අගයඅහිමි සංගුණකය
123self.value\_loss\_coef=value\_loss\_coef
එන්ට්රොපිප්රසාද සංගුණකය
125self.entropy\_bonus\_coef=entropy\_bonus\_coef
ක්ලිපින්පරාසය
128self.clip\_range=clip\_range
ඉගෙනුම්අනුපාතය
130self.learning\_rate=learning\_rate
කම්කරුවන්නිර්මාණය
135self.workers=[Worker(47+i)foriinrange(self.n\_workers)]
නිරීක්ෂණසඳහා ආතතීන් ආරම්භ කරන්න
138self.obs=np.zeros((self.n\_workers,4,84,84),dtype=np.uint8)139forworkerinself.workers:140worker.child.send(("reset",None))141fori,workerinenumerate(self.workers):142self.obs[i]=worker.child.recv()
ආකෘතිය
145self.model=Model().to(device)
ප්රශස්තකරණය
148self.optimizer=optim.Adam(self.model.parameters(),lr=2.5e-4)
GAEසමඟ γ=0.99 සහ λ=0.95
151self.gae=GAE(self.n\_workers,self.worker\_steps,0.99,0.95)
PPOපාඩුව
154self.ppo\_loss=ClippedPPOLoss()
අගයනැතිවීම
157self.value\_loss=ClippedValueFunctionLoss()
159defsample(self)-\>Dict[str,torch.Tensor]:
164rewards=np.zeros((self.n\_workers,self.worker\_steps),dtype=np.float32)165actions=np.zeros((self.n\_workers,self.worker\_steps),dtype=np.int32)166done=np.zeros((self.n\_workers,self.worker\_steps),dtype=np.bool)167obs=np.zeros((self.n\_workers,self.worker\_steps,4,84,84),dtype=np.uint8)168log\_pis=np.zeros((self.n\_workers,self.worker\_steps),dtype=np.float32)169values=np.zeros((self.n\_workers,self.worker\_steps+1),dtype=np.float32)170171withtorch.no\_grad():
සෑම worker_steps සේවකයෙකුගේම නියැදිය
173fortinrange(self.worker\_steps):
self.obs එක් එක් සේවකයාගෙන් අවසාන නිරීක්ෂණය නිරීක්ෂණය කරයි, එය ඊළඟ ක්රියාව නියැදි කිරීම සඳහා ආකෘතියට ආදානය වේ
176obs[:,t]=self.obs
එක්එක් සේවකයා πθOLD සඳහා නියැදි ක්රියා; මෙය ප්රමාණයේ අරා නැවත ලබා දෙයි n_workers
179pi,v=self.model(obs\_to\_torch(self.obs))180values[:,t]=v.cpu().numpy()181a=pi.sample()182actions[:,t]=a.cpu().numpy()183log\_pis[:,t]=pi.log\_prob(a).cpu().numpy()
එක්එක් සේවකයා මත නියැදි ක්රියා ක්රියාත්මක
186forw,workerinenumerate(self.workers):187worker.child.send(("step",actions[w,t]))188189forw,workerinenumerate(self.workers):
ක්රියාවන්ක්රියාත්මක කිරීමෙන් පසු ප්රති results ල ලබා ගන්න
191self.obs[w],rewards[w,t],done[w,t],info=worker.child.recv()
කථාංගතොරතුරු එකතු කරන්න, කථාංගයක් අවසන් වුවහොත් එය ලබා ගත හැකිය; මෙයට කථාංගයේ සම්පූර්ණ විපාකය සහ දිග ඇතුළත් වේ - එය ක්රියාත්මක වන ආකාරය Game බැලීමට බලන්න.
196ifinfo:197tracker.add('reward',info['reward'])198tracker.add('length',info['length'])
අවසානපියවරෙන් පසු වටිනාකම ලබා ගන්න
201\_,v=self.model(obs\_to\_torch(self.obs))202values[:,self.worker\_steps]=v.cpu().numpy()
වාසිගණනය කරන්න
205advantages=self.gae(done,rewards,values)
208samples={209'obs':obs,210'actions':actions,211'values':values[:,:-1],212'log\_pis':log\_pis,213'advantages':advantages214}
සාම්පලදැනට [workers, time_step] වගුවේ ඇත, අපි පුහුණුව සඳහා එය සමතලා කළ යුතුය
218samples\_flat={}219fork,vinsamples.items():220v=v.reshape(v.shape[0]\*v.shape[1],\*v.shape[2:])221ifk=='obs':222samples\_flat[k]=obs\_to\_torch(v)223else:224samples\_flat[k]=torch.tensor(v,device=device)225226returnsamples\_flat
228deftrain(self,samples:Dict[str,torch.Tensor]):
එයවැඩි එපොච් සංඛ්යාවක් සමඟ වේගයෙන් ඉගෙන ගනී, නමුත් ටිකක් අස්ථායී වේ; එනම්, සාමාන්ය කථාංග විපාකය කාලයත් සමඟ ඒකාකාරී ලෙස වැඩි නොවේ. ක්ලිපින් පරාසය අඩු කිරීමෙන් එය විසඳිය හැකිය.
238for\_inrange(self.epochs()):
එක්එක් ඊපෝච් සඳහා කලවම් කරන්න
240indexes=torch.randperm(self.batch\_size)
එක්එක් කුඩා කණ්ඩායම සඳහා
243forstartinrange(0,self.batch\_size,self.mini\_batch\_size):
කුඩාකණ්ඩායම ලබා ගන්න
245end=start+self.mini\_batch\_size246mini\_batch\_indexes=indexes[start:end]247mini\_batch={}248fork,vinsamples.items():249mini\_batch[k]=v[mini\_batch\_indexes]
දුම්රිය
252loss=self.\_calc\_loss(mini\_batch)
ඉගෙනුම්අනුපාතය සකසන්න
255forpginself.optimizer.param\_groups:256pg['lr']=self.learning\_rate()
කලින්ගණනය කරන ලද අනුක්රමික ශුන්ය කිරීම
258self.optimizer.zero\_grad()
අනුක්රමිකගණනය කරන්න
260loss.backward()
ක්ලිප්අනුක්රමික
262torch.nn.utils.clip\_grad\_norm\_(self.model.parameters(),max\_norm=0.5)
අනුක්රමිකමත පදනම්ව පරාමිතීන් යාවත්කාලීන කරන්න
264self.optimizer.step()
266@staticmethod267def\_normalize(adv:torch.Tensor):
269return(adv-adv.mean())/(adv.std()+1e-8)
271def\_calc\_loss(self,samples:Dict[str,torch.Tensor])-\>torch.Tensor:
Rt සිට නියැදිය ප්රතිලාභ πθOLD
277sampled\_return=samples['values']+samples['advantages']
Atˉ=σ(At^)At^−μ(At^), කොහෙන්ද? At^ වාසි ලබා ඇත πθOLD. ගණනය කිරීම සඳහා පහත ප්රධාන පන්තියේ නියැදි ශ්රිතය වෙත යොමු වන්න A^t.
283sampled\_normalized\_advantage=self.\_normalize(samples['advantages'])
නියැදිනිරීක්ෂණ ලබා ගැනීමට ආකෘතියට පෝෂණය වන πθ(at∣st) අතර Vπθ(st); අපි නිරීක්ෂණ රාජ්ය ලෙස සලකමු
287pi,value=self.model(samples['obs'])
−logπθ(at∣st), ක්රියා at වලින් නියැලී ඇත πθOLD
290log\_pi=pi.log\_prob(samples['actions'])
ප්රතිපත්තිඅලාභය ගණනය කරන්න
293policy\_loss=self.ppo\_loss(log\_pi,samples['log\_pis'],sampled\_normalized\_advantage,self.clip\_range())
එන්ට්රොපිබෝනස් ගණනය කරන්න
LEB(θ)=E[Sπθ]
299entropy\_bonus=pi.entropy()300entropy\_bonus=entropy\_bonus.mean()
අගයශ්රිතය අහිමි ගණනය
303value\_loss=self.value\_loss(value,samples['values'],sampled\_return,self.clip\_range())
LCLIP+VF+EB(θ)=LCLIP(θ)+c1LVF(θ)−c2LEB(θ)
308loss=(policy\_loss309+self.value\_loss\_coef()\*value\_loss310-self.entropy\_bonus\_coef()\*entropy\_bonus)
අධීක්ෂණයසඳහා
313approx\_kl\_divergence=.5\*((samples['log\_pis']-log\_pi)\*\*2).mean()
ට්රැකර්වෙත එකතු කරන්න
316tracker.add({'policy\_reward':-policy\_loss,317'value\_loss':value\_loss,318'entropy\_bonus':entropy\_bonus,319'kl\_div':approx\_kl\_divergence,320'clip\_fraction':self.ppo\_loss.clip\_fraction})321322returnloss
324defrun\_training\_loop(self):
අවසන්100 කථාංග තොරතුරු
330tracker.set\_queue('reward',100,True)331tracker.set\_queue('length',100,True)332333forupdateinmonit.loop(self.updates):
වත්මන්ප්රතිපත්තිය සමඟ නියැදිය
335samples=self.sample()
ආකෘතියපුහුණු කරන්න
338self.train(samples)
ලුහුබැඳඇති දර්ශක සුරකින්න.
341tracker.save()
වරින්වර තිරයට නව රේඛාවක් එක් කරන්න
343if(update+1)%1\_000==0:344logger.log()
කම්කරුවන්නවත්වන්න
346defdestroy(self):
351forworkerinself.workers:352worker.child.send(("close",None))
355defmain():
අත්හදාබැලීම සාදන්න
357experiment.create(name='ppo')
වින්යාසකිරීම්
359configs={
යාවත්කාලීනගණන
361'updates':10000,
⚙️නියැදි දත්ත සමඟ ආකෘතිය පුහුණු කිරීම සඳහා එපොච් ගණන. අත්හදා බැලීම ක්රියාත්මක වන අතරතුර ඔබට මෙය වෙනස් කළ හැකිය.
365'epochs':IntDynamicHyperParam(8),
සේවකක්රියාවලි ගණන
367'n\_workers':8,
තනියාවත්කාලීන කිරීම සඳහා එක් එක් ක්රියාවලිය මත ක්රියාත්මක කිරීමට පියවර ගණන
369'worker\_steps':128,
කුඩාකණ්ඩායම් ගණන
371'batches':4,
⚙️අගය අහිමි සංගුණකය. අත්හදා බැලීම ක්රියාත්මක වන අතරතුර ඔබට මෙය වෙනස් කළ හැකිය.
375'value\_loss\_coef':FloatDynamicHyperParam(0.5),
⚙️එන්ට්රොපි ප්රසාද සංගුණකය. අත්හදා බැලීම ක්රියාත්මක වන අතරතුර ඔබට මෙය වෙනස් කළ හැකිය.
379'entropy\_bonus\_coef':FloatDynamicHyperParam(0.01),
⚙️ක්ලිප් පරාසය.
381'clip\_range':FloatDynamicHyperParam(0.1),
අත්හදාබැලීම ක්රියාත්මක වන අතරතුර ඔබට මෙය වෙනස් කළ හැකිය. ⚙️ ඉගෙනුම් අනුපාතය.
385'learning\_rate':FloatDynamicHyperParam(1e-3,(0,1e-3)),386}387388experiment.configs(configs)
පුහුණුකරුආරම්භ කරන්න
391m=Trainer(\*\*configs)
අත්හදාබැලීම ධාවනය කර අධීක්ෂණය කරන්න
394withexperiment.start():395m.run\_training\_loop()
කම්කරුවන්නවත්වන්න
397m.destroy()
401if\_\_name\_\_=="\_\_main\_\_":402main()