Back to Annotated Deep Learning Paper Implementations

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

docs/si/rl/ppo/experiment.html

latest18.6 KB
Original Source

homerlppo

View code on Github

#

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

මෙමඅත්හදා බැලීම 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(θ)+c1​LVF(θ)−c2​LEB(θ)

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()

Trending Research Paperslabml.ai