Back to Annotated Deep Learning Paper Implementations

සාපේක්ෂදුර (ROPER) සහිත රොටරි ස්ථානීය කාවැද්දීම්

docs/si/transformers/rope/value_pe/index.html

latest11.6 KB
Original Source

hometransformersropevalue_pe

[View code on Github](https://github.com/labmlai/annotated_deep_learning_paper_implementations/tree/master/labml_nn/transformers/rope/value_pe/ init.py)

#

රොපර් ජෝර්ජස් හාරික් (@gharik)විසින් වැඩ කරනු ලබන අතර, මෙම ක්රියාත්මක කිරීම ඔහුගේ මුල් කේතය මත පදනම් වේ.

සාපේක්ෂදුර (ROPER) සහිත රොටරි ස්ථානීය කාවැද්දීම්

රොටරි ස්ථානීය කාවැද්දීම් (කඹය) අවධානය ලකුණු ගණනය කිරීමේදී සාපේක්ෂ ස්ථාන ඇතුළත් වේ. කෙසේ වෙතත්, කාවැද්දීම් තමන්ම කිසිදු ස්ථානීය තොරතුරක් ලබා නොගනී, එය හේතුකාරක අවධානයෙන් ව්යංගයෙන් ලබා ගත හැකි දේ හැර.

ROPERඅගය කාවැද්දීම් සඳහා සාපේක්ෂ ස්ථානීය තොරතුරු පැහැදිලිව එකතු කරයි. විශේෂයෙන්, එය අවධානය යොමු කළ ටෝකන වල සාපේක්ෂ ස්ථාන එක් කරයි. අපි අවධානය යොමු අගයන් භ්රමණය කිරීමට එම භමණ ස්ථානීය කාවැද්දීම් භාවිතා කරන්න, එවිට, බර තැබූ මුදල ගැනීමෙන් පසු, අපි අවසාන ප්රතිවිරුද්ධ දිශාවට භ්රමණය කරමු. වර්තමාන ස්ථානයට සාපේක්ෂව එක් එක් අගයන් (අවධානයට පෙර) භ්රමණය වීමට සමාන වේ.

රෝප්වලට වඩා සැලකිය යුතු දියුණුවක් දැකිය හැකි අංක ගණිතමය එකතු කිරීමක් මත ROPER සමඟ ට්රාන්ස්ෆෝමර් ආකෘතියක් පුහුණු කිරීම සඳහා පුහුණු කේතය මෙන්න.

කාවැද්දීම්වල සාපේක්ෂ දුර

ඕනෑමහිසක් සඳහා, ස්ථානයේ සිට ස්ථානයට n අවධානය යොමු vi​ කළ යුතු අතර i, ස්ථානයේ අගය කාවැද්දීම් විය යුතුය an,i​ i. අපි තනි ලක්ෂණ ලෙස දක්වයි vi(1)​,vi(2)​,….

සාමාන්යයෙන්, අපි වටිනාකම් කාවැද්දීම් වල බර එකතුව ගන්නෙමු

on(j)​=i∑​an,i​vi(j)​

මෙයපැහැදිලිවම අවසාන ප්රති on(j)​. i ලයට තනතුරු පිළිබඳ දුර තොරතුරු එකතු නොකරයි.

ROPERයුගල කඹය වැනි ලක්ෂණ සහ ඒවා පරිවර්තනය කරන්න. යුගලයක් vm(1)​ සඳහා vm(2)​ එය ඒවා පරිවර්තනය RoPE(vm(1)​,vm(2)​,m)කරයි. පරිවර්තනය කරන ලද විශේෂාංග සමඟ පරිත්යාග කරමු v^m(1)​,v^m(2)​. එවිට එය ප්රතිවිරුද්ධ දිශාවට බර තැබූ මුදල o^n(j)​ භ්රමණය වේ RoPE(o^n(1)​,o^n(2)​,−n). සටහන්කරන්න −n.

එයසැලකිල්ලට ගන්න,

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θ​)​

පරිවර්තනයන්සමඟ පසු අවසාන ප්රතිදානය වන්නේ,

RoPE(o^n(1)​,o^n(2)​,−n)(o^n(1)​cosnθ+o^n(2)​sinnθo^n(2)​cosnθ−o^n(1)​sinnθ​)​=

එයසටහන් කර ගන්න sin(−nθ)=−sinnθ.

පළමුවාරය පුළුල් කරමු o^n(1)​cosnθ+o^n(2)​sinnθ,

o^n(1)​cosnθ+o^n(2)​sinnθi∑​an,i​v^i(1)​cosnθ+i∑​an,i​v^i(2)​sinnθi∑​an,i​(vi(1)​cosiθ−vi(2)​siniθ)cosnθi∑​an,i​(vi(2)​cosiθ+vi(1)​siniθ)sinmθi∑​an,i​vi(1)​(cosiθcosnθ+siniθsinnθ)i∑​an,i​vi(2)​(cosiθsinnθ−siniθcosnθ)i∑​an,i​vi(1)​cos(i−n)θ−i∑​an,i​vi(2)​sin(i−n)θi∑​an,i​vi(1)​cos(i−n)θ−i∑​an,i​vi(2)​sin(i−n)θ​==+=+==​

Simiarlyඅපට දෙවන වාරය සමාන බව පෙන්විය හැකිය,

i∑​an,i​vi(1)​cos(i−n)θ+i∑​an,i​vi(2)​sin(i−n)θ

ලබාදෙන,

RoPE(o^n(1)​,o^n(2)​,−n)(∑i​an,i​vi(1)​cos(i−n)θ−∑i​an,i​vi(2)​sin(i−n)θ∑i​an,i​vi(1)​cos(i−n)θ+∑i​an,i​vi(2)​sin(i−n)θ​)i∑​an,i​RoPE(vi(1)​,vi(1)​,(i−n)θ)​==​

එනම්, වර්තමාන ස්ථානයට සාපේක්ෂව භ්රමණය වන අගයන්හි බරිත සාමාන්යය.

ආර්තමෙටික්එකතු කිරීමේ කාර්යයක් සඳහා ROPER භාවිතා කරනඅත්හදා බැලීමක් මෙන්න .

118fromtypingimportOptional119120importtorch121122fromlabml\_nn.transformers.ropeimportRotaryPositionalEmbeddings,RotaryPEMultiHeadAttention

#

ප්රතිවිරුද්ධදිශාවට භ්රමණය වන කඹය මොඩියුලය

මෙය කඹය භ්රමණය ක්රියාත්මක කිරීමෙන් උරුම වන අතර දිශාව වෙනස් කරයි.

125classReverseRotaryPositionalEmbeddings(RotaryPositionalEmbeddings):

#

  • x යනු යතුරක හිසෙහි ටෙන්සර් හෝ හැඩය සහිත විමසුමකි [seq_len, batch_size, n_heads, d]
132defforward(self,x:torch.Tensor):

#

හැඹිලි cos සහ sin අගයන්

137self.\_build\_cache(x)

#

විශේෂාංගබෙදන්න, අපට භ්රමණ කාවැද්දීම් යෙදීමට තෝරා ගත හැක්කේ අර්ධ විශේෂාංග සමූහයකට පමණි.

140x\_rope,x\_pass=x[...,:self.d],x[...,self.d:]

#

ගණනයකරන්න [−x(2d​+1),−x(2d​+2),...,−x(d),x(1),x(2),...,x(2d​)]

144neg\_half\_x=self.\_neg\_half(x\_rope)

#

ගණනයකරන්න

(xm(i)​cos−mθi​−xm(i+2d​)​sin−mθi​xm(i+2d​)​cos−mθi​+xm(i)​sin−mθi​​)=(xm(i)​cosmθi​+xm(i+2d​)​sinmθi​xm(i+2d​)​cosmθi​−xm(i)​sinmθi​​)​

සඳහා i∈1,2,...,2d​

160x\_rope=(x\_rope\*self.cos\_cached[:x.shape[0]])-(neg\_half\_x\*self.sin\_cached[:x.shape[0]])

#

163returntorch.cat((x\_rope,x\_pass),dim=-1)

#

භ්රමණස්ථානීය කාවැද්දීම් සහිත බහු-හිස අවධානය

මුල් ට්රාන්ස්ෆෝමරයෙන් අපි බහු-හිස අවධානයඅභිබවා යමු.

166classRotaryValuePEMultiHeadAttention(RotaryPEMultiHeadAttention):

#

173def\_\_init\_\_(self,heads:int,d\_model:int,174rope\_percentage:float=0.5,rope\_value\_percentage:float=0.5,175dropout\_prob:float=0.0):176super().\_\_init\_\_(heads,d\_model,rope\_percentage,dropout\_prob)

#

භ්රමණස්ථානීය කාවැද්දීමේ ස්ථර

179d\_rope\_value=int(self.d\_k\*rope\_value\_percentage)180181self.value\_rotary\_pe=RotaryPositionalEmbeddings(d\_rope\_value)182self.value\_reverse\_rotary\_pe=ReverseRotaryPositionalEmbeddings(d\_rope\_value)

#

query , key සහ valueවිමසුම, _යතුර_සහ _අගය_දෛශික එකතු කිරීම ගබඩා කරන ආතන්ය වේ. ඒවායේ හැඩය ඇත [seq_len, batch_size, d_model] .

mask හැඩය ඇති [seq_len, seq_len, batch_size] අතර කණ්ඩායම සඳහා b , ස්ථානයේ විමසුමට ප්රවේශය i තිබේද යන්න mask[i, j, b] දක්වයි ස්ථානයේ ප්රධාන-අගය j .

184defforward(self,\*,185query:torch.Tensor,186key:torch.Tensor,187value:torch.Tensor,188mask:Optional[torch.Tensor]=None):

#

query , key``value සහ හැඩය [seq_len, batch_size, d_model]

200seq\_len,batch\_size,\_=query.shape201202ifmaskisnotNone:203mask=self.prepare\_mask(mask,query.shape,key.shape)

#

සූදානම්වන්න query , key සහ අවධානය ගණනය කිරීම value සඳහා. මේවාට පසුව හැඩය ඇත [seq_len, batch_size, heads, d_k] .

207query=self.query(query)208key=self.key(key)209value=self.value(value)

#

අවධානයලකුණු ගණනය කරන්න QK⊤. මෙය හැඩයේ ආතතිකයක් ලබා දෙයි [seq_len, seq_len, batch_size, heads] .

213scores=self.get\_scores(query,key)

#

පරිමාණලකුණු dk​​QK⊤​

216scores\*=self.scale

#

වෙස්යොදන්න

219ifmaskisnotNone:220scores=scores.masked\_fill(mask==0,float('-inf'))

#

softmax ප්රධාන අනුක්රමය මානයක් ඔස්සේ අවධානය seqsoftmax​(dk​​QK⊤​)

224attn=self.softmax(scores)

#

අතහැරදැමීම යොදන්න

227attn=self.dropout(attn)

#

බරතැබූ මුදල ගැනීමට පෙර අගය කාවැද්දීම් කරකවන්න එවිට ස්ථානීය තොරතුරු අඩංගු වේ

230value=self.value\_rotary\_pe(value)

#

අගයන්අනුව ගුණ කරන්න seqsoftmax​(dk​​QK⊤​)V

234x=torch.einsum("ijbh,jbhd-\>ibhd",attn,self.value\_rotary\_pe(value))

#

එක්එක් කාවැද්දීම සාපේක්ෂ තනතුරු පැවැත්වීමට බව එසේ විරුද්ධ දිශාවට කරකවන්න

237x=self.value\_reverse\_rotary\_pe(x)

#

වෙනත්ගණනය කිරීම් සඳහා අවධානය සුරකින්න

240self.attn=attn.detach()

#

බහුහිස් සංයුක්ත කරන්න

243x=x.reshape(seq\_len,batch\_size,-1)

#

ප්රතිදානස්ථරය

246returnself.output(x)

Trending Research Paperslabml.ai