docs/si/normalization/batch_norm/index.html
[View code on Github](https://github.com/labmlai/annotated_deep_learning_paper_implementations/tree/master/labml_nn/normalization/batch_norm/ init.py)
මෙය PyTorch ක්රියාත්මක කිරීම කඩදාසි කණ්ඩායම් සාමාන්යකරණය වෙතින් කණ්ඩායම් සාමාන්යකරණය කිරීම: අභ්යන්තර කෝවරියට් මාරුව අඩු කිරීමෙන් ගැඹුරු ජාල පුහුණුව වේගවත් කිරීම.
පුහුණුවඅතරතුර ජාල පරාමිතීන් වෙනස් වීම හේතුවෙන් ජාල සක්රිය කිරීම් බෙදා හැරීමේ වෙනස ලෙස අභ්යන්තර කෝවරීට් මාරුව ලිපිය අර්ථ දක්වයි. උදාහරණයක් ලෙස, ස්ථර දෙකක් ඇති බව l1 කියමු l2. පුහුණු ප්රතිදානයන් ආරම්භයේ දී ( l1 යෙදවුම් කිරීමට l2) බෙදාහැරීමේ විය හැකි N(0.5,1). සමහර පුහුණු පියවරවලින් පසුව, එය වෙත ගමන් කළ හැකිය N(0.6,1.5). මෙය අභ්යන්තර කෝවිරේට් මාරුවකි.
අභ්යන්තරකෝවිචරේට් මාරුව පුහුණු වේගයට අහිතකර ලෙස බලපානු ඇත, මන්ද පසුකාලීන ස්ථර (ඉහතl2 උදාහරණයේ) මෙම මාරු කළ ව්යාප්තියට අනුවර්තනය විය යුතු බැවිනි.
බෙදාහැරීම ස්ථාවර කිරීමෙන්, කණ්ඩායම් සාමාන්යකරණය අභ්යන්තර කෝවිරේට් මාරුව අවම කරයි.
එයwhitening පුහුණු වේගය හා අභිසරණය වැඩි දියුණු කරන බව කවුරුත් හොඳින් දන්නා කරුණකි. සුදුකිරීම යනු ශුන්ය මධ්යන්යය, ඒකක විචලතාව සහ සහසම්බන්ධ නොවන ලෙස යෙදවුම් රේඛීයව පරිවර්තනය කිරීමයි.
පූර්වගණනය කරන ලද (වෙන්වූ) මාධ්යයන් සහ විචල්යයන් භාවිතා කරමින් ශ්රේණියේ ගණනය පිටත සාමාන්යකරණය කිරීම ක්රියා නොකරයි. උදාහරණයක් ලෙස. (විචලතාව නොසලකා හැරීම), පුහුණු කරන ලද නැඹුරුවක් x^=x−E[x] x=u+b කොතැනද යන්න සහ E[x] පිටත ශ්රේණියේ ගණනය කිරීමක් (පූර්ව ගණනය කරන ලද නියතය) වේ. b
කිසිදුබලපෑමක් x^ ඇති නොවන බව සලකන්න b. ඒ නිසා, පදනම් වැඩි හෝ අඩු b වනු ඇත ∂x∂L, සහ එක් එක් පුහුණු යාවත්කාලීන දින නියමයක් නොමැතිව වර්ධනය දිගටම. සමාන පිපිරීම් වෙනස්කම් සමඟ සිදුවන බව කඩදාසි සටහන් කරයි.
ඔබද-සහසම්බන්ධ කිරීමට අවශ්ය නිසා whitening පරිගණකමය මිල අධික වන අතර, අනුක්රමික සම්පූර්ණ whitening ගණනය හරහා ගලා යුතුය.
කඩදාසිසරල කළ අනුවාදයක් හඳුන්වා දෙන අතර එය _කණ්ඩායම් සාමාන්යකරණය_ලෙස හැඳින්වේ. පළමු සරල කිරීම නම්, ශුන්ය මධ්යන්යය සහ ඒකක විචලතාව තිබීම සඳහා එක් එක් අංගය ස්වාධීනව සාමාන්යකරණය කිරීමයි: d-dimensional x=(x(1)...x(d)) ආදානය x^(k)=Var[x(k)]x(k)−E[x(k)] කොහේද?
දෙවනසරල කිරීම නම් සාමාන්යකරණය සඳහා කුඩා Var[x(k)] කණ්ඩායමෙන් මධ්යන්ය E[x(k)] හා විචලතාව පිළිබඳ ඇස්තමේන්තු භාවිතා කිරීමයි; මුළු දත්ත සමුදාය පුරාම මධ්යන්යය හා විචලතාව ගණනය කිරීම වෙනුවට.
එක්එක් අංගය ශුන්ය මධ්යන්යයට හා ඒකක විචල්යතාවයට සාමාන්යකරණය කිරීම ස්තරය නියෝජනය කළ හැකි දෙයට බලපායි. උදාහරණයක් ලෙස කඩදාසි බව පෙන්නුම්, එය sigmoid කිරීමට යෙදවුම් සාමාන්යකරණය නම්, බොහෝ එය සිග්මෝයිඩ් රේඛීය කොහෙද [−1,1] පරාසය තුළ වනු ඇත. මෙය ජය ගැනීම සඳහා සෑම අංගයක්ම පුහුණු පරාමිතීන් γ(k) දෙකකින් පරිමාණය කර මාරු කරනු ලැබේ β(k). y(k)=γ(k)x^(k)+β(k) කණ්ඩායමේ සාමාන්යකරණ ස්ථරයේ ප්රතිදානය y(k) කොහේද?
රේඛීයපරිණාමයකින් පසු කණ්ඩායම් සාමාන්යකරණය යොදන විට නැඹුරුව පරාමිතිය b සාමාන්යකරණය හේතුවෙන් අවලංගු වන බව සලකන්න. Wu+b එබැවින් කණ්ඩායම් සාමාන්යකරණයට පෙර රේඛීය පරිවර්තනයේ නැඹුරුව පරාමිතිය ඔබට මඟ හැරිය යුතුය.
කණ්ඩායම්සාමාන්යකරණය මඟින් පසුපස ප්රචාරණය බර පරිමාණයට වෙනස් වන අතර ආනුභවික ලෙස එය සාමාන්යකරණය වැඩි දියුණු කරයි, එබැවින් එය විධිමත් කිරීමේ බලපෑම් ද ඇත.
සාමාන්යකරණයකිරීම සඳහා අප දැනගත යුතු E[x(k)] අතර Var[x(k)] එය සිදු කළ යුතුය. එබැවින් අනුමාන කිරීමේදී, ඔබට සම්පූර්ණ (හෝ කොටසක්) දත්ත සමුදාය හරහා ගොස් මධ්යන්ය හා විචලතාව සොයා ගත යුතුය, නැතහොත් පුහුණුව අතරතුර ගණනය කරන ලද ඇස්තමේන්තුවක් භාවිතා කළ හැකිය. සුපුරුදු පුහුණුව වන්නේ පුහුණු අවධියේදී මධ්යන්ය හා විචලතාවයේ on ාතීය චලනය වන සාමාන්යය ගණනය කිරීම සහ අනුමානය සඳහා භාවිතා කිරීමයි.
MNISTදත්ත කට්ටලය සඳහා කණ්ඩායම් සාමාන්යකරණය භාවිතා කරන සීඑන්එන් වර්ගීකරණයක් පුහුණු කිරීම සඳහා පුහුණු කේතය සහ සටහන් පොතක් මෙන්න.
98importtorch99fromtorchimportnn100101fromlabml\_helpers.moduleimportModule
කණ්ඩායම්සාමාන්යකරණ ස්තරය ආදානය පහත X පරිදි BN සාමාන්යකරණය කරයි:
X∈RB×C×H×W ආදානය රූප නිරූපණ සමූහයක් B වන විට, කණ්ඩායම් ප්රමාණය කොතැනද, C නාලිකා ගණන, H උස සහ W පළල වේ. γ∈RC සහ β∈RC. BN(X)=γB,H,WVar[X]+ϵX−B,H,WE[X]+β
X∈RB×C ආදානය කාවැද්දීම් සමූහයක් B වන විට, කණ්ඩායම් ප්රමාණය කොතැනද සහ විශේෂාංග ගණන C වේ. γ∈RC සහ β∈RC. BN(X)=γBVar[X]+ϵX−BE[X]+β
ආදානය X∈RB×C×L යනු අනුක්රමය කාවැද්දීම් කාණ්ඩයක් B වන විට, කණ්ඩායම් ප්රමාණය කොතැනද, විශේෂාංග ගණන L වන අතර දිග වේ C අනුක්රමය. γ∈RC සහ β∈RC. BN(X)=γB,LVar[X]+ϵX−B,LE[X]+β
104classBatchNorm(Module):
channels යනු ආදානයේ ඇති විශේෂාංග ගණනeps සංඛ්යාත්මක ස්ථායිතාව Var[x(k)]+ϵ සඳහා භාවිතා වේ ϵmomentum ඝාතීය වෙනස්වන සාමාන්යය ගනිමින් ගම්යතාව වේaffine සාමාන්යකරණය කළ අගය පරිමාණය කර මාරු කළ යුතුද යන්නයිtrack_running_stats චලනය වන සාමාන්යය හෝ මධ්යන්ය හා විචලතාව ගණනය කළ යුතුද යන්නයිPyTorch BatchNorm ක්රියාත්මක කිරීම වැනි තර්ක සඳහා එකම නම් භාවිතා කිරීමට අපි උත්සාහ කර ඇත්තෙමු.
132def\_\_init\_\_(self,channels:int,\*,133eps:float=1e-5,momentum:float=0.1,134affine:bool=True,track\_running\_stats:bool=True):
144super().\_\_init\_\_()145146self.channels=channels147148self.eps=eps149self.momentum=momentum150self.affine=affine151self.track\_running\_stats=track\_running\_stats
පරිමාණයසහ මාරුව β සඳහා γ සහ පරාමිතීන් සාදන්න
153ifself.affine:154self.scale=nn.Parameter(torch.ones(channels))155self.shift=nn.Parameter(torch.zeros(channels))
මධ්යන්ය E[x(k)] හා විචලතාවයේ on ාතීය චලනය වන සාමාන්යයන් ගබඩා කිරීම සඳහා බෆර සාදන්න Var[x(k)]
158ifself.track\_running\_stats:159self.register\_buffer('exp\_mean',torch.zeros(channels))160self.register\_buffer('exp\_var',torch.ones(channels))
x හැඩයේ ආතන්ය [batch_size, channels, *] වේ. * ඕනෑම සංඛ්යාවක් (සමහරවිට 0) මානයන් දක්වයි. උදාහරණයක් ලෙස, රූපයක් (2D) සංකෝචනය තුළ මෙය වනු ඇත [batch_size, channels, height, width]
162defforward(self,x:torch.Tensor):
මුල්හැඩය තබා ගන්න
170x\_shape=x.shape
කණ්ඩායම්ප්රමාණය ලබා ගන්න
172batch\_size=x\_shape[0]
විශේෂාංගගණන සමාන බව තහවුරු කර ගැනීම සඳහා සනීපාරක්ෂාව පරීක්ෂා කරන්න
174assertself.channels==x.shape[1]
නැවතහැඩගස්වා ගන්න [batch_size, channels, n]
177x=x.view(batch\_size,self.channels,-1)
අපපුහුණු මාදිලියේ සිටී නම් හෝ on ාතීය චලනය වන සාමාන්යයන් නිරීක්ෂණය කර නොමැති නම් අපි කුඩා කණ්ඩායම් මධ්යන්යය සහ විචලතාව ගණනය කරන්නෙමු
181ifself.trainingornotself.track\_running\_stats:
පළමුහා අවසාන මානය හරහා මධ්යන්යය ගණනය කරන්න; එනම් එක් එක් ලක්ෂණය සඳහා මාධ්යයන් E[x(k)]
184mean=x.mean(dim=[0,2])
පළමුහා අවසාන මානයන් හරහා වර්ග කළ මධ්යන්යය ගණනය කරන්න; එනම් එක් එක් ලක්ෂණය සඳහා මාධ්යයන් E[(x(k))2]
187mean\_x2=(x\*\*2).mean(dim=[0,2])
එක්එක් ලක්ෂණය සඳහා විචලතාව Var[x(k)]=E[(x(k))2]−E[x(k)]2
189var=mean\_x2-mean\*\*2
ඝාතීයවෙනස්වන සාමාන්යය යාවත්කාලීන
192ifself.trainingandself.track\_running\_stats:193self.exp\_mean=(1-self.momentum)\*self.exp\_mean+self.momentum\*mean194self.exp\_var=(1-self.momentum)\*self.exp\_var+self.momentum\*var
ඇස්තමේන්තුලෙස ඝාතීය චලනය වන සාමාන්යය භාවිතා කරන්න
196else:197mean=self.exp\_mean198var=self.exp\_var
සාමාන්යකරන්න x^(k)=Var[x(k)]+ϵx(k)−E[x(k)]
201x\_norm=(x-mean.view(1,-1,1))/torch.sqrt(var+self.eps).view(1,-1,1)
පරිමාණයසහ මාරුව y(k)=γ(k)x^(k)+β(k)
203ifself.affine:204x\_norm=self.scale.view(1,-1,1)\*x\_norm+self.shift.view(1,-1,1)
මුල්පිටපතට නැවත හැඩගස්වා නැවත පැමිණීම
207returnx\_norm.view(x\_shape)
සරලපරීක්ෂණය
210def\_test():
214fromlabml.loggerimportinspect215216x=torch.zeros([2,3,2,4])217inspect(x.shape)218bn=BatchNorm(3)219220x=bn(x)221inspect(x.shape)222inspect(bn.exp\_var.shape)
226if\_\_name\_\_=='\_\_main\_\_':227\_test()