මෙය ස්ථර සාමාන්යකරණය කිරීමේ PyTorch ක්රියාත්මක කිරීමයි.
ස්ථරසාමාන්යකරණය යනු පුළුල් පරාසයක සැකසුම් මත ක්රියා කරන සරල සාමාන්යකරණ ක්රමයකි. ස්ථර සාමාන්යකරණය මඟින් යෙදවුම් අංග හරහා ශුන්ය මධ්යන්යය සහ ඒකක විචලතාව ඇති බවට පරිවර්තනය කරයි. කණ්ඩායම්සාමාන්යකරණය එක් එක් මූලද්රව්යය සඳහා ශුන්ය මධ්යන්යය සහ ඒකක විචලතාව නිවැරදි කරන බව සලකන්න. ස්ථරයසාමාන්යකරණය සියලු අංග හරහා එක් එක් කණ්ඩායම සඳහා එය කරන්නේ.
ස්ථරසාමාන්යකරණය සාමාන්යයෙන් එන්එල්පී කාර්යයන් සඳහා භාවිතා වේ.
ට්රාන්ස්ෆෝමර් ක්රියාත්මක කිරීම්බොහොමයක ස්ථර සාමාන්යකරණය අපි භාවිතා කර ඇත්තෙමු.
35from typing import Union, List
36
37import torch
38from torch import nn, Size
39
40from labml_helpers.module import Moduleස්ථර සාමාන්යකරණය පහත පරිදි ආදානය සාමාන්යකරණය කරයි:
ආදානය කාවැද්දීම් සමූහයක් වන විට, කණ්ඩායම් ප්රමාණය කොතැනද සහ විශේෂාංග ගණන වේ. සහ .
ආදානය යනු කාවැද්දීම් අනුක්රමයක කාණ්ඩයක් වන විට, කණ්ඩායම් ප්රමාණය කොතැනද, නාලිකා ගණන, දිග වේ අනුක්රමය. සහ .
ආදානය රූප නිරූපණ සමූහයක් වන විට, කණ්ඩායම් ප්රමාණය කොතැනද, නාලිකා ගණන, උස සහ පළල වේ. මෙය බහුලව භාවිතා වන අවස්ථාවක් නොවේ. සහ .
43class LayerNorm(Module):normalized_shape
යනු මූලද්රව්යවල හැඩය (කණ්ඩායම හැර). ආදානය පසුව විය යුතුය eps
සංඛ්යාත්මක ස්ථායිතාව සඳහා භාවිතා වේ elementwise_affine
සාමාන්යකරණය කළ අගය පරිමාණය කර මාරු කළ යුතුද යන්නයිPyTorch LayerNorm
ක්රියාත්මක කිරීම වැනි තර්ක සඳහා එකම නම් භාවිතා කිරීමට අපි උත්සාහ කර ඇත්තෙමු.
72 def __init__(self, normalized_shape: Union[int, List[int], Size], *,
73 eps: float = 1e-5,
74 elementwise_affine: bool = True):84 super().__init__()බවටපරිවර්තනය normalized_shape
කරන්න torch.Size
87 if isinstance(normalized_shape, int):
88 normalized_shape = torch.Size([normalized_shape])
89 elif isinstance(normalized_shape, list):
90 normalized_shape = torch.Size(normalized_shape)
91 assert isinstance(normalized_shape, torch.Size)94 self.normalized_shape = normalized_shape
95 self.eps = eps
96 self.elementwise_affine = elementwise_affineවාසි සහ නැඹුරුව සඳහා සහ පරාමිතීන් සාදන්න
98 if self.elementwise_affine:
99 self.gain = nn.Parameter(torch.ones(normalized_shape))
100 self.bias = nn.Parameter(torch.zeros(normalized_shape)) x
හැඩයේ ආතන්ය [*, S[0], S[1], ..., S[n]]
වේ. *
ඕනෑම මානයන් සංඛ්යාවක් විය හැකිය. උදාහරණයක් ලෙස, එන්එල්පී කාර්යයකදී මෙය වනු ඇත [seq_len, batch_size, features]
102 def forward(self, x: torch.Tensor):හැඩයන්ගැලපෙන බවට වග බලා ගැනීම සඳහා සනීපාරක්ෂාව පරීක්ෂා කරන්න
110 assert self.normalized_shape == x.shape[-len(self.normalized_shape):]මධ්යන්යයහා විචලතාව ගණනය කිරීමේ මානයන්
113 dims = [-(i + 1) for i in range(len(self.normalized_shape))]සියලුමමූලද්රව්යවල මධ්යන්යය ගණනය කරන්න; i.e. එක් එක් මූලද්රව්යය සඳහා මාධ්යයන්
117 mean = x.mean(dim=dims, keepdim=True)සියලුමූලද්රව්යවල චතුරස්රාකාර මධ්යන්යය ගණනය කිරීම; i.e. එක් එක් මූලද්රව්යය සඳහා මාධ්යයන්
120 mean_x2 = (x ** 2).mean(dim=dims, keepdim=True)සියලුමූලද්රව්යයේ විචලනය
122 var = mean_x2 - mean ** 2සාමාන්යකරන්න
125 x_norm = (x - mean) / torch.sqrt(var + self.eps)පරිමාණයසහ මාරුව
127 if self.elementwise_affine:
128 x_norm = self.gain * x_norm + self.bias131 return x_normසරලපරීක්ෂණය
134def _test():138 from labml.logger import inspect
139
140 x = torch.zeros([2, 3, 2, 4])
141 inspect(x.shape)
142 ln = LayerNorm(x.shape[2:])
143
144 x = ln(x)
145 inspect(x.shape)
146 inspect(ln.gain.shape)150if __name__ == '__main__':
151 _test()