Back to Annotated Deep Learning Paper Implementations

ධූරාවලිට්රාන්ස්ෆෝමර් වඩාත් කාර්යක්ෂම භාෂා ආකෘති වේ

docs/si/transformers/hour_glass/index.html

latest15.0 KB
Original Source

hometransformershour_glass

[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

#

Hourglassආකෘතිය

මෙමආකෘතිය නැවත නැවතත් ස්ථර මැදට එකතු කරන අතර පහළට නියැදීමෙන් අනුක්රමය කෙටි කරයි. තවත් පැයක ආකෘතියකින් සැකසූ කෙටි අනුක්රමය සාමාන්ය ට්රාන්ස්ෆෝමර් ස්ථර දෙකක් අතර සැන්ඩ්විච් කර ඇත. (ට්රාන්ස්ෆෝමර් ස්තරය ස්වයං අවධානය යොමු කරන තට්ටුවක් සහ ස්ථාන-නැණවත් පෝෂක-ඉදිරි ස්ථරයක් ඇත).

41classHourGlass(Module):

#

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

#

🚧දක්වා-නියැදීම් සඳහා රේඛීය ප්රක්ෂේපනය

කප්රමාණයකට ඝන ටෝකන් කාවැද්දීම් රේඛීය ප්රක්ෂේපණය කරන්න dmodel​k.

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

Trending Research Paperslabml.ai