docs/si/transformers/hour_glass/index.html
[View code on Github](https://github.com/labmlai/annotated_deep_learning_paper_implementations/tree/master/labml_nn/transformers/hour_glass/ init.py)
මෙය PyTorch ක්රියාත්මක කිරීම කඩදාසි ධූරාවලි ට්රාන්ස්ෆෝමර් වඩාත් කාර්යක්ෂම භාෂා ආකෘති වේ.
දිගුඅනුපිළිවෙලවල් කාර්යක්ෂමව හැසිරවීමට මෙම ලිපිය ධූරාවලි ට්රාන්ස්ෆෝමර් ගෘහ නිර්මාණ ශිල්පයක් හඳුන්වා දෙයි. ට්රාන්ස්ෆෝමර් ස්ථර වල පළමු භාගය පහළට නියැදි ටෝකන සහ දෙවන භාගය එකම විභේදනයේ ස්ථර අතර සෘජු මඟ හැරීමේ සම්බන්ධතා සහිත සාම්පල. දර්ශන කාර්යයන් සඳහා මෙය යූ-නෙට් වලට ටිකක් සමාන ය.
ඔවුන්විවිධ ඉහළ නියැදීම් සහ පහළ-නියැදි ශිල්පීය ක්රම උත්සාහ කරන අතර ඔවුන් පැය වීදුරු ආකෘතිය ලෙස හඳුන්වන හොඳම ක්රියාකාරී සහ පහළ නියැදි ශිල්පීය ක්රම සහිත ආකෘතියක් ගොඩනඟයි.
මෙන්නඅපි සරල බව සඳහා සරලම ඉහළ නියැදීම් සහ පහළ නියැදි ක්රම ක්රියාත්මක කර ඇත. පසුව වඩාත් සංකීර්ණ (හා වඩා හොඳ ක්රියාකාරී) ක්රියාත්මක කිරීම් එකතු කිරීම අපි සලකා බලමු.
පැයවීදුරු ආකෘතිය සඳහා පුහුණු කේතය මෙන්න.
30fromtypingimportList3132importtorch33fromtorchimportnn3435fromlabml\_helpers.moduleimportModule36fromlabml\_nn.transformersimportMultiHeadAttention,TransformerLayer37fromlabml\_nn.transformers.feed\_forwardimportFeedForward38fromlabml\_nn.transformers.utilsimportsubsequent\_mask
මෙමආකෘතිය නැවත නැවතත් ස්ථර මැදට එකතු කරන අතර පහළට නියැදීමෙන් අනුක්රමය කෙටි කරයි. තවත් පැයක ආකෘතියකින් සැකසූ කෙටි අනුක්රමය සාමාන්ය ට්රාන්ස්ෆෝමර් ස්ථර දෙකක් අතර සැන්ඩ්විච් කර ඇත. (ට්රාන්ස්ෆෝමර් ස්තරය ස්වයං අවධානය යොමු කරන තට්ටුවක් සහ ස්ථාන-නැණවත් පෝෂක-ඉදිරි ස්ථරයක් ඇත).
41classHourGlass(Module):
n_heads යනු බහු-හිස අවධානය යොමු කරන ස්ථරවල හිස් ගණනd_model ටෝකන් කාවැද්දීම් වල ප්රමාණයයිdropout අතහැර දැමීමේ සම්භාවිතාවd_ffස්ථාන-නැණවත් පෝෂක-ඉදිරි ස්ථර වල සැඟවුණු ස්ථරයේ මානයන් වේshortening_factors කෙටි කිරීමේ සාධක ලැයිස්තුවයි51def\_\_init\_\_(self,n\_heads:int,d\_model:int,dropout:float,d\_ff:int,shortening\_factors:List[int]):
59super().\_\_init\_\_()
පහළ-නියැදීම්පෙර ට්රාන්ස්ෆෝමර් ස්ථරය
62self.pre=TransformerLayer(d\_model=d\_model,
64self\_attn=MultiHeadAttention(n\_heads,d\_model,dropout),
නැණවත් පෝෂක ඉදිරි ස්ථර ස්ථානගත කරන්න
66feed\_forward=FeedForward(d\_model,d\_ff,dropout),
68dropout\_prob=dropout)
ස්වයංක්රීය-ප්රතිගාමීවෙස්
70self.mask=AutoregressiveMask()
කෙටිකිරීමේ සාධකය k (හෝ පහළ-නියැදි අනුපාතය)
73k=shortening\_factors[0]
අනාගතටෝකනවල සිට අතීත ටෝකන වෙත තොරතුරු කාන්දු නොවන බවට වග බලා ගැනීම සඳහා අපි ටෝකන දකුණට මාරු කරමු. k−1
78self.shift\_right=ShiftRight(k-1)
කෙටිකිරීම හෝ පහළ-නියැදි ස්තරය. අපි සරලම ආකෘතිය භාවිතා කරමු - සාමාන්ය තටාක. කඩදාසි පෙන්නුම් කරන්නේ අවධානය පදනම් කරගත් නියැදීම් අප තවමත් ක්රියාත්මක කර නොමැති හොඳම ක්රියා කරන බවයි.
81self.shortening=AvgPoolShortening(k)
තවත්කෙටි කිරීමක් නොමැති නම් (පැය වීදුරුව මැද)
84iflen(shortening\_factors)==1:
මැදස්ථරය තවත් ට්රාන්ස්ෆෝමර් ස්ථරයකි
86self.shortened=TransformerLayer(d\_model=d\_model,87self\_attn=MultiHeadAttention(n\_heads,d\_model,dropout),88feed\_forward=FeedForward(d\_model,d\_ff,dropout),89dropout\_prob=dropout)
ස්වයංක්රීයආවරණ
91self.mask\_short=AutoregressiveMask()92self.hour\_glass=None93else:
තවත්පැය වීදුරු ආකෘතියක් නැවත නැවත ඇතුල් කරන්න
95self.hour\_glass=HourGlass(n\_heads,d\_model,dropout,d\_ff,shortening\_factors[1:])
Up-නියැදිස්ථරය. අපි සරල බව සඳහා බොළඳ ඉහළ නියැදීම් භාවිතා කරන අතර කඩදාසි පෙන්නුම් කරන්නේ නියැදීම් පදනම් කරගත් අවධානය වඩා හොඳින් ක්රියාත්මක වන බවයි.
99self.up\_sampling=NaiveUpSampling(k)
ඉහළ-නියැදීම්පසු අවසන් ට්රාන්ස්ෆෝමර් ස්ථරය
102self.post=TransformerLayer(d\_model=d\_model,103self\_attn=MultiHeadAttention(n\_heads,d\_model,dropout),104feed\_forward=FeedForward(d\_model,d\_ff,dropout),105dropout\_prob=dropout)
107defforward(self,x:torch.Tensor):
ආරම්භකට්රාන්ස්ෆෝමර් ස්ථරය x←PreVanillaLayers(x)
110x=self.pre(x=x,mask=self.mask(x))
මාරුකිරීම සහ කෙටි කිරීම x′←Shortening(ShiftRight(x,k−1),k)
113x\_short=self.shortening(self.shift\_right(x))
අපිපැය වීදුරුවේ කේන්ද්රයේ සිටින්නේ නම්, if EMPTY(shorten_factors)then
117ifself.hour\_glassisNone:
මධ්යස්ථානයස්ථරය ට්රාන්ස්ෆෝමර් x′←ShortenedLayers(x′)
120x\_short=self.shortened(x=x\_short,mask=self.mask\_short(x\_short))
else
122else:
x′←HOURGLASS(x,shorten_factors)
124x\_short=self.hour\_glass(x\_short)
කෙටිකළ අනුපිළිවෙල ඉහළට සාම්පල කර මඟ හැරීමේ සම්බන්ධතාවයක් එක් කරන්න x←x+Upsampling(x,x′,k)
128x=x+self.up\_sampling(x,x\_short)
අවසන්ට්රාන්ස්ෆෝමර් ස්ථරය x←PostVanillaLayers(x)
131x=self.post(x=x,mask=self.mask(x))
134returnx
මෙයලබා දී ඇති පියවර ගණන අනුව අනුක්රමය දකුණට මාරු කරයි
137classShiftRight(Module):
shift විසින් මාරු කිරීමට පියවර ගණන වේ144def\_\_init\_\_(self,shift:int):
148super().\_\_init\_\_()
ඍණාත්මකවිය නොහැක
150assertshift\>=0
152self.shift=shift
x හැඩයේ ආතතිකාරයකි [seq_len, ...]154defforward(self,x:torch.Tensor):
මාරුවමුල් පිටපත 0 ආපසු ලබා දෙන්නේ නම්
159ifself.shift==0:160returnx
Zerosවමට ඇප්පෙන්ඩ් කළ යුතුය
162prefix=x.new\_zeros([self.shift,\*x.shape[1:]])
ශුන්යයසංයුක්ත කර අයිතිය ටන්ක කරන්න
164returntorch.cat([prefix,x[:-self.shift]])
සාමාන්යතටාක සහිත දී ඇති සාධකයක් මගින් මෙම පහළ-සාම්පල
167classAvgPoolShortening(Module):
k කෙටි කිරීමේ සාධකයයි174def\_\_init\_\_(self,k:int):
178super().\_\_init\_\_()
සාමාන්යතටාක ස්ථරය
180self.pool=nn.AvgPool1d(k,ceil\_mode=True)
x හැඩයෙන් යුක්ත වේ [seq_len, batch_size, d_model]182defforward(self,x:torch.Tensor):
තටාකස්ථරය හැඩය පිළිගන්නා [batch_size, d_model, seq_len] බැවින් අපි අක්ෂ permute.
188returnself.pool(x.permute(1,2,0)).permute(2,0,1)
පුනරාවර්තනයකිරීමෙන් මෙම ඉහළ සාම්පල
191classNaiveUpSampling(Module):
k කෙටි කිරීමේ සාධකයයි198def\_\_init\_\_(self,k:int):
202super().\_\_init\_\_()203self.k=k
x පහළ-නියැදීම් පෙර කාවැද්දීම් සමග tensor වේx_short යනු ඉහළ dens නත්වයේ ආතතියයි (ඉහළට සාම්පල කළ යුතු) නිරූපණයකි205defforward(self,x:torch.Tensor,x\_short:torch.Tensor):
අනුක්රමිකමානය හරහා නැවත කරන්න
211expanded=torch.repeat\_interleave(x\_short,self.k,dim=0)
අවසානයේඅමතර කාවැද්දීම් ඉවත් කරන්න
213expanded=expanded[:x.shape[0]]
216returnexpanded
219classAutoregressiveMask(Module):
224def\_\_init\_\_(self):225super().\_\_init\_\_()226self.mask=None
228defforward(self,x:torch.Tensor):
අපවිසින් නිර්මාණය කර නොමැති නම් හෝ ප්රමාණ වෙනස් වී ඇත්නම් වෙස්මුහුණක් සාදන්න
230ifself.maskisNoneorself.mask.size(0)!=len(x):
පසුකාලීන වෙස්මුහුණ, අනාගත ටෝකන දැකීමෙන් ටෝකන වසං කරනු ඇත
232self.mask=subsequent\_mask(len(x)).to(x.device)
235returnself.mask
මෙයඒකාබද්ධ කළ යුතු අනුයාත ටෝකන කාවැද්දීම් වලට අනුකූල වන අතර එය තනි ටෝකන කාවැද්දීමේ ප්රමාණයට සිතියම් ගත කිරීම සඳහා රේඛීය පරිවර්තනයක් සිදු කරයි.
238classLinearPoolingShortening(Module):
246def\_\_init\_\_(self):247super().\_\_init\_\_()248raiseNotImplementedError
x′x′=S(x)+Attention(Q=S(x),K=x,V=x)=x′+FFN(x′)
S(x) සාමාන්ය තටාක හෝ රේඛීය තටාක කොහේද?
251classAttentionBasedShortening(Module):
263def\_\_init\_\_(self):264super().\_\_init\_\_()265raiseNotImplementedError
කප්රමාණයකට ඝන ටෝකන් කාවැද්දීම් රේඛීය ප්රක්ෂේපණය කරන්න dmodelk.
268classLinearUpSampling(Module):
275def\_\_init\_\_(self):276super().\_\_init\_\_()277raiseNotImplementedError
xx=U(x,x′)+Attention(Q=U(x,x′),K=x′,V=x′)=x+FFN(x)
කොහේද U(x,x′)=x+LinearUpsampling(x′)
280classAttentionBasedUpSampling(Module):
292def\_\_init\_\_(self):293super().\_\_init\_\_()294raiseNotImplementedError