රොපර් ජෝර්ජස් හාරික් (@gharik)විසින් වැඩ කරනු ලබන අතර, මෙම ක්රියාත්මක කිරීම ඔහුගේ මුල් කේතය මත පදනම් වේ.
රොටරි ස්ථානීය කාවැද්දීම් (කඹය) අවධානය ලකුණු ගණනය කිරීමේදී සාපේක්ෂ ස්ථාන ඇතුළත් වේ. කෙසේ වෙතත්, කාවැද්දීම් තමන්ම කිසිදු ස්ථානීය තොරතුරක් ලබා නොගනී, එය හේතුකාරක අවධානයෙන් ව්යංගයෙන් ලබා ගත හැකි දේ හැර.
ROPERඅගය කාවැද්දීම් සඳහා සාපේක්ෂ ස්ථානීය තොරතුරු පැහැදිලිව එකතු කරයි. විශේෂයෙන්, එය අවධානය යොමු කළ ටෝකන වල සාපේක්ෂ ස්ථාන එක් කරයි. අපි අවධානය යොමු අගයන් භ්රමණය කිරීමට එම භමණ ස්ථානීය කාවැද්දීම් භාවිතා කරන්න, එවිට, බර තැබූ මුදල ගැනීමෙන් පසු, අපි අවසාන ප්රතිවිරුද්ධ දිශාවට භ්රමණය කරමු. වර්තමාන ස්ථානයට සාපේක්ෂව එක් එක් අගයන් (අවධානයට පෙර) භ්රමණය වීමට සමාන වේ.
රෝප්වලට වඩා සැලකිය යුතු දියුණුවක් දැකිය හැකි අංක ගණිතමය එකතු කිරීමක් මත ROPER සමඟ ට්රාන්ස්ෆෝමර් ආකෘතියක් පුහුණු කිරීම සඳහා පුහුණු කේතය මෙන්න.
ඕනෑමහිසක් සඳහා, ස්ථානයේ සිට ස්ථානයට අවධානය යොමු කළ යුතු අතර , ස්ථානයේ අගය කාවැද්දීම් විය යුතුය . අපි තනි ලක්ෂණ ලෙස දක්වයි .
සාමාන්යයෙන්, අපි වටිනාකම් කාවැද්දීම් වල බර එකතුව ගන්නෙමු
මෙයපැහැදිලිවම අවසාන ප්රති . ලයට තනතුරු පිළිබඳ දුර තොරතුරු එකතු නොකරයි.
ROPERයුගල කඹය වැනි ලක්ෂණ සහ ඒවා පරිවර්තනය කරන්න. යුගලයක් සඳහා එය ඒවා පරිවර්තනය කරයි. පරිවර්තනය කරන ලද විශේෂාංග සමඟ පරිත්යාග කරමු . එවිට එය ප්රතිවිරුද්ධ දිශාවට බර තැබූ මුදල භ්රමණය වේ . සටහන්කරන්න .
එයසැලකිල්ලට ගන්න,
පරිවර්තනයන්සමඟ පසු අවසාන ප්රතිදානය වන්නේ,
එයසටහන් කර ගන්න .
පළමුවාරය පුළුල් කරමු ,
Simiarlyඅපට දෙවන වාරය සමාන බව පෙන්විය හැකිය,
ලබාදෙන,
එනම්, වර්තමාන ස්ථානයට සාපේක්ෂව භ්රමණය වන අගයන්හි බරිත සාමාන්යය.
ආර්තමෙටික්එකතු කිරීමේ කාර්යයක් සඳහා ROPER භාවිතා කරනඅත්හදා බැලීමක් මෙන්න .
118from typing import Optional
119
120import torch
121
122from labml_nn.transformers.rope import RotaryPositionalEmbeddings, RotaryPEMultiHeadAttentionමෙය කඹය භ්රමණය ක්රියාත්මක කිරීමෙන් උරුම වන අතර දිශාව වෙනස් කරයි.
125class ReverseRotaryPositionalEmbeddings(RotaryPositionalEmbeddings):x
යනු යතුරක හිසෙහි ටෙන්සර් හෝ හැඩය සහිත විමසුමකි [seq_len, batch_size, n_heads, d]
132 def forward(self, x: torch.Tensor):හැඹිලි සහ අගයන්
137 self._build_cache(x)විශේෂාංගබෙදන්න, අපට භ්රමණ කාවැද්දීම් යෙදීමට තෝරා ගත හැක්කේ අර්ධ විශේෂාංග සමූහයකට පමණි.
140 x_rope, x_pass = x[..., :self.d], x[..., self.d:]ගණනයකරන්න
144 neg_half_x = self._neg_half(x_rope)160 x_rope = (x_rope * self.cos_cached[:x.shape[0]]) - (neg_half_x * self.sin_cached[:x.shape[0]])163 return torch.cat((x_rope, x_pass), dim=-1)166class RotaryValuePEMultiHeadAttention(RotaryPEMultiHeadAttention):173 def __init__(self, heads: int, d_model: int,
174 rope_percentage: float = 0.5, rope_value_percentage: float = 0.5,
175 dropout_prob: float = 0.0):
176 super().__init__(heads, d_model, rope_percentage, dropout_prob)භ්රමණස්ථානීය කාවැද්දීමේ ස්ථර
179 d_rope_value = int(self.d_k * rope_value_percentage)
180
181 self.value_rotary_pe = RotaryPositionalEmbeddings(d_rope_value)
182 self.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
.
184 def forward(self, *,
185 query: torch.Tensor,
186 key: torch.Tensor,
187 value: torch.Tensor,
188 mask: Optional[torch.Tensor] = None):query
, key
value
සහ හැඩය [seq_len, batch_size, d_model]
200 seq_len, batch_size, _ = query.shape
201
202 if mask is not None:
203 mask = self.prepare_mask(mask, query.shape, key.shape)සූදානම්වන්න query
, key
සහ අවධානය ගණනය කිරීම value
සඳහා. මේවාට පසුව හැඩය ඇත [seq_len, batch_size, heads, d_k]
.
207 query = self.query(query)
208 key = self.key(key)
209 value = self.value(value)අවධානයලකුණු ගණනය කරන්න . මෙය හැඩයේ ආතතිකයක් ලබා දෙයි [seq_len, seq_len, batch_size, heads]
.
213 scores = self.get_scores(query, key)පරිමාණලකුණු
216 scores *= self.scaleවෙස්යොදන්න
219 if mask is not None:
220 scores = scores.masked_fill(mask == 0, float('-inf'))ප්රධාන අනුක්රමය මානයක් ඔස්සේ අවධානය
224 attn = self.softmax(scores)අතහැරදැමීම යොදන්න
227 attn = self.dropout(attn)බරතැබූ මුදල ගැනීමට පෙර අගය කාවැද්දීම් කරකවන්න එවිට ස්ථානීය තොරතුරු අඩංගු වේ
230 value = self.value_rotary_pe(value)අගයන්අනුව ගුණ කරන්න
234 x = torch.einsum("ijbh,jbhd->ibhd", attn, self.value_rotary_pe(value))එක්එක් කාවැද්දීම සාපේක්ෂ තනතුරු පැවැත්වීමට බව එසේ විරුද්ධ දිශාවට කරකවන්න
237 x = self.value_reverse_rotary_pe(x)වෙනත්ගණනය කිරීම් සඳහා අවධානය සුරකින්න
240 self.attn = attn.detach()බහුහිස් සංයුක්ත කරන්න
243 x = x.reshape(seq_len, batch_size, -1)ප්රතිදානස්ථරය
246 return self.output(x)