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

මෙය ස්ථර සාමාන්යකරණය කිරීමේ PyTorch ක්රියාත්මක කිරීමයි.

කණ්ඩායම් සාමාන්යකරණයකිරීමේ සීමාවන්

  • ඔබධාවන මාර්ග පවත්වා ගත යුතුය.
  • RNsසඳහා උපක්රමශීලී. එක් එක් පියවර සඳහා ඔබට විවිධ සාමාන්යකරණයන් අවශ්යද?
  • කුඩාකණ්ඩායම් ප්රමාණ සමඟ ක්රියා නොකරයි; විශාල එන්එල්පී ආකෘති සාමාන්යයෙන් කුඩා කණ්ඩායම් ප්රමාණවලින් පුහුණු කරනු ලැබේ.
  • බෙදාහරින ලද පුහුණුවේදී උපාංග හරහා මාධ්යයන් සහ වෙනස්කම් ගණනය කිරීම අවශ්ය වේ.

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

ස්ථරසාමාන්යකරණය යනු පුළුල් පරාසයක සැකසුම් මත ක්රියා කරන සරල සාමාන්යකරණ ක්රමයකි. ස්ථර සාමාන්යකරණය මඟින් යෙදවුම් අංග හරහා ශුන්ය මධ්යන්යය සහ ඒකක විචලතාව ඇති බවට පරිවර්තනය කරයි. කණ්ඩායම්සාමාන්යකරණය එක් එක් මූලද්රව්යය සඳහා ශුන්ය මධ්යන්යය සහ ඒකක විචලතාව නිවැරදි කරන බව සලකන්න. ස්ථරයසාමාන්යකරණය සියලු අංග හරහා එක් එක් කණ්ඩායම සඳහා එය කරන්නේ.

ස්ථරසාමාන්යකරණය සාමාන්යයෙන් එන්එල්පී කාර්යයන් සඳහා භාවිතා වේ.

ට්රාන්ස්ෆෝමර් ක්රියාත්මක කිරීම්බොහොමයක ස්ථර සාමාන්යකරණය අපි භාවිතා කර ඇත්තෙමු.

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.bias

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