docs/si/transformers/rope/index.html
[View code on Github](https://github.com/labmlai/annotated_deep_learning_paper_implementations/tree/master/labml_nn/transformers/rope/ init.py)
මෙය PyTorch හි රොටරි ස්ථානීය කාවැද්දීම් (කඹය) ක්රියාත්මක කිරීමයි.
රොටරිස්ථානීය කාවැද්දීම් (කඹය) ටෝකන වල ස්ථාන තොරතුරු භ්රමණ අනුකෘතියක් සමඟ කේතනය කරන අතර එය ස්වාභාවිකවම පැහැදිලි සාපේක්ෂ ස්ථාන යැපීමක් ඇතුළත් කරයි.
කුඩාෂේක්ස්පියර් දත්ත කට්ටලය මත කඹය සහිත ට්රාන්ස්ෆෝමර් ආකෘතියක් පුහුණු කිරීම සඳහා පුහුණු කේතය මෙන්න.
25importtorch26fromtorchimportnn2728fromlabml.loggerimportinspect29fromlabml\_nn.transformers.mhaimportMultiHeadAttention
රොටරිකේතීකරණය 2D තලය තුළ භ්රමණය වීමෙන් විශේෂාංග යුගල පරිවර්තනය කරයි. එනම්, එය d විශේෂාංග 2d යුගල ලෙස සංවිධානය කරයි. සෑම යුගලයක්ම 2D තලයක ඛණ්ඩාංකයක් ලෙස සැලකිය හැකි අතර, කේතීකරණය ටෝකනයේ පිහිටීම අනුව කෝණයකින් එය භ්රමණය වේ.
ස්ථානයේ xm(1) සිටින xm(2) ඕනෑම ප්රධානියකුගේ යතුරේ හෝ විමසුමේ ලක්ෂණ දෙකක් වේවා m. නැතහොත් සරල බව සඳහා උපකල්පනය x කර ඇත්තේ ලක්ෂණ දෙකක් පමණි. එවිට පරිවර්තනය වන්නේ,
RoPE(xm(1),xm(2),m)=(cosmθsinmθ−sinmθcosmθ)(xm(1)xm(2))=(xm(1)cosmθ−xm(2)sinmθxm(2)cosmθ+xm(1)sinmθ)
නියත θ කෝණයක් කොහෙද? අනෙක් අංග යුගල ඒ හා සමානව පරිවර්තනය වේ.
විශේෂාංගයුගලයක් සඳහා, ස්ථාන m දෙකක් අතර තිත් නිෂ්පාදන අවධානය ලකුණු කරයි n
⟨RoPE(xm(1),xm(2),m),RoPE(xn(1),xn(2),n)⟩(xm(1)cosmθ−xm(2)sinmθ)(xn(1)cosnθ−xn(2)sinnθ)(xm(2)cosmθ+xm(1)sinmθ)(xn(2)cosnθ+xn(1)sinnθ)xm(1)xn(1)(cosmθcosnθ+sinmθsinnθ)xm(1)xn(2)(−cosmθsinnθ+sinmθcosnθ)xm(2)xn(1)(−sinmθcosnθ+cosmθsinnθ)xm(2)xn(2)(sinmθsinnθ+cosmθcosnθ)xm(1)xn(1)cos(m−n)θ+xm(1)xn(2)sin(m−n)θ−xm(2)xn(1)sin(m−n)θ+xm(2)xn(1)cos(m−n)θ(xm(1)cos(m−n)θ−xm(2)sin(m−n)θ)xn(1)(xm(2)cos(m−n)mθ+xm(1)sin(m−n)θ)xn(2)⟨RoPE(xm(1),xm(2),m−n),RoPE(xn(1),xn(2),0)⟩=+=+++=+=+=
මෙයින්පෙනී යන්නේ තිත් නිෂ්පාදන අවධානය සඳහා භ්රමණ කේතීකරණ සාපේක්ෂ අවධානයක් ලබා දෙන බවයි.
විශේෂාංගයුගල වශයෙන් කාණ්ඩගත කර ඉහත පරිදි හසුරුවනු ලැබේ. ඔවුන් එක් එක් යුගල θ සඳහා වෙනස් භාවිතා කරයි.
කඩදාසියෝජනා කරන්නේ විශේෂාංග 2d යුගල Θ=θi=10000d2(i−1),i∈[1,2,...,2d] සඳහා භාවිතා කිරීමයි.
අපිවිශේෂාංගය i සමඟ විශේෂාංගය යුගල කරමු i+2d. එබැවින් පිහිටීම සඳහා m අපි පරිවර්තනය කරමු
(xm(i)xm(i+2d))
කිරීමට
(xm(i)cosmθi−xm(i+2d)sinmθixm(i+2d)cosmθi+xm(i)sinmθi)
32classRotaryPositionalEmbeddings(nn.Module):
d යනු විශේෂාංග ගණන dbase ගණනය කිරීම සඳහා භාවිතා කරන නියතය Θ119def\_\_init\_\_(self,d:int,base:int=10\_000):
124super().\_\_init\_\_()125126self.base=base127self.d=d128self.cos\_cached=None129self.sin\_cached=None
හැඹිලි cos සහ sin අගයන්
131def\_build\_cache(self,x:torch.Tensor):
හැඹිලියදැනටමත් ඉදිකර ඇත්නම් ආපසු යන්න
136ifself.cos\_cachedisnotNoneandx.shape[0]\<=self.cos\_cached.shape[0]:137return
අනුක්රමිකදිග ලබා ගන්න
140seq\_len=x.shape[0]
Θ=θi=10000d2(i−1),i∈[1,2,...,2d]
143theta=1./(self.base\*\*(torch.arange(0,self.d,2).float()/self.d)).to(x.device)
ස්ථානදර්ශක සාදන්න [0, 1, ..., seq_len - 1]
146seq\_idx=torch.arange(seq\_len,device=x.device).float().to(x.device)
ස්ථානදර්ශකයේ නිෂ්පාදිතය ගණනය කරන්න θi
149idx\_theta=torch.einsum('n,d-\>nd',seq\_idx,theta)
පේළියසඳහා m අපට ඇති පරිදි සංයුක්ත කරන්න [mθ0,mθ1,...,mθ2d,mθ0,mθ1,...,mθ2d]
153idx\_theta2=torch.cat([idx\_theta,idx\_theta],dim=1)
ඒවාහැඹිලිය
156self.cos\_cached=idx\_theta2.cos()[:,None,None,:]157self.sin\_cached=idx\_theta2.sin()[:,None,None,:]
159def\_neg\_half(self,x:torch.Tensor):
2d
161d\_2=self.d//2
ගණනයකරන්න [−x(2d+1),−x(2d+2),...,−x(d),x(1),x(2),...,x(2d)]
164returntorch.cat([-x[:,:,:,d\_2:],x[:,:,:,:d\_2]],dim=-1)
x යනු යතුරක හිසෙහි ටෙන්සර් හෝ හැඩය සහිත විමසුමකි [seq_len, batch_size, n_heads, d]166defforward(self,x:torch.Tensor):
හැඹිලි cos සහ sin අගයන්
171self.\_build\_cache(x)
විශේෂාංගබෙදන්න, අපට භ්රමණ කාවැද්දීම් යෙදීමට තෝරා ගත හැක්කේ අර්ධ විශේෂාංග සමූහයකට පමණි.
174x\_rope,x\_pass=x[...,:self.d],x[...,self.d:]
ගණනයකරන්න [−x(2d+1),−x(2d+2),...,−x(d),x(1),x(2),...,x(2d)]
178neg\_half\_x=self.\_neg\_half(x\_rope)
ගණනයකරන්න
(xm(i)cosmθi−xm(i+2d)sinmθixm(i+2d)cosmθi+xm(i)sinmθi)
සඳහා i∈1,2,...,2d
190x\_rope=(x\_rope\*self.cos\_cached[:x.shape[0]])+(neg\_half\_x\*self.sin\_cached[:x.shape[0]])
193returntorch.cat((x\_rope,x\_pass),dim=-1)
මුල් ට්රාන්ස්ෆෝමරයෙන් අපි බහු-හිස අවධානයඅභිබවා යමු.
196classRotaryPEMultiHeadAttention(MultiHeadAttention):
203def\_\_init\_\_(self,heads:int,d\_model:int,rope\_percentage:float=0.5,dropout\_prob:float=0.0):204super().\_\_init\_\_(heads,d\_model,dropout\_prob)
භ්රමණස්ථානීය කාවැද්දීමේ ස්ථර
207d\_rope=int(self.d\_k\*rope\_percentage)208self.query\_rotary\_pe=RotaryPositionalEmbeddings(d\_rope)209self.key\_rotary\_pe=RotaryPositionalEmbeddings(d\_rope)
211defget\_scores(self,query:torch.Tensor,key:torch.Tensor):
කඹයසමඟ තිත් නිෂ්පාදන ගණනය කරන්න
217returntorch.einsum('ibhd,jbhd-\>ijbh',self.query\_rotary\_pe(query),self.key\_rotary\_pe(key))
සරලඋදාහරණයක් සමඟ කඹය පරීක්ෂා කිරීම
220def\_test\_rotary():
224x=torch.tensor([[1,2,3,4],[4,5,6,7],[7,8,9,10]],dtype=torch.float)225x=x[:,None,None,:]226inspect(x)227228rotary\_pe=RotaryPositionalEmbeddings(3)229inspect(rotary\_pe(x))230231232if\_\_name\_\_=='\_\_main\_\_':233\_test\_rotary()