Back to Annotated Deep Learning Paper Implementations

ට්රාන්ස්ෆෝමර්එක්ස්එල් අත්හදා බැලීම

docs/si/transformers/xl/experiment.html

latest12.8 KB
Original Source

hometransformersxl

View code on Github

#

ට්රාන්ස්ෆෝමර්එක්ස්එල් අත්හදා බැලීම

මෙයට්රාන්ස්ෆෝමර් xl ආකෘතියක් පුහුණු කිරීම සඳහා කරන ලද පයිටෝර්ච් අත්හදා බැලීමකි.

11fromtypingimportList1213importtorch14importtorch.nnasnn15fromlabml.loggerimportText1617fromlabmlimportexperiment,tracker,monit,logger18fromlabml.configsimportoption19fromlabml\_helpers.metrics.simple\_stateimportSimpleStateModule20fromlabml\_helpers.moduleimportModule21fromlabml\_helpers.train\_validimportBatchIndex,hook\_model\_outputs22fromlabml\_nn.experiments.nlp\_autoregressionimportNLPAutoRegressionConfigs23fromlabml\_nn.transformers.xlimportTransformerXL,TransformerXLLayer

#

ස්වයංක්රීයප්රතිගාමී ආකෘතිය

26classAutoregressiveModel(Module):

#

31def\_\_init\_\_(self,n\_vocab:int,d\_model:int,transformer:TransformerXL):32super().\_\_init\_\_()

#

ටෝකන්කාවැද්දීම මොඩියුලය

34self.src\_embed=nn.Embedding(n\_vocab,d\_model)

#

ට්රාන්ස්ෆෝමර්

36self.transformer=transformer

#

අවසන්ස්ථරය

38self.generator=nn.Linear(d\_model,n\_vocab)

#

වෙස්මුහුණු

40self.mask\_x=None41self.mask\_mem=None

#

43defforward(self,x:torch.Tensor,mem:List[torch.Tensor]):

#

මතකයේදිග

45m\_len=len(mem[0])ifmemelse0

#

ටෝකනසඳහා පසුකාලීන වෙස් මුහුණක් සාදන්න

47ifself.mask\_xisNoneorself.mask\_x.shape[0]\<len(x):48fromlabml\_nn.transformers.utilsimportsubsequent\_mask49self.mask\_x=subsequent\_mask(len(x)).to(x.device)

#

මතකයසඳහා සියලු (සම්පූර්ණ දෘශ්යතාව) වෙස්මුහුණක් සාදන්න

51ifself.mask\_memisNoneorself.mask\_mem.shape[1]\<m\_lenorself.mask\_mem.shape[0]\<len(x):52self.mask\_mem=self.mask\_x.new\_ones(len(x),m\_len,1)

#

මතකයක්තිබේ නම් වෙස් මුහුණු සංයුක්ත කරන්න

55ifm\_len:56mask=torch.cat((self.mask\_mem[:len(x),:m\_len],self.mask\_x[:len(x),:len(x)]),dim=1)

#

පසුකාලීනආවරණ වෙනත් ආකාරයකින් භාවිතා කරන්න

58else:59mask=self.mask\_x[:len(x),:len(x)]

#

ටෝකන්කාවැද්දීම්

62x=self.src\_embed(x)

#

ට්රාන්ස්ෆෝමරයහරහා එය ධාවනය කරන්න

64res,mem=self.transformer(x,mem,mask)

#

ඊළඟටෝකනයේ පිවිසුම් ජනනය කරන්න

66res=self.generator(res)

#

68returnres,mem

#

වින්යාසකිරීම්

අපිඅත්හදා බැලීම ආරම්භ කරන විට පෙරනිමි වින්යාස කළ හැකි අතර එය අධික ලෙස ධාවනය වනු ඇත

71classConfigs(NLPAutoRegressionConfigs):

#

78model:AutoregressiveModel

#

ටෝකන්කාවැද්දීමේ ප්රමාණය

81d\_model:int=128

#

අවධානයයොමු ප්රධානීන් ගණන

83heads:int=4

#

අතහැරදැමීමේ සම්භාවිතාව

85dropout:float=0.0

#

FFNසැඟවුණු ස්ථරයේ විශේෂාංග ගණන

87d\_ff:int=256

#

ට්රාන්ස්ෆෝමර්ස්ථර ගණන

89n\_layers:int=6

#

තබාගත යුතු මතකයන් ගණන

91mem\_len:int=128

#

පුහුණුවසහ වලංගු කිරීම අතර මාරුවීමේදී මතකයන් පවත්වා ගැනීම සඳහා රාජ්ය මොඩියුලය

93memory=SimpleStateModule()

#

95definit(self):

#

ට්රැකර්වින්යාසයන් සකසන්න

97tracker.set\_scalar("accuracy.\*",True)98tracker.set\_scalar("loss.\*",True)

#

මොඩියුලප්රතිදානයන් ලොග් කිරීමට කොක්කක් එක් කරන්න

100hook\_model\_outputs(self.mode,self.model,'model')

#

මෙයපුහුණුව සහ වලංගු කිරීම සඳහා නිරවද්යතා මෙට්රික් සංඛ්යාන සහ මතකයන් වෙනම තබා ගනී.

102self.state\_modules=[self.accuracy,self.memory]

#

මතකයන්සංකෝචනය කර උපරිම මතකයන් තබා ගැනීම සඳහා පැරණි mem_len මතකයන් ඉවත් කරන්න.

104defmerge\_memory(self,old\_mem,new\_mem):

#

එයවින්යාස කර ඇත්නම් මතකය භාවිතා නොකිරීමට

111ifself.mem\_len==0:112return[]

#

පැරණිමතකය සමඟ සංයුක්ත වන්න

115ifold\_mem:116mem=[torch.cat((m,x),dim=0)form,xinzip(old\_mem,new\_mem)]117else:118mem=new\_mem

#

පැරණිමතකයන් ඉවත් කරන්න

121iflen(mem[0])\>self.mem\_len:122mem=[m[-self.mem\_len:]forminmem]

#

125returnmem

#

පුහුණුව/වලංගුකිරීමේ පියවර

127defstep(self,batch:any,batch\_idx:BatchIndex):

#

උපාංගයවෙත දත්ත ගෙනයන්න

133data,target=batch[0].to(self.device),batch[1].to(self.device)

#

පුහුණුප්රකාරයේදී ගෝලීය පියවර යාවත්කාලීන කරන්න (සැකසූ ටෝකන ගණන)

136ifself.mode.is\_train:137tracker.add\_global\_step(data.shape[0]\*data.shape[1])

#

ආකෘතිප්රතිදානයන් ග්රහණය කර ගත යුතුද යන්න

140withself.mode.update(is\_log\_activations=batch\_idx.is\_last):

#

මතකයන්ලබා ගන්න

142mem=self.memory.get()

#

ආකෘතියධාවනය කරන්න

144output,new\_mem=self.model(data,mem)

#

මතකයඒකාබද්ධ කරන්න

146mem=self.merge\_memory(mem,new\_mem)

#

මතකයන්යාවත්කාලීන කරන්න

148self.memory.set(mem)

#

හරස්එන්ට්රොපි අලාභය ගණනය කර ලොග් කරන්න

151loss=self.loss\_func(output,target)152tracker.add("loss.",loss)

#

ගණනයකිරීම සහ ලොග් කිරීමේ නිරවද්යතාවය

155self.accuracy(output,target)156self.accuracy.track()

#

ආකෘතියපුහුණු කරන්න

159ifself.mode.is\_train:

#

අනුක්රමිකගණනය කරන්න

161loss.backward()

#

ක්ලිප්අනුක්රමික

163torch.nn.utils.clip\_grad\_norm\_(self.model.parameters(),max\_norm=self.grad\_norm\_clip)

#

ප්රශස්තිකරණපියවර ගන්න

165self.optimizer.step()

#

සෑමයුගලයකම අවසාන කණ්ඩායමේ ආදර්ශ පරාමිතීන් සහ අනුක්රමික ලොග් කරන්න

167ifbatch\_idx.is\_last:168tracker.add('model',self.model)

#

අනුක්රමිකඉවත්

170self.optimizer.zero\_grad()

#

ලුහුබැඳඇති ප්රමිතික සුරකින්න

173tracker.save()

#

පුහුණුවඅතරතුර වරින් වර සාම්පල ජනනය කිරීම සඳහා නියැදි කිරීමේ කාර්යය

175defsample(self):

#

විමසුමක්ආරම්භ කිරීම

181prompt=self.prompt

#

මුද්රණයසඳහා ප්රතිදානය එකතු කරන්න

183log=[(prompt,Text.subtle)]

#

මතකය

185mem=[]

#

සාම්පල25 ටෝකන

187foriinmonit.iterate('Sample',25):

#

විමසුමටෝකෙන්කරන්න

189data=self.text.text\_to\_i(prompt).unsqueeze(-1)

#

උපාංගයවෙත ගෙන යන්න

191data=data.to(self.device)

#

ආදර්ශප්රතිදානය ලබා ගන්න

193output,new\_mem=self.model(data,mem)

#

ආදර්ශඅනාවැකිය ලබා ගන්න (කෑදර)

195output=output.argmax(dim=-1).squeeze(1)

#

විමසුමටඅනාවැකිය එක් කරන්න

197prompt+=self.prompt\_separator+self.text.itos[output[-1]]

#

ඊළඟපුනරාවර්තනයේදී අවසාන චරිතය ආකෘතියට පමණක් පෝෂණය කරන්න, විවේකය මතකයන් ලෙස ඉදිරියට යනු ඇත

199prompt=prompt[-1:]

#

ලොග්වීම සඳහා අනාවැකිය එක් කරන්න

201log+=[(self.prompt\_separator+self.text.itos[output[-1]],Text.value)]

#

මතකයයාවත්කාලීන කරන්න

203mem=self.merge\_memory(mem,new\_mem)

#

නියැදිප්රතිදානය මුද්රණය කරන්න

206logger.log(log)

#

ස්වයංක්රීයප්රතිගාමී ආකෘතිය ආරම්භ කරන්න

209@option(Configs.model)210defautoregressive\_model(c:Configs):

#

214fromlabml\_nn.transformers.xlimportRelativeMultiHeadAttention215fromlabml\_nn.transformers.feed\_forwardimportFeedForward216m=AutoregressiveModel(c.n\_tokens,c.d\_model,TransformerXL(217TransformerXLLayer(d\_model=c.d\_model,218self\_attn=RelativeMultiHeadAttention(c.heads,c.d\_model,c.dropout),219feed\_forward=FeedForward(c.d\_model,c.d\_ff,c.dropout),220dropout\_prob=c.dropout),c.n\_layers))221returnm.to(c.device)

#

අත්හදාබැලීම ක්රියාත්මක කරන්න

224defmain():

#

අත්හදාබැලීම සාදන්න

229experiment.create(name="transformer\_xl",comment='')

#

වින්යාසසාදන්න

231conf=Configs()

#

වින්යාසයන්පූරණය කරන්න

233experiment.configs(conf,

#

අභිබවායාම සඳහා වින්යාසයන් පිළිබඳ ශබ්දකෝෂයක්

235{'tokenizer':'character',236'text':'tiny\_shakespeare',237'optimizer.learning\_rate':1.,238'optimizer.optimizer':'Noam',239'prompt':'It is',240'prompt\_separator':'',241242'train\_loader':'sequential\_train\_loader',243'valid\_loader':'sequential\_valid\_loader',244245'seq\_len':2,246'mem\_len':32,247'epochs':128,248'batch\_size':32,249'inner\_iterations':25,250})

#

ඉතිරිකිරීම සහ පැටවීම සඳහා ආකෘති සකසන්න

253experiment.add\_pytorch\_models({'model':conf.model})

#

අත්හදාබැලීම ආරම්භ කරන්න

256withexperiment.start():

#

TrainValidConfigs.run

258conf.run()

#

262if\_\_name\_\_=='\_\_main\_\_':263main()

Trending Research Paperslabml.ai