මෙය PyTorch ක්රියාත්මක කිරීම කඩදාසි කණ්ඩායම් සාමාන්යකරණය වෙතින් කණ්ඩායම් සාමාන්යකරණය කිරීම: අභ්යන්තර කෝවරියට් මාරුව අඩු කිරීමෙන් ගැඹුරු ජාල පුහුණුව වේගවත් කිරීම.
පුහුණුවඅතරතුර ජාල පරාමිතීන් වෙනස් වීම හේතුවෙන් ජාල සක්රිය කිරීම් බෙදා හැරීමේ වෙනස ලෙස අභ්යන්තර කෝවරීට් මාරුව ලිපිය අර්ථ දක්වයි. උදාහරණයක් ලෙස, ස්ථර දෙකක් ඇති බව කියමු . පුහුණු ප්රතිදානයන් ආරම්භයේ දී ( යෙදවුම් කිරීමට ) බෙදාහැරීමේ විය හැකි . සමහර පුහුණු පියවරවලින් පසුව, එය වෙත ගමන් කළ හැකිය . මෙය අභ්යන්තර කෝවිරේට් මාරුවකි.
අභ්යන්තරකෝවිචරේට් මාරුව පුහුණු වේගයට අහිතකර ලෙස බලපානු ඇත, මන්ද පසුකාලීන ස්ථර (ඉහත උදාහරණයේ) මෙම මාරු කළ ව්යාප්තියට අනුවර්තනය විය යුතු බැවිනි.
බෙදාහැරීම ස්ථාවර කිරීමෙන්, කණ්ඩායම් සාමාන්යකරණය අභ්යන්තර කෝවිරේට් මාරුව අවම කරයි.
එයwhitening පුහුණු වේගය හා අභිසරණය වැඩි දියුණු කරන බව කවුරුත් හොඳින් දන්නා කරුණකි. සුදුකිරීම යනු ශුන්ය මධ්යන්යය, ඒකක විචලතාව සහ සහසම්බන්ධ නොවන ලෙස යෙදවුම් රේඛීයව පරිවර්තනය කිරීමයි.
පූර්වගණනය කරන ලද (වෙන්වූ) මාධ්යයන් සහ විචල්යයන් භාවිතා කරමින් ශ්රේණියේ ගණනය පිටත සාමාන්යකරණය කිරීම ක්රියා නොකරයි. උදාහරණයක් ලෙස. (විචලතාව නොසලකා හැරීම), පුහුණු කරන ලද නැඹුරුවක් කොතැනද යන්න සහ පිටත ශ්රේණියේ ගණනය කිරීමක් (පූර්ව ගණනය කරන ලද නියතය) වේ.
කිසිදුබලපෑමක් ඇති නොවන බව සලකන්න . ඒ නිසා, පදනම් වැඩි හෝ අඩු වනු ඇත , සහ එක් එක් පුහුණු යාවත්කාලීන දින නියමයක් නොමැතිව වර්ධනය දිගටම. සමාන පිපිරීම් වෙනස්කම් සමඟ සිදුවන බව කඩදාසි සටහන් කරයි.
ඔබද-සහසම්බන්ධ කිරීමට අවශ්ය නිසා whitening පරිගණකමය මිල අධික වන අතර, අනුක්රමික සම්පූර්ණ whitening ගණනය හරහා ගලා යුතුය.
කඩදාසිසරල කළ අනුවාදයක් හඳුන්වා දෙන අතර එය කණ්ඩායම් සාමාන්යකරණයලෙස හැඳින්වේ. පළමු සරල කිරීම නම්, ශුන්ය මධ්යන්යය සහ ඒකක විචලතාව තිබීම සඳහා එක් එක් අංගය ස්වාධීනව සාමාන්යකරණය කිරීමයි: -dimensional ආදානය කොහේද?
දෙවනසරල කිරීම නම් සාමාන්යකරණය සඳහා කුඩා කණ්ඩායමෙන් මධ්යන්ය හා විචලතාව පිළිබඳ ඇස්තමේන්තු භාවිතා කිරීමයි; මුළු දත්ත සමුදාය පුරාම මධ්යන්යය හා විචලතාව ගණනය කිරීම වෙනුවට.
එක්එක් අංගය ශුන්ය මධ්යන්යයට හා ඒකක විචල්යතාවයට සාමාන්යකරණය කිරීම ස්තරය නියෝජනය කළ හැකි දෙයට බලපායි. උදාහරණයක් ලෙස කඩදාසි බව පෙන්නුම්, එය sigmoid කිරීමට යෙදවුම් සාමාන්යකරණය නම්, බොහෝ එය සිග්මෝයිඩ් රේඛීය කොහෙද පරාසය තුළ වනු ඇත. මෙය ජය ගැනීම සඳහා සෑම අංගයක්ම පුහුණු පරාමිතීන් දෙකකින් පරිමාණය කර මාරු කරනු ලැබේ . කණ්ඩායමේ සාමාන්යකරණ ස්ථරයේ ප්රතිදානය කොහේද?
රේඛීයපරිණාමයකින් පසු කණ්ඩායම් සාමාන්යකරණය යොදන විට නැඹුරුව පරාමිතිය සාමාන්යකරණය හේතුවෙන් අවලංගු වන බව සලකන්න. එබැවින් කණ්ඩායම් සාමාන්යකරණයට පෙර රේඛීය පරිවර්තනයේ නැඹුරුව පරාමිතිය ඔබට මඟ හැරිය යුතුය.
කණ්ඩායම්සාමාන්යකරණය මඟින් පසුපස ප්රචාරණය බර පරිමාණයට වෙනස් වන අතර ආනුභවික ලෙස එය සාමාන්යකරණය වැඩි දියුණු කරයි, එබැවින් එය විධිමත් කිරීමේ බලපෑම් ද ඇත.
සාමාන්යකරණයකිරීම සඳහා අප දැනගත යුතු අතර එය සිදු කළ යුතුය. එබැවින් අනුමාන කිරීමේදී, ඔබට සම්පූර්ණ (හෝ කොටසක්) දත්ත සමුදාය හරහා ගොස් මධ්යන්ය හා විචලතාව සොයා ගත යුතුය, නැතහොත් පුහුණුව අතරතුර ගණනය කරන ලද ඇස්තමේන්තුවක් භාවිතා කළ හැකිය. සුපුරුදු පුහුණුව වන්නේ පුහුණු අවධියේදී මධ්යන්ය හා විචලතාවයේ on ාතීය චලනය වන සාමාන්යය ගණනය කිරීම සහ අනුමානය සඳහා භාවිතා කිරීමයි.
MNISTදත්ත කට්ටලය සඳහා කණ්ඩායම් සාමාන්යකරණය භාවිතා කරන සීඑන්එන් වර්ගීකරණයක් පුහුණු කිරීම සඳහා පුහුණු කේතය සහ සටහන් පොතක් මෙන්න.
98import torch
99from torch import nn
100
101from labml_helpers.module import Moduleකණ්ඩායම්සාමාන්යකරණ ස්තරය ආදානය පහත පරිදි සාමාන්යකරණය කරයි:
ආදානය රූප නිරූපණ සමූහයක් වන විට, කණ්ඩායම් ප්රමාණය කොතැනද, නාලිකා ගණන, උස සහ පළල වේ. සහ .
ආදානය කාවැද්දීම් සමූහයක් වන විට, කණ්ඩායම් ප්රමාණය කොතැනද සහ විශේෂාංග ගණන වේ. සහ .
ආදානය යනු අනුක්රමය කාවැද්දීම් කාණ්ඩයක් වන විට, කණ්ඩායම් ප්රමාණය කොතැනද, විශේෂාංග ගණන වන අතර දිග වේ අනුක්රමය. සහ .
104class BatchNorm(Module):channels
යනු ආදානයේ ඇති විශේෂාංග ගණන eps
සංඛ්යාත්මක ස්ථායිතාව සඳහා භාවිතා වේ momentum
ඝාතීය වෙනස්වන සාමාන්යය ගනිමින් ගම්යතාව වේ affine
සාමාන්යකරණය කළ අගය පරිමාණය කර මාරු කළ යුතුද යන්නයි track_running_stats
චලනය වන සාමාන්යය හෝ මධ්යන්ය හා විචලතාව ගණනය කළ යුතුද යන්නයිPyTorch BatchNorm
ක්රියාත්මක කිරීම වැනි තර්ක සඳහා එකම නම් භාවිතා කිරීමට අපි උත්සාහ කර ඇත්තෙමු.
132 def __init__(self, channels: int, *,
133 eps: float = 1e-5, momentum: float = 0.1,
134 affine: bool = True, track_running_stats: bool = True):144 super().__init__()
145
146 self.channels = channels
147
148 self.eps = eps
149 self.momentum = momentum
150 self.affine = affine
151 self.track_running_stats = track_running_statsපරිමාණයසහ මාරුව සඳහා සහ පරාමිතීන් සාදන්න
153 if self.affine:
154 self.scale = nn.Parameter(torch.ones(channels))
155 self.shift = nn.Parameter(torch.zeros(channels))මධ්යන්ය හා විචලතාවයේ on ාතීය චලනය වන සාමාන්යයන් ගබඩා කිරීම සඳහා බෆර සාදන්න
158 if self.track_running_stats:
159 self.register_buffer('exp_mean', torch.zeros(channels))
160 self.register_buffer('exp_var', torch.ones(channels)) x
හැඩයේ ආතන්ය [batch_size, channels, *]
වේ. *
ඕනෑම සංඛ්යාවක් (සමහරවිට 0) මානයන් දක්වයි. උදාහරණයක් ලෙස, රූපයක් (2D) සංකෝචනය තුළ මෙය වනු ඇත [batch_size, channels, height, width]
162 def forward(self, x: torch.Tensor):මුල්හැඩය තබා ගන්න
170 x_shape = x.shapeකණ්ඩායම්ප්රමාණය ලබා ගන්න
172 batch_size = x_shape[0]විශේෂාංගගණන සමාන බව තහවුරු කර ගැනීම සඳහා සනීපාරක්ෂාව පරීක්ෂා කරන්න
174 assert self.channels == x.shape[1]නැවතහැඩගස්වා ගන්න [batch_size, channels, n]
177 x = x.view(batch_size, self.channels, -1)අපපුහුණු මාදිලියේ සිටී නම් හෝ on ාතීය චලනය වන සාමාන්යයන් නිරීක්ෂණය කර නොමැති නම් අපි කුඩා කණ්ඩායම් මධ්යන්යය සහ විචලතාව ගණනය කරන්නෙමු
181 if self.training or not self.track_running_stats:පළමුහා අවසාන මානය හරහා මධ්යන්යය ගණනය කරන්න; එනම් එක් එක් ලක්ෂණය සඳහා මාධ්යයන්
184 mean = x.mean(dim=[0, 2])පළමුහා අවසාන මානයන් හරහා වර්ග කළ මධ්යන්යය ගණනය කරන්න; එනම් එක් එක් ලක්ෂණය සඳහා මාධ්යයන්
187 mean_x2 = (x ** 2).mean(dim=[0, 2])එක්එක් ලක්ෂණය සඳහා විචලතාව
189 var = mean_x2 - mean ** 2ඝාතීයවෙනස්වන සාමාන්යය යාවත්කාලීන
192 if self.training and self.track_running_stats:
193 self.exp_mean = (1 - self.momentum) * self.exp_mean + self.momentum * mean
194 self.exp_var = (1 - self.momentum) * self.exp_var + self.momentum * varඇස්තමේන්තුලෙස ඝාතීය චලනය වන සාමාන්යය භාවිතා කරන්න
196 else:
197 mean = self.exp_mean
198 var = self.exp_varසාමාන්යකරන්න
201 x_norm = (x - mean.view(1, -1, 1)) / torch.sqrt(var + self.eps).view(1, -1, 1)පරිමාණයසහ මාරුව
203 if self.affine:
204 x_norm = self.scale.view(1, -1, 1) * x_norm + self.shift.view(1, -1, 1)මුල්පිටපතට නැවත හැඩගස්වා නැවත පැමිණීම
207 return x_norm.view(x_shape)සරලපරීක්ෂණය
210def _test():214 from labml.logger import inspect
215
216 x = torch.zeros([2, 3, 2, 4])
217 inspect(x.shape)
218 bn = BatchNorm(3)
219
220 x = bn(x)
221 inspect(x.shape)
222 inspect(bn.exp_var.shape)226if __name__ == '__main__':
227 _test()