docs/si/rl/dqn/replay_buffer.html
මෙයද්විමය අංශ ගසක් භාවිතා කරමින් කඩදාසි ප්රමුඛතා අත්දැකීම් නැවත ධාවනයකරයි.
16importrandom1718importnumpyasnp
ප්රමුඛතා අත්දැකීම් සාම්පල නැවත ධාවනය කිරීම වැදගත් සංක්රාන්ති නිතර නිතර. සංක්රාන්ති සඳහා ප්රමුඛතාවය දෙනු ලබන්නේ තාවකාලික වෙනස දෝෂය (td දෝෂය), δ.
අපිසම්භාවිතාව i සමඟ සංක්රාන්තිය නියැදි කරන්නෙමු, ප්රමුඛතාවය කොපමණ ප්රමාණයක් භාවිතා කරනවාද යන්න තීරණය කරන අධි-පරාමිතියක් P(i)=∑kpkαpiα කොහෙද α ? α=0 ඒකාකාර නඩුවට අනුරූප වේ. pi ප්රමුඛතාවය වේ.
සංක්රාන්තියසඳහා තාවකාලික වෙනස pi=∣δi∣+ϵ δi කොතැනද සමානුපාතික ප්රමුඛතාවය අපි භාවිතා කරමු i.
පාඩුශ්රිතයේ වැදගත්-නියැදීම් (IS) බර wi=(N1P(i)1)β භාවිතා කරමින් ප්රමුඛතා නැවත ධාවනය කිරීමෙන් හඳුන්වා දෙන ලද නැඹුරුව අපි නිවැරදි කරමු. මෙය සම්පූර්ණයෙන්ම වන්දි ගෙවන්නේ කවදාද β=1යන්නයි. ස්ථාවරත්වය maxiwi1 සඳහා අපි බර සාමාන්යකරණය කරමු. පුහුණුව අවසානයේ අභිසාරීතාව කෙරෙහි අපක්ෂපාතී ස්වභාවය වඩාත් වැදගත් වේ. එබැවින් අපි පුහුණුව β අවසන් කිරීම සඳහා වැඩි වෙමු.
නියැදියසඳහා අවශ්ය වන සමුච්චිත සම්භාවිතාව කාර්යක්ෂමව ගණනය කිරීම සඳහා ∑kipkαද්විමය ඛණ්ඩක ගසක් භාවිතා කරමු. ඒ වගේම අපි සොයා ගැනීමට ද්විමය කොටස ගසක් භාවිතා minpiα, සඳහා අවශ්ය වන maxiwi1. මේ සඳහා අපට කුඩා ගොඩක් භාවිතා කළ හැකිය. ද්විමය ඛණ්ඩයේ ගස අපට O(logn) කාලය තුළ මෙම ගණනය කිරීමට ඉඩ දෙයි, එය බොළඳ O(n) ප්රවේශය වඩාත් කාර්යක්ෂම වේ.
ද්විමයඛණ්ඩක ගසක් එකතුව සඳහා ක්රියා කරන ආකාරය මෙයයි; එය අවම වශයෙන් සමාන වේ. අපි නියෝජනය කිරීමට අවශ්ය N වටිනාකම් ලැයිස්තුව කරමු xi . ද්විමය ගසෙහි ith පේළියේ jth නෝඩය bi,j විය යුතුය. ඒ node එකක් මතම ඊට අදාල දරුවන් දෙදෙනෙකු bi,j වන bi+1,2j අතර bi+1,2j+1.
පේළියේකොළ නෝඩ් වල අගයන් D=⌈1+log2N⌉ ඇත x. සෑම නෝඩයක්ම ළමා නෝඩ් දෙකේ එකතුව තබා ගනී. එනම්, මූල නෝඩය සමස්ත අගයන්හි එකතුව තබා ගනී. මූල node එකක් මතම ඊට අදාල වම් හා දකුණු දරුවන් පිළිවෙළින් අරාවෙහි පළමු භාගයේ එකතුව සහ දෙවන භාගයේ එකතුව තබා ගන්න. හා එසේ මත...
bi,j=k=(j−1)∗2D−i+1∑j∗2D−ixk
පේළියේනෝඩ් ගණන i, Ni=⌈D−i+1N⌉ මෙය ඉහත සියලු පේළිවල නෝඩ් එකතුවට සමාන වේ i. ඒ නිසා අපට ගස ගබඩා a කිරීම සඳහා තනි අරාවක් භාවිතා කළ හැකිය, කොහේද, bi,j→aNi+j
එවිටළමා නෝඩ් ai a2i සහ a2i+1. එනම්, ai=a2i+a2i+1
ද්විමයගස් නඩත්තු කිරීමේ මෙම ක්රමය ක්රමලේඛනය කිරීම ඉතා පහසුය. අපිසුචිගත කිරීම 1 සිට ආරම්භ වන බව සලකන්න.
අවමගණනය කිරීම සඳහා අපි එකම ව්යුහය භාවිතා කරමු.
21classReplayBuffer:
91def\_\_init\_\_(self,capacity,alpha):
අපිධාරිතාව 2 සඳහා බලයක් භාවිතා කරන්නේ එය කේතය සහ නිදොස්කරණය සරල කරන බැවිනි
96self.capacity=capacity
α
98self.alpha=alpha
මුදලක්ගැනීමට සහ පරාසයක් පුරා අවම සොයා ගැනීමට කොටස ද්විමය ගස් පවත්වා
101self.priority\_sum=[0for\_inrange(2\*self.capacity)]102self.priority\_min=[float('inf')for\_inrange(2\*self.capacity)]
වත්මන්උපරිම ප්රමුඛතාවය p,, නව සංක්රාන්ති සඳහා පැවරිය යුතුය
105self.max\_priority=1.
බෆරයසඳහා අරා
108self.data={109'obs':np.zeros(shape=(capacity,4,84,84),dtype=np.uint8),110'action':np.zeros(shape=capacity,dtype=np.int32),111'reward':np.zeros(shape=capacity,dtype=np.float32),112'next\_obs':np.zeros(shape=(capacity,4,84,84),dtype=np.uint8),113'done':np.zeros(shape=capacity,dtype=np.bool)114}
දත්තගබඩා කිරීම සඳහා අපි චක්රීය බෆර් භාවිතා කරන අතර ඊළඟ හිස් තට්ටුවේ දර්ශකය next_idx තබා ගනිමු
117self.next\_idx=0
බෆරයේප්රමාණය
120self.size=0
122defadd(self,obs,action,reward,next\_obs,done):
ඊළඟලබාගත හැකි තව් ලබා ගන්න
128idx=self.next\_idx
පෝලිමේගබඩා
131self.data['obs'][idx]=obs132self.data['action'][idx]=action133self.data['reward'][idx]=reward134self.data['next\_obs'][idx]=next\_obs135self.data['done'][idx]=done
ඊළඟලබා ගත හැකි තව් වැඩි කිරීම
138self.next\_idx=(idx+1)%self.capacity
ප්රමාණයගණනය කරන්න
140self.size=min(self.capacity,self.size+1)
piα, නව සාම්පල ලබා max_priority
143priority\_alpha=self.max\_priority\*\*self.alpha
එකතුවසහ අවම වශයෙන් කොටස් ගස් දෙක යාවත්කාලීන කරන්න
145self.\_set\_priority\_min(idx,priority\_alpha)146self.\_set\_priority\_sum(idx,priority\_alpha)
148def\_set\_priority\_min(self,idx,priority\_alpha):
ද්විමයගසෙහි කොළ
154idx+=self.capacity155self.priority\_min[idx]=priority\_alpha
මුතුන්මිත්තන් ඔස්සේ ගමන් කිරීමෙන් ගස යාවත්කාලීන කරන්න. ගසේ මුල තෙක් දිගටම කරගෙන යන්න.
159whileidx\>=2:
මව්නෝඩයේ දර්ශකය ලබා ගන්න
161idx//=2
මව්node එකක් මතම ඊට අදාල වටිනාකම එය දරුවන් දෙදෙනා අවම වේ
163self.priority\_min[idx]=min(self.priority\_min[2\*idx],self.priority\_min[2\*idx+1])
165def\_set\_priority\_sum(self,idx,priority):
ද්විමයගසෙහි කොළ
171idx+=self.capacity
කොළයේප්රමුඛතාවය සකසන්න
173self.priority\_sum[idx]=priority
මුතුන්මිත්තන් ඔස්සේ ගමන් කිරීමෙන් ගස යාවත්කාලීන කරන්න. ගසේ මුල තෙක් දිගටම කරගෙන යන්න.
177whileidx\>=2:
මව්නෝඩයේ දර්ශකය ලබා ගන්න
179idx//=2
මව්node එකක් මතම ඊට අදාල වටිනාකම එය දරුවන් දෙදෙනා එකතුව
181self.priority\_sum[idx]=self.priority\_sum[2\*idx]+self.priority\_sum[2\*idx+1]
183def\_sum(self):
මූලනෝඩය සියලු අගයන්හි එකතුව තබා ගනී
189returnself.priority\_sum[1]
191def\_min(self):
මූලනෝඩය සියලු අගයන්හි අවම වශයෙන් තබා ගනී
197returnself.priority\_min[1]
199deffind\_prefix\_sum\_idx(self,prefix\_sum):
මූලසිට ආරම්භ කරන්න
205idx=1206whileidx\<self.capacity:
වම්ශාඛාවේ එකතුව අවශ්ය ප්රමාණයට වඩා වැඩි නම්
208ifself.priority\_sum[idx\*2]\>prefix\_sum:
ගසෙහිවම් ශාඛාවට යන්න
210idx=2\*idx211else:
එසේනොමැතිනම් දකුණු ශාඛාවට ගොස් වම් ශාඛාවේ එකතුව අවශ්ය මුදලින් අඩු කරන්න
214prefix\_sum-=self.priority\_sum[idx\*2]215idx=2\*idx+1
අපිකොළ node එකක් මතම ඊට අදාල වේ. සැබෑ වටිනාකමේ දර්ශකය ලබා ගැනීම සඳහා ගසෙහි දර්ශකය මගින් ධාරිතාව අඩු කිරීම
219returnidx-self.capacity
221defsample(self,batch\_size,beta):
සාම්පලආරම්භ කරන්න
227samples={228'weights':np.zeros(shape=batch\_size,dtype=np.float32),229'indexes':np.zeros(shape=batch\_size,dtype=np.int32)230}
නියැදිදර්ශක ලබා ගන්න
233foriinrange(batch\_size):234p=random.random()\*self.\_sum()235idx=self.find\_prefix\_sum\_idx(p)236samples['indexes'][i]=idx
miniP(i)=∑kpkαminipiα
239prob\_min=self.\_min()/self.\_sum()
maxiwi=(N1miniP(i)1)β
241max\_weight=(prob\_min\*self.size)\*\*(-beta)242243foriinrange(batch\_size):244idx=samples['indexes'][i]
P(i)=∑kpkαpiα
246prob=self.priority\_sum[idx+self.capacity]/self.\_sum()
wi=(N1P(i)1)β
248weight=(prob\*self.size)\*\*(-beta)
සාමාන්යකරණයකරන්න maxiwi1, එමඟින් N1 පදය අවලංගු වේ
251samples['weights'][i]=weight/max\_weight
සාම්පලදත්ත ලබා ගන්න
254fork,vinself.data.items():255samples[k]=v[samples['indexes']]256257returnsamples
259defupdate\_priorities(self,indexes,priorities):
264foridx,priorityinzip(indexes,priorities):
වත්මන්උපරිම ප්රමුඛතාවය සකසන්න
266self.max\_priority=max(self.max\_priority,priority)
ගණනයකරන්න piα
269priority\_alpha=priority\*\*self.alpha
ගස්යාවත්කාලීන කරන්න
271self.\_set\_priority\_min(idx,priority\_alpha)272self.\_set\_priority\_sum(idx,priority\_alpha)
274defis\_full(self):
278returnself.capacity==self.size