docs/si/transformers/gmlp/index.html
[View code on Github](https://github.com/labmlai/annotated_deep_learning_paper_implementations/tree/master/labml_nn/transformers/gmlp/ init.py)
මෙය PyTorch කඩදාසි ක්රියාත්මක කිරීම MLPs වෙත අවධානය යොමු කරන්න .
මෙමලිපිය බහු ස්ථර පර්සෙප්ට්රෝන් (එම්එල්පී) පදනම් කරගත් ගෘහ නිර්මාණ ශිල්පයක් ගේටින් සමඟ හඳුන්වා දෙන අතර ඒවා ජීඑම්එල්පී ලෙස නම් කරයි. එය L GMLP කුට්ටි තොගයකින් සමන්විත වේ.
GMLPආකෘතිය මත පදනම් වූ ස්වයංක්රීය ප්රතිගාමී ආකෘතියක් සඳහා පුහුණු කේතය මෙන්න.
21fromtypingimportOptional2223importtorch24fromtorchimportnn
සෑමබ්ලොක් එකක්ම ආදාන X∈Rn×d කාවැද්දීම් සඳහා පහත දැක්වෙන පරිවර්තනයන් සිදු කරයි අනුක්රමික දිග සහ කාවැද්දීම් වල මානයන් d වේ: n
ZZY=σ(XU)=s(Z)=ZV
ඉගෙන U ගත හැකි ප්රක්ෂේපණ බර කොහේද V සහ ඇත. s(⋅) පහත අර්ථ දක්වා ඇති අභ්යවකාශ ගේටින් ඒකකය වේ. නිමැවුම් මානයන් අඩක් s(⋅) වනු ඇත Z. σ GeLuවැනි සක්රිය කිරීමේ කාර්යයකි.
27classGMLPBlock(nn.Module):
d_model යනු මානයන් (d) Xd_ffn හි මානයන් වේ Zseq_len ටෝකන් අනුක්රමයේ දිග (n)48def\_\_init\_\_(self,d\_model:int,d\_ffn:int,seq\_len:int):
54super().\_\_init\_\_()
පෙර-වැඩෙන්නේසිට සාමාන්යකරණය ස්ථරය
56self.norm=nn.LayerNorm([d\_model])
සක්රියකිරීමේ කාර්යය σ
58self.activation=nn.GELU()
සඳහාප්රක්ෂේපනය ස්ථරය Z=σ(XU)
60self.proj1=nn.Linear(d\_model,d\_ffn)
අභ්යවකාශගේටින් ඒකකය s(⋅)
62self.sgu=SpacialGatingUnit(d\_ffn,seq\_len)
සඳහාප්රක්ෂේපනය ස්ථරය Y=Z~V
64self.proj2=nn.Linear(d\_ffn//2,d\_model)
කාවැද්දීමේප්රමාණය ( එන්කෝඩරයඅවශ්ය වේ. අපි ට්රාන්ස්ෆෝමර් ගෘහ නිර්මාණ ශිල්පයෙන් එන්කෝඩර් මොඩියුලය භාවිතා කරන අතර ට්රාන්ස්ෆෝමර් ස්ථරයවෙනුවට ආදේශකයක් ලෙස ජීඑම්එල්පී බ්ලොක් ප්ලග් කරමු.
68self.size=d\_model
x හැඩයේ ආදාන කාවැද්දීම X වේ [seq_len, batch_size, d_model]mask යනු එකිනෙකා අතර ටෝකන වල දෘශ්යතාව පාලනය [seq_len, seq_len, 1] කරන හැඩයේ බූලියන් වෙස් මුහුණකි.70defforward(self,\*,x:torch.Tensor,mask:Optional[torch.Tensor]=None):
කෙටිමංසම්බන්ධතාවය සඳහා පිටපතක් තබා ගන්න
77shortcut=x
සාමාන්යකරන්න X
79x=self.norm(x)
ප්රක්ෂේපණයසහ සක්රිය කිරීම Z=σ(XU)
81z=self.activation(self.proj1(x))
අභ්යවකාශගේටින් ඒකකය Z~=s(Z)
83z=self.sgu(z,mask)
අවසානප්රක්ෂේපණය Y=Z~V
85z=self.proj2(z)
කෙටිමංසම්බන්ධතාවය එක් කරන්න
88returnz+shortcut
s(Z)=Z1⊙fW,b(Z2)
අනුක්රමිකමානය ඔස්සේ රේඛීය පරිවර්තනයක් වන අතර ⊙ එය මූලද්රව්ය අනුව ගුණ කිරීමකි. fW,b(Z)=WZ+b Z සමාන ප්රමාණයේ කොටස් වලට Z1 සහ නාලිකා මානය Z2 ඔස්සේ (කාවැද්දීමේ මානය) බෙදා ඇත.
91classSpacialGatingUnit(nn.Module):
d_z හි මානයන් වේ Zseq_len අනුක්රමය දිග වේ101def\_\_init\_\_(self,d\_z:int,seq\_len:int):
106super().\_\_init\_\_()
අයදුම්කිරීමට පෙර සාමාන්යකරණය ස්ථරය fW,b(⋅)
108self.norm=nn.LayerNorm([d\_z//2])
W සිරුරේ බර fW,b(⋅).
කුඩාඅගයන් හා නැඹුරුව සඳහා බර ආරම්භ කිරීම වැදගත් බව කඩදාසි සටහන් කරයි 1, එවිට මූලික පුහුණුව තුළ අනන්යතාවයට සමීප s(⋅) වේ (භේදය හැරුණු විට).
113self.weight=nn.Parameter(torch.zeros(seq\_len,seq\_len).uniform\_(-0.01,0.01),requires\_grad=True)
සිරුරේබර b fW,b(⋅)
පක්ෂග්රාහීවආරම්භ කිරීම වැදගත් බව කඩදාසි සටහන් 1කරයි.
117self.bias=nn.Parameter(torch.ones(seq\_len),requires\_grad=True)
z හැඩයේ Z ආදානය වේ [seq_len, batch_size, d_z]mask යනු එකිනෙකා අතර ටෝකන වල දෘශ්යතාව පාලනය [seq_len, seq_len, 1] කරන හැඩයේ බූලියන් වෙස් මුහුණකි. ප්රමාණයේ අවසාන මානය 1 වන්නේ වෙනත් ට්රාන්ස්ෆෝමර් ක්රියාත්මක කිරීම් වලදී අප සතුව ඇති අතර අනුකූලතාව සඳහා ඉතිරිව ඇති කණ්ඩායමයි.119defforward(self,z:torch.Tensor,mask:Optional[torch.Tensor]=None):
අනුක්රමිකදිග ලබා ගන්න
128seq\_len=z.shape[0]
Z බෙදන්න Z1 සහ Z2
130z1,z2=torch.chunk(z,2,dim=-1)
ආවරණපරීක්ෂා කරන්න
133ifmaskisnotNone:
mask හැඩය ඇත [seq_len_q, seq_len_k, batch_size] . මෙම ක්රියාත්මක කිරීම කණ්ඩායමේ සියලුම සාම්පල සඳහා එකම වෙස් මුහුණක් පමණක් සහාය වන 1 බැවින් කණ්ඩායම් මානය ප්රමාණයෙන් යුක්ත විය යුතුය.
137assertmask.shape[0]==1ormask.shape[0]==seq\_len138assertmask.shape[1]==seq\_len
මෙන්නඅපි සහාය දෙන්නේ සියලුම සාම්පල සඳහා එකම වෙස් මුහුණක් පමණි
140assertmask.shape[2]==1
කණ්ඩායම්මානය ඉවත් කරන්න
142mask=mask[:,:,0]
Z2 පෙර සාමාන්යකරණය fW,b(⋅)
145z2=self.norm(z2)
බරඅනුකෘතිය ලබා ගන්න; වඩා විශාල නම් ට්රන්කේට් කරන්න seq_len
147weight=self.weight[:seq\_len,:seq\_len]
පඩිසඳහා ආවරණ යොදන්න.
එසේ Wi,j 0 නම් fW,b(Z2)i ටෝකනයෙන් කිසිදු තොරතුරක් ලබා jනොගනී.
152ifmaskisnotNone:153weight=weight\*mask
fW,b(Z2)=WZ2+b
156z2=torch.einsum('ij,jbd-\>ibd',weight,z2)+self.bias[:seq\_len,None,None]
Z1⊙fW,b(Z2)
159returnz1\*z2