docs/si/transformers/models.html
13importmath1415importtorch16importtorch.nnasnn1718fromlabml\_nn.utilsimportclone\_module\_list19from.feed\_forwardimportFeedForward20from.mhaimportMultiHeadAttention21from.positional\_encodingimportget\_positional\_encoding
24classEmbeddingsWithPositionalEncoding(nn.Module):
31def\_\_init\_\_(self,d\_model:int,n\_vocab:int,max\_len:int=5000):32super().\_\_init\_\_()33self.linear=nn.Embedding(n\_vocab,d\_model)34self.d\_model=d\_model35self.register\_buffer('positional\_encodings',get\_positional\_encoding(d\_model,max\_len))
37defforward(self,x:torch.Tensor):38pe=self.positional\_encodings[:x.shape[0]].requires\_grad\_(False)39returnself.linear(x)\*math.sqrt(self.d\_model)+pe
42classEmbeddingsWithLearnedPositionalEncoding(nn.Module):
49def\_\_init\_\_(self,d\_model:int,n\_vocab:int,max\_len:int=5000):50super().\_\_init\_\_()51self.linear=nn.Embedding(n\_vocab,d\_model)52self.d\_model=d\_model53self.positional\_encodings=nn.Parameter(torch.zeros(max\_len,1,d\_model),requires\_grad=True)
55defforward(self,x:torch.Tensor):56pe=self.positional\_encodings[:x.shape[0]]57returnself.linear(x)\*math.sqrt(self.d\_model)+pe
මෙයඑන්කෝඩර් තට්ටුවක් හෝ විකේතක තට්ටුවක් ලෙස ක්රියා කළ හැකිය.
🗒කඩදාසි ඇතුළු සමහර ක්රියාත්මක කිරීම්, ස්ථර-සාමාන්යකරණය සිදු කරන ස්ථානයේ වෙනස්කම් ඇති බව පෙනේ. මෙන්න අපි අවධානය සහ පෝෂක ඉදිරියට ජාල පෙර ස්ථරයක් සාමාන්යකරණය කරන්න, සහ මුල් අවශේෂ දෛශික එකතු කරන්න. විකල්පයක් වන්නේ අපද්රව්ය එකතු කිරීමෙන් පසු ස්ථර සාමාන්යකරණය කිරීමයි. නමුත් පුහුණුවීමේදී මෙය අඩු ස්ථාවර බව අපට පෙනී ගියේය. ට්රාන්ස්ෆෝමර් ගෘහ නිර්මාණ ශිල්පයේ ON Layer සාමාන්යකරණය පිළිබඳපත්රිකාවේ මේ පිළිබඳව සවිස්තරාත්මක සාකච්ඡාවක් අපට හමු විය.
60classTransformerLayer(nn.Module):
d_model ටෝකනය කාවැද්දීමේ ප්රමාණයයිself_attn ස්වයං අවධානය මොඩියුලයsrc_attn යනු ප්රභව අවධානය යොමු කිරීමේ මොඩියුලය (මෙය විකේතකයක් තුළ භාවිතා කරන විට)feed_forward යනු ආහාර ඉදිරි මොඩියුලයයිdropout_prob ස්වයං අවධානයෙන් පසු ඉවත් වීමේ සම්භාවිතාව සහ FFN78def\_\_init\_\_(self,\*,79d\_model:int,80self\_attn:MultiHeadAttention,81src\_attn:MultiHeadAttention=None,82feed\_forward:FeedForward,83dropout\_prob:float):
91super().\_\_init\_\_()92self.size=d\_model93self.self\_attn=self\_attn94self.src\_attn=src\_attn95self.feed\_forward=feed\_forward96self.dropout=nn.Dropout(dropout\_prob)97self.norm\_self\_attn=nn.LayerNorm([d\_model])98ifself.src\_attnisnotNone:99self.norm\_src\_attn=nn.LayerNorm([d\_model])100self.norm\_ff=nn.LayerNorm([d\_model])
ආහාරඉදිරි ස්ථරයට ආදානය ඉතිරි කර ගත යුතුද යන්න
102self.is\_save\_ff\_input=False
104defforward(self,\*,105x:torch.Tensor,106mask:torch.Tensor,107src:torch.Tensor=None,108src\_mask:torch.Tensor=None):
ස්වයංඅවධානය යොමු කිරීමට පෙර දෛශික සාමාන්යකරණය කරන්න
110z=self.norm\_self\_attn(x)
ස්වයංඅවධානය හරහා ධාවනය කරන්න, i.e. යතුරු සහ වටිනාකම් ස්වයං සිට
112self\_attn=self.self\_attn(query=z,key=z,value=z,mask=mask)
ස්වයංඅවධානය ප්රතිඵල එකතු
114x=x+self.dropout(self\_attn)
ප්රභවයක්ලබා දෙන්නේ නම්, ප්රභවයට අවධානය යොමු කිරීමෙන් ප්රති results ල ලබා ගන්න. එන්කෝඩර් ප්රතිදානයන් කෙරෙහි අවධානය යොමු කරන විකේතක තට්ටුවක් ඔබට ඇති විට මෙය
වේ
119ifsrcisnotNone:
දෛශිකසාමාන්යකරණය කරන්න
121z=self.norm\_src\_attn(x)
ප්රභවයටඅවධානය යොමු කරන්න. එනම් යතුරු සහ අගයන් ප්රභවයෙන් වේ
123attn\_src=self.src\_attn(query=z,key=src,value=src,mask=src\_mask)
මූලාශ්රඅවධානය යොමු ප්රතිඵල එක් කරන්න
125x=x+self.dropout(attn\_src)
පෝෂණයසඳහා සාමාන්යකරණය කරන්න
128z=self.norm\_ff(x)
නිශ්චිතවදක්වා ඇත්නම් ආදානය ආහාර ඉදිරි ස්ථරයට සුරකින්න
130ifself.is\_save\_ff\_input:131self.ff\_input=z.clone()
Feed-forwardජාලය හරහා ගමන් කරන්න
133ff=self.feed\_forward(z)
ප්රතිපෝෂණඉදිරි ප්රති results ල නැවත එක් කරන්න
135x=x+self.dropout(ff)136137returnx
140classEncoder(nn.Module):
147def\_\_init\_\_(self,layer:TransformerLayer,n\_layers:int):148super().\_\_init\_\_()
ට්රාන්ස්ෆෝමර්ස්ථරයේ පිටපත් සාදන්න
150self.layers=clone\_module\_list(layer,n\_layers)
අවසානසාමාන්යකරණ ස්තරය
152self.norm=nn.LayerNorm([layer.size])
154defforward(self,x:torch.Tensor,mask:torch.Tensor):
එක්එක් ට්රාන්ස්ෆෝමර් ස්ථරය හරහා ධාවනය කරන්න
156forlayerinself.layers:157x=layer(x=x,mask=mask)
අවසානවශයෙන්, දෛශික සාමාන්යකරණය කරන්න
159returnself.norm(x)
162classDecoder(nn.Module):
169def\_\_init\_\_(self,layer:TransformerLayer,n\_layers:int):170super().\_\_init\_\_()
ට්රාන්ස්ෆෝමර්ස්ථරයේ පිටපත් සාදන්න
172self.layers=clone\_module\_list(layer,n\_layers)
අවසානසාමාන්යකරණ ස්තරය
174self.norm=nn.LayerNorm([layer.size])
176defforward(self,x:torch.Tensor,memory:torch.Tensor,src\_mask:torch.Tensor,tgt\_mask:torch.Tensor):
එක්එක් ට්රාන්ස්ෆෝමර් ස්ථරය හරහා ධාවනය කරන්න
178forlayerinself.layers:179x=layer(x=x,mask=tgt\_mask,src=memory,src\_mask=src\_mask)
අවසානවශයෙන්, දෛශික සාමාන්යකරණය කරන්න
181returnself.norm(x)
මෙයටෝකන පුරෝකථනය කරන අතර එම අයගේ සොෆ්ට්මැක්ස් ලබා දෙයි. ඔබ භාවිතා කරන්නේ නම් ඔබට මෙය අවශ්ය නොවේ nn.CrossEntropyLoss .
184classGenerator(nn.Module):
194def\_\_init\_\_(self,n\_vocab:int,d\_model:int):195super().\_\_init\_\_()196self.projection=nn.Linear(d\_model,n\_vocab)
198defforward(self,x):199returnself.projection(x)
202classEncoderDecoder(nn.Module):
209def\_\_init\_\_(self,encoder:Encoder,decoder:Decoder,src\_embed:nn.Module,tgt\_embed:nn.Module,generator:nn.Module):210super().\_\_init\_\_()211self.encoder=encoder212self.decoder=decoder213self.src\_embed=src\_embed214self.tgt\_embed=tgt\_embed215self.generator=generator
මෙයඔවුන්ගේ කේතයෙන් වැදගත් විය. ග්ලෝරෝට්/fan_avg සමඟ පරාමිතීන් ආරම්භ කරන්න.
219forpinself.parameters():220ifp.dim()\>1:221nn.init.xavier\_uniform\_(p)
223defforward(self,src:torch.Tensor,tgt:torch.Tensor,src\_mask:torch.Tensor,tgt\_mask:torch.Tensor):
එන්කෝඩරයහරහා ප්රභවය ධාවනය කරන්න
225enc=self.encode(src,src\_mask)
විකේතකයහරහා කේතීකරණ සහ ඉලක්ක ධාවනය කරන්න
227returnself.decode(enc,src\_mask,tgt,tgt\_mask)
229defencode(self,src:torch.Tensor,src\_mask:torch.Tensor):230returnself.encoder(self.src\_embed(src),src\_mask)
232defdecode(self,memory:torch.Tensor,src\_mask:torch.Tensor,tgt:torch.Tensor,tgt\_mask:torch.Tensor):233returnself.decoder(self.tgt\_embed(tgt),memory,src\_mask,tgt\_mask)