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

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

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

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)