docs/si/transformers/glu_variants/simple.html
මෙයස්වයංක්රීය ප්රතිගාමී සඳහා සරල ට්රාන්ස්ෆෝමර් ආකෘතියක් පුහුණු කරයි.ස්ථාන-නැණවත් පෝෂක ජාලයසඳහා අපි විවිධ ප්රභේද උත්සාහ කරමු.
මෙය 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()