කණ්ඩායම්සාමාන්යකරණය

මෙය PyTorch ක්රියාත්මක කිරීම කඩදාසි කණ්ඩායම් සාමාන්යකරණය වෙතින් කණ්ඩායම් සාමාන්යකරණය කිරීම: අභ්යන්තර කෝවරියට් මාරුව අඩු කිරීමෙන් ගැඹුරු ජාල පුහුණුව වේගවත් කිරීම.

අභ්යන්තරකෝවරියන් මාරුව

පුහුණුවඅතරතුර ජාල පරාමිතීන් වෙනස් වීම හේතුවෙන් ජාල සක්රිය කිරීම් බෙදා හැරීමේ වෙනස ලෙස අභ්යන්තර කෝවරීට් මාරුව ලිපිය අර්ථ දක්වයි. උදාහරණයක් ලෙස, ස්ථර දෙකක් ඇති බව කියමු . පුහුණු ප්රතිදානයන් ආරම්භයේ දී ( යෙදවුම් කිරීමට ) බෙදාහැරීමේ විය හැකි . සමහර පුහුණු පියවරවලින් පසුව, එය වෙත ගමන් කළ හැකිය . මෙය අභ්යන්තර කෝවිරේට් මාරුවකි.

අභ්යන්තරකෝවිචරේට් මාරුව පුහුණු වේගයට අහිතකර ලෙස බලපානු ඇත, මන්ද පසුකාලීන ස්ථර (ඉහත උදාහරණයේ) මෙම මාරු කළ ව්යාප්තියට අනුවර්තනය විය යුතු බැවිනි.

බෙදාහැරීම ස්ථාවර කිරීමෙන්, කණ්ඩායම් සාමාන්යකරණය අභ්යන්තර කෝවිරේට් මාරුව අවම කරයි.

සාමාන්‍යකරණය

එයwhitening පුහුණු වේගය හා අභිසරණය වැඩි දියුණු කරන බව කවුරුත් හොඳින් දන්නා කරුණකි. සුදුකිරීම යනු ශුන්ය මධ්යන්යය, ඒකක විචලතාව සහ සහසම්බන්ධ නොවන ලෙස යෙදවුම් රේඛීයව පරිවර්තනය කිරීමයි.

ශ්රේණියේගණනය කිරීම පිටත සාමාන්යකරණය කිරීම ක්රියා නොකරයි

පූර්වගණනය කරන ලද (වෙන්වූ) මාධ්යයන් සහ විචල්යයන් භාවිතා කරමින් ශ්රේණියේ ගණනය පිටත සාමාන්යකරණය කිරීම ක්රියා නොකරයි. උදාහරණයක් ලෙස. (විචලතාව නොසලකා හැරීම), පුහුණු කරන ලද නැඹුරුවක් කොතැනද යන්න සහ පිටත ශ්රේණියේ ගණනය කිරීමක් (පූර්ව ගණනය කරන ලද නියතය) වේ.

කිසිදුබලපෑමක් ඇති නොවන බව සලකන්න . ඒ නිසා, පදනම් වැඩි හෝ අඩු වනු ඇත , සහ එක් එක් පුහුණු යාවත්කාලීන දින නියමයක් නොමැතිව වර්ධනය දිගටම. සමාන පිපිරීම් වෙනස්කම් සමඟ සිදුවන බව කඩදාසි සටහන් කරයි.

කණ්ඩායම්සාමාන්යකරණය

ඔබද-සහසම්බන්ධ කිරීමට අවශ්ය නිසා whitening පරිගණකමය මිල අධික වන අතර, අනුක්රමික සම්පූර්ණ whitening ගණනය හරහා ගලා යුතුය.

කඩදාසිසරල කළ අනුවාදයක් හඳුන්වා දෙන අතර එය කණ්ඩායම් සාමාන්යකරණයලෙස හැඳින්වේ. පළමු සරල කිරීම නම්, ශුන්ය මධ්යන්යය සහ ඒකක විචලතාව තිබීම සඳහා එක් එක් අංගය ස්වාධීනව සාමාන්යකරණය කිරීමයි: -dimensional ආදානය කොහේද?

දෙවනසරල කිරීම නම් සාමාන්යකරණය සඳහා කුඩා කණ්ඩායමෙන් මධ්යන්ය හා විචලතාව පිළිබඳ ඇස්තමේන්තු භාවිතා කිරීමයි; මුළු දත්ත සමුදාය පුරාම මධ්යන්යය හා විචලතාව ගණනය කිරීම වෙනුවට.

එක්එක් අංගය ශුන්ය මධ්යන්යයට හා ඒකක විචල්යතාවයට සාමාන්යකරණය කිරීම ස්තරය නියෝජනය කළ හැකි දෙයට බලපායි. උදාහරණයක් ලෙස කඩදාසි බව පෙන්නුම්, එය sigmoid කිරීමට යෙදවුම් සාමාන්යකරණය නම්, බොහෝ එය සිග්මෝයිඩ් රේඛීය කොහෙද පරාසය තුළ වනු ඇත. මෙය ජය ගැනීම සඳහා සෑම අංගයක්ම පුහුණු පරාමිතීන් දෙකකින් පරිමාණය කර මාරු කරනු ලැබේ . කණ්ඩායමේ සාමාන්යකරණ ස්ථරයේ ප්රතිදානය කොහේද?

රේඛීයපරිණාමයකින් පසු කණ්ඩායම් සාමාන්යකරණය යොදන විට නැඹුරුව පරාමිතිය සාමාන්යකරණය හේතුවෙන් අවලංගු වන බව සලකන්න. එබැවින් කණ්ඩායම් සාමාන්යකරණයට පෙර රේඛීය පරිවර්තනයේ නැඹුරුව පරාමිතිය ඔබට මඟ හැරිය යුතුය.

කණ්ඩායම්සාමාන්යකරණය මඟින් පසුපස ප්රචාරණය බර පරිමාණයට වෙනස් වන අතර ආනුභවික ලෙස එය සාමාන්යකරණය වැඩි දියුණු කරයි, එබැවින් එය විධිමත් කිරීමේ බලපෑම් ද ඇත.

අනුමානය

සාමාන්යකරණයකිරීම සඳහා අප දැනගත යුතු අතර එය සිදු කළ යුතුය. එබැවින් අනුමාන කිරීමේදී, ඔබට සම්පූර්ණ (හෝ කොටසක්) දත්ත සමුදාය හරහා ගොස් මධ්යන්ය හා විචලතාව සොයා ගත යුතුය, නැතහොත් පුහුණුව අතරතුර ගණනය කරන ලද ඇස්තමේන්තුවක් භාවිතා කළ හැකිය. සුපුරුදු පුහුණුව වන්නේ පුහුණු අවධියේදී මධ්යන්ය හා විචලතාවයේ on ාතීය චලනය වන සාමාන්යය ගණනය කිරීම සහ අනුමානය සඳහා භාවිතා කිරීමයි.

MNISTදත්ත කට්ටලය සඳහා කණ්ඩායම් සාමාන්යකරණය භාවිතා කරන සීඑන්එන් වර්ගීකරණයක් පුහුණු කිරීම සඳහා පුහුණු කේතය සහ සටහන් පොතක් මෙන්න.

Open In Colab View Run

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