Back to Annotated Deep Learning Paper Implementations

ගේට්ටුරේඛීය ඒකක සහ ප්රභේද

docs/si/transformers/glu_variants/simple.html

latest15.5 KB
Original Source

hometransformersglu_variants

View code on Github

#

ගේට්ටුරේඛීය ඒකක සහ ප්රභේද

මෙයස්වයංක්රීය ප්රතිගාමී සඳහා සරල ට්රාන්ස්ෆෝමර් ආකෘතියක් පුහුණු කරයි.ස්ථාන-නැණවත් පෝෂක ජාලයසඳහා අපි විවිධ ප්රභේද උත්සාහ කරමු.

මෙය labml.configs මොඩියුලය භාවිතා නොකරන සරල ක්රියාත්මක කිරීමකි. හුරුපුරුදු නොවන පාඨකයන්ට පහසු කිරීම සඳහා සරල ක්රියාත්මක කිරීමක් ලිවීමට අපි තීරණය කළා.

20importdataclasses2122importtorch23fromlabml\_helpers.moduleimportModule24fromtorchimportnn25fromtorch.utils.dataimportDataset,DataLoader2627fromlabmlimportexperiment,lab,tracker,monit,logger28fromlabml.loggerimportText29fromlabml.utils.downloadimportdownload\_file30fromlabml\_nn.experiments.nlp\_autoregressionimporttranspose\_batch31fromlabml\_nn.optimizers.noamimportNoam32fromlabml\_nn.transformersimportEncoder,MultiHeadAttention33fromlabml\_nn.transformers.feed\_forwardimportFeedForward34fromlabml\_nn.transformers.modelsimportEmbeddingsWithPositionalEncoding,TransformerLayer35fromlabml\_nn.transformers.utilsimportsubsequent\_mask

#

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

38classAutoregressiveModel(Module):

#

43def\_\_init\_\_(self,src\_embed:Module,encoder:Encoder,generator:Module):44super().\_\_init\_\_()

#

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

46self.src\_embed=src\_embed

#

ට්රාන්ස්ෆෝමර්පදනම් කරගත් එන්කෝඩරය

48self.encoder=encoder

#

ඊළඟටෝකන් උත්පාදන ස්තරය; මෙය ඊළඟ ටෝකනයේ පිවිසුම් ලබා දෙයි

51self.generator=generator

#

මෙයපළමු ඇමතුමෙන් ආරම්භ කෙරේ

53self.src\_mask=None

#

55defforward(self,src:torch.Tensor):

#

ට්රාන්ස්ෆෝමරයඅතීත ටෝකන කෙරෙහි පමණක් අවධානය යොමු කළ හැකි වන පරිදි පසුකාලීන වෙස්මුහුණක් සාදන්න.

57ifself.src\_maskisNoneorself.src\_mask.size(0)!=len(src):58self.src\_mask=subsequent\_mask(len(src)).to(src.device)

#

ටෝකනකාවැද්දීම (src ) සහ ට්රාන්ස්ෆෝමරය හරහා එය ක්රියාත්මක කරන්න

60res=self.encoder(self.src\_embed(src),self.src\_mask)

#

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

62returnself.generator(res)

#

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

#

70d\_model:int=51271seq\_len:int=12872batch\_size:int=3273n\_layers:int=674n\_heads:int=875dropout:float=0.176d\_ff:int=204877glu\_variant:str='GLU'78epochs:int=579grad\_norm\_clip:float=0.5

#

කුඩාෂේක්ස්පියර් දත්ත කට්ටලය

82classTinyShakespeareDataset(Dataset):

#

87def\_\_init\_\_(self,seq\_len:int):

#

පෙළගොනුවේ පිහිටීම

89path=lab.get\_data\_path()/'tiny\_shakespeare.txt'

#

ගොනුවබාගන්න

91download\_file('https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt',path)

#

බාගතකළ ගොනුව කියවන්න

93withopen(str(path),'r')asf:94text=f.read()

#

අක්ෂරඋපුටා ගන්න

97chars=list(set(text))

#

අක්ෂරය(පූර්ණ සංඛ්යා) සිතියමට

99self.stoi={c:ifori,cinenumerate(chars)}

#

Idසිට අක්ෂර සිතියම

101self.itos={i:cfori,cinenumerate(chars)}

#

පුහුණුනියැදියක දිග

103self.seq\_len=seq\_len

#

හැඳුනුම්පත්ආතතියක ස්වරූපයෙන් දත්ත

105self.data=self.text\_to\_i(text)

#

පෙළහැඳුනුම්පත්වල ආතතියකට පරිවර්තනය කරන්න

107deftext\_to\_i(self,text:str):

#

111returntorch.tensor([self.stoi[c]forcintext],dtype=torch.long)

#

දත්තකට්ටුවේ සාම්පල ගණන.

මෙයතනි යුගයකින් දත්ත කට්ටල seq_len වේලාවන් කියවනු ඇත.

113def\_\_len\_\_(self):

#

119returnlen(self.data)-self.seq\_len-1

#

නියැදියක්ආපසු ලබා දෙන්න

121def\_\_getitem\_\_(self,idx):

#

125returnself.data[idx:idx+self.seq\_len],self.data[idx+1:idx+self.seq\_len+1]

#

පුහුණුකරු

128classTrainer:

#

133def\_\_init\_\_(self,configs:Configs):

#

උපාංගයලබා ගන්න

135self.device=torch.device('cpu')136iftorch.cuda.is\_available():137self.device=torch.device('cuda:0')

#

දත්තසමුදාය ආරම්භ කරන්න

139self.dataset=TinyShakespeareDataset(configs.seq\_len)

#

දත්තසමුදාය ආරම්භ කරන්න

141self.dataloader=DataLoader(self.dataset,142batch\_size=configs.batch\_size,143collate\_fn=transpose\_batch,144shuffle=True)

#

ගේට්ටුරේඛීය ඒකකය සමඟ FFN FFNGLU​(x)(x,W1​,V,W2​)=(σ(xW1​)⊗xV)W2​

148ifconfigs.glu\_variant=='GLU':149ffn=FeedForward(configs.d\_model,configs.d\_ff,configs.dropout,nn.Sigmoid(),True,False,False,False)

#

බිලීනියර්සැඟවුණු තට්ටුවක් සහිත FFN FFNBilinear​(x)(x,W1​,V,W2​)=(xW1​⊗xV)W2​

152elifconfigs.glu\_variant=='Bilinear':153ffn=FeedForward(configs.d\_model,configs.d\_ff,configs.dropout,nn.Identity(),True,False,False,False)

#

RelUගේට්ටුව සමඟ FFN FFNReGLU​(x)(x,W1​,V,W2​)=(max(0,xW1​)⊗xV)W2​

156elifconfigs.glu\_variant=='ReGLU':157ffn=FeedForward(configs.d\_model,configs.d\_ff,configs.dropout,nn.ReLU(),True,False,False,False)

#

GELUගේට්ටුව සහිත FFN FFNGEGLU​(x)(x,W1​,V,W2​)=(GELU(xW1​)⊗xV)W2​

160elifconfigs.glu\_variant=='GEGLU':161ffn=FeedForward(configs.d\_model,configs.d\_ff,configs.dropout,nn.GELU(),True,False,False,False)

#

ස්විෂ් FFNSwiGLU​(x)(x,W1​,V,W2​)=(Swish1​(xW1​)⊗xV)W2​ ගේට්ටුව සමඟ එෆ්එෆ්එන් Swishβ​(x)=xσ(βx)

165elifconfigs.glu\_variant=='SwiGLU':166ffn=FeedForward(configs.d\_model,configs.d\_ff,configs.dropout,nn.SiLU(),True,False,False,False)

#

RelUසක්රිය කිරීම සමඟ FFN FFNReLU​(x)(x,W1​,W2​,b1​,b2​)=ReLU1​(xW1​+b1​)W2​+b2​

169elifconfigs.glu\_variant=='ReLU':170ffn=FeedForward(configs.d\_model,configs.d\_ff,configs.dropout,nn.ReLU())

#

RelUසක්රිය කිරීම සමඟ FFN FFNGELU​(x)(x,W1​,W2​,b1​,b2​)=GELU1​(xW1​+b1​)W2​+b2​

173elifconfigs.glu\_variant=='GELU':174ffn=FeedForward(configs.d\_model,configs.d\_ff,configs.dropout,nn.GELU())175else:176raiseValueError(f'Unknown variant {configs.glu\_variant}')

#

විවිධඅක්ෂර ගණන

179n\_chars=len(self.dataset.stoi)

#

බහු-හිස අවධානය මොඩියුලය ආරම්භ කරන්න

182mha=MultiHeadAttention(configs.n\_heads,configs.d\_model,configs.dropout)

#

ට්රාන්ස්ෆෝමර් කොටස ආරම්භ කරන්න

184transformer\_layer=TransformerLayer(d\_model=configs.d\_model,self\_attn=mha,src\_attn=None,185feed\_forward=ffn,dropout\_prob=configs.dropout)

#

පිවිසුම්උත්පාදනය කිරීම සඳහා කාවැද්දීමේ ස්ථරයක් (ස්ථාවර ස්ථානීය කේතීකරණයක් සහිත) ට්රාන්ස්ෆෝමර් එන්කෝඩරය සහ රේඛීය තට්ටුවක් සහිත ආකෘතිය ආරම්භ කරන්න.

191self.model=AutoregressiveModel(EmbeddingsWithPositionalEncoding(configs.d\_model,n\_chars),192Encoder(transformer\_layer,configs.n\_layers),193nn.Linear(configs.d\_model,n\_chars))

#

ආකෘතියවත්මන් උපාංගයට ගෙනයන්න

196self.model.to(self.device)

#

Noam ප්රශස්තකරණය ආරම්භ කරන්න

199self.optimizer=Noam(self.model.parameters(),lr=1.0,warmup=2\_000,d\_model=configs.d\_model)

#

හරස්එන්ට්රොපි නැතිවීම

202self.loss\_func=nn.CrossEntropyLoss()

#

පුහුණු එපොච් ගණන; අපගේ දත්ත කට්ටල අර්ථ දැක්වීම තනි යුගයකින් දත්ත seq_len වේලාවන් පුනරාවර්තනය කරන බව සලකන්න

205self.epochs=configs.epochs

#

ශ්රේණියේක්ලිපින් සම්මතය

207self.grad\_norm\_clip=configs.grad\_norm\_clip

#

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

210tracker.set\_scalar("loss.\*",True)

#

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

212defsample(self):

#

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

218prompt='It is'

#

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

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

#

සාම්පල25 ටෝකන

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

#

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

224data=self.dataset.text\_to\_i(prompt).unsqueeze(-1)225data=data.to(self.device)

#

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

227output=self.model(data)

#

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

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

#

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

231prompt+=self.dataset.itos[output[-1].item()]

#

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

233log+=[(self.dataset.itos[output[-1].item()],Text.value)]

#

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

236logger.log(log)

#

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

238deftrain(self):

#

ලබාදී ඇති එපොච් සංඛ්යාව සඳහා ලූප්

244for\_inmonit.loop(self.epochs):

#

මිනිබැච්හරහා නැවත ක්රියාත්මක කරන්න

246fori,batchinmonit.enum('Train',self.dataloader):

#

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

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

#

පුහුණුකරන ලද අක්ෂර ගණන ලෙස ට්රැකර් පියවර සකසන්න

251tracker.add\_global\_step(data.shape[0]\*data.shape[1])

#

පුහුණුවසඳහා ආදර්ශ තත්වය සකසන්න

254self.model.train()

#

ආකෘතියතක්සේරු කරන්න

256output=self.model(data)

#

අලාභයගණනය කරන්න

259loss=self.loss\_func(output.view(-1,output.shape[-1]),target.view(-1))

#

අලාභයලොග් කරන්න

261tracker.add("loss.train",loss)

#

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

264loss.backward()

#

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

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

#

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

268self.optimizer.step()

#

ආදර්ශපරාමිතීන් සහ අනුක්රමික ලොග් කරන්න

270if(i+1)%100==0:271tracker.add('model',self.model)

#

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

273self.optimizer.zero\_grad()

#

නියැදියක්ජනනය කරන්න

276if(i+1)%100==0:277self.model.eval()278withtorch.no\_grad():279self.sample()

#

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

282if(i+1)%10==0:283tracker.save()

#

ආකෘතියසුරකින්න

286experiment.save\_checkpoint()

#

289defmain():

#

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

291experiment.create(name="glu\_variants")

#

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

293configs=Configs()

#

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

295experiment.configs(dataclasses.asdict(configs))

#

පුහුණුකරුසාදන්න

298trainer=Trainer(configs)

#

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

300experiment.add\_pytorch\_models({'model':trainer.model})

#

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

303withexperiment.start():

#

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

305trainer.train()306307308if\_\_name\_\_=='\_\_main\_\_':309main()

Trending Research Paperslabml.ai