Back to Annotated Deep Learning Paper Implementations

රොටරිස්ථානීය කාවැද්දීම් (කඹය)

docs/si/transformers/rope/index.html

latest9.5 KB
Original Source

hometransformersrope

[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θi​xm(i+2d​)​cosmθi​+xm(i)​sinmθi​​)​

32classRotaryPositionalEmbeddings(nn.Module):

#

  • d යනු විශේෂාංග ගණන d
  • base ගණනය කිරීම සඳහා භාවිතා කරන නියතය Θ
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θi​xm(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()

Trending Research Paperslabml.ai