කඩදාසි රේඛීය ට්රාන්ස්ෆෝමර් පයිටෝර්ච් හි රහසින් වේගවත් බර මතක පද්ධති රේඛීය ස්වයං අවධානය සහ වේගවත් බර පද්ධති අතර සමානකම් සොයා ගන්නා අතර ඒ මත පදනම්ව ස්වයං අවධානය යාවත්කාලීන කිරීමේ රීතියට වෙනස් කිරීම් සිදු කරයි. එය සරල, නමුත් effective ලදායී කර්නල් ශ්රිතයක් ද හඳුන්වා දෙයි.
කතුවරුන්කඩදාසි සමඟ සංසන්දනය කරන වෙනත් ප්රභේද ඇතුළුව කඩදාසි නිල වශයෙන් ක්රියාත්මක කිරීමක් ලබා දී ඇත.
යෙදවුම් හෝ දිග අනුපිළිවෙලක් සලකා බලන්න. එක් එක් පියවර ප්රමාණයේ දෛශිකයකි ; i.e . වේගවත් බර ආකෘතිය ප්රතිදානය නිෂ්පාදනය කිරීම සඳහා සෑම පියවරකදීම බර අනුකෘතියක් ජනනය කරයි ,
යනු පිටත නිෂ්පාදිතය (), අනුකෘතියක් ලබා දීම සඳහා දෛශික දෙකේ මූලද්රව්ය එකිනෙකා සමඟ ගුණ කරනු ලැබේ. යනු සක්රිය කිරීමේ කාර්යයකි. පුහුණු කළ හැකි බර (පරාමිතීන්) වේ. එක් එක් පියවරේදී ජනනය වන වේගවත් බර වේ.
මුල්ට්රාන්ස්ෆෝමර් ස්වයං අවධානය යනු, (පැහැදිලි කිරීම සඳහා මඟ හැරීම)
කොහේද
ස්වයංඅවධානය රේඛීයකරණය කිරීම පිටුපස ඇති අදහස නම්, සොෆ්ට්මැක්ස් කර්නලය වෙනත් කර්නලයක් සමඟ ප්රතිස්ථාපනය කිරීමයි, එවිට අපට ස්වයං අවධානය ක්රියාකාරිත්වයේ හරය වේගයෙන් ගණනය කළ හැකිය:
මෙයලබා දෙයි
අපටඒවා කාර්යක්ෂමව ගණනය කළ හැකිය:
මෙයවේගවත් බරට බෙහෙවින් සමාන ය.
කඩදාසිනව රේඛීය අවධානය ප්රක්ෂේපණ ශ්රිතයක් හඳුන්වා දෙන අතර සාමාන්යකරණය වෙනස් කිරීම සඳහා නව යාවත්කාලීන රීතියක්
කුඩාෂේක්ස්පියර් දත්ත කට්ටලයෙහි වේගවත් බර ට්රාන්ස්ෆෝමරයක් පුහුණු කිරීම සඳහා පුහුණු කේතය සහ සටහන් පොතක් මෙන්න.
96import torch
97from torch import nn
98
99from labml_helpers.module import Module
100from labml_nn.transformers.feed_forward import FeedForward
101from labml_nn.transformers.mha import PrepareForMultiHeadAttention
102from labml_nn.utils import clone_module_listකඩදාසිතුළ හඳුන්වා දී ඇති නව ප්රක්ෂේපණ ශ්රිතය මෙයයි. ඩීපීඑෆ්පී ව්යාපෘති මානයන්හි මානයන්හි මානයන් , අධි-පරාමිතියක් කොහෙද?
ප්රමාණයේදෛශිකයක් ලබා දීම සහ කොතැනද , සහ . යනු දෛශිකයේ -th මූලද්රව්යය වන අතර එය මූලද්රව්ය ගණනට වඩා විශාල නම් වටා රෝල් කර ඇත .
මූලිකවශයෙන්, එය මාරු කරන ලද මූලද්රව්ය ගුණ කිරීමෙන් නව දෛශිකයක් නිර්මාණය කරයි .
මෙයවිරල (ශුන්ය නොවන මූලද්රව්ය කිහිපයක් පමණි) සහ විකලාංග ( බොහෝ විට මිස සහ ඉතා සමාන ය.
කඩදාසිසඳහා සරල සාමාන්යකරණයක් හඳුන්වා දෙයි ,
ව්යුත්පන්නකිරීම සඳහා කඩදාසි පරීක්ෂා කරන්න.
105class DPFP(Module):nu
අධි-පරාමිතිය වේ. eps
සාමාන්යකරණය කිරීමේදී බෙදීම් ශුන්ය නොවන බවට වග බලා ගැනීම සඳහා භාවිතා කරන කුඩා අගයයි. 139 def __init__(self, nu: int = 1, eps: float = 1e-6):144 super().__init__()
145 self.nu = nu
146 self.relu = nn.ReLU()
147 self.eps = eps149 def forward(self, k: torch.Tensor):ලබාගන්න
151 k = self.dpfp(k)විසින්සාමාන්යකරණය
153 return k / (torch.sum(k, dim=-1, keepdim=True) + self.eps)155 def dpfp(self, k: torch.Tensor):160 x = self.relu(torch.cat([k, -k], dim=-1))ලබාගැනීම සඳහා මාරුවීම සහ රෝල් කරන්න
163 x_rolled = [x.roll(shifts=i, dims=-1) for i in range(1, self.nu + 1)]ලබාගැනීමට එකඟ වන්න
166 x_rolled = torch.cat(x_rolled, dim=-1)පිටපත්සංයුක්ත කරන්න
168 x_repeat = torch.cat([x] * self.nu, dim=-1)ඒවාගුණ කරන්න,
174 return x_repeat * x_rolledකඩදාසිගණනය කිරීම සඳහා නව යාවත්කාලීන රීතියක් හඳුන්වා දෙයි . ආකෘතිය මුලින්ම යතුර සමඟ යුගලනය කරන ලද වත්මන් අගය ලබා ගනී. ඉන්පසු නැවත ලබා ගත් අගය සහ ආදානයේ සංයෝජනයක් ගබඩා කරයි.
පුහුණුකළ හැකි පරාමිතියක් වන අතර සිග්මෝයිඩ් ශ්රිතය වේ.
සාමාන්යකරණයවී ඇති නිසා අපට සාමාන්යකරණ පදය අවශ්ය නොවන බව සලකන්න.
177class FastWeightsAttention(Module):205 def __init__(self, heads: int, d_model: int, dropout_prob: float, phi: DPFP):
206 super().__init__()හිසකටවිශේෂාංග ගණන
209 self.d_k = d_model // headsහිස්ගණන
211 self.heads = headsමේවාපරිවර්තනය කරයි query
, key
සහ value
බහු-හිස අවධානය.
214 self.query = PrepareForMultiHeadAttention(d_model, heads, self.d_k, bias=False)
215 self.key = PrepareForMultiHeadAttention(d_model, heads, self.d_k, bias=False)
216 self.value = PrepareForMultiHeadAttention(d_model, heads, self.d_k, bias=False)එක්එක් හිස සඳහා අන්තර්නිවේෂණය බර කාර්යය
219 self.interpolation_weight = nn.Sequential(
220 PrepareForMultiHeadAttention(d_model, heads, 1, bias=False),
221 nn.Sigmoid()
222 )225 self.phi = phiප්රතිදානස්ථරය
228 self.output = nn.Linear(d_model, d_model)හැලීම
230 self.dropout = nn.Dropout(dropout_prob)232 def forward(self, x: torch.Tensor):පියවරගණන ලබා ගන්න
234 seq_len = x.shape[0]සියලු පියවර සහ හිස් සඳහා
236 query = self.phi(self.query(x))සියලු පියවර සහ හිස් සඳහා
238 key = self.phi(self.key(x))සියලු පියවර සහ හිස් සඳහා
240 value = self.value(x)සියලු පියවර සහ හිස් සඳහා
242 beta = self.interpolation_weight(x)245 weights = key.new_zeros((key.shape[1], key.shape[2], value.shape[3], key.shape[3]))ප්රතිදානයන්ගබඩා කිරීමට ලැයිස්තුව
247 outputs = []පියවරහරහා නැවත ක්රියාත්මක කරන්න
250 for i in range(seq_len):252 value_existing = torch.einsum('bhvk,bhk->bhv', weights, key[i])257 weights = weights + torch.einsum('bhv,bhk->bhvk', beta[i] * (value[i] - value_existing), key[i])260 y = torch.einsum('bhvk,bhk->bhv', weights, query[i])බහුහිස් ඒකාබද්ධ කර ඊට සම්බන්ධ කරන්න outputs
263 outputs.append(y.reshape(y.shape[0], -1))එක්එක් පියවරේදී ප්රතිදානයන් තනි ටෙන්සරයකට ගොඩගසන්න
266 x = torch.stack(outputs)ප්රතිදානස්ථරය
269 return self.output(x)මෙයස්වයං අවධානය සහ පෝෂක ජාලය ඒකාබද්ධ කරන සාමාන්ය ට්රාන්ස්ෆෝමර් ස්ථරයකි.
272class FastWeightsAttentionTransformerLayer(Module):276 def __init__(self, *,
277 d_model: int,
278 attn: FastWeightsAttention,
279 feed_forward: FeedForward,
280 dropout_prob: float):
281 super().__init__()ට්රාන්ස්ෆෝමර්ප්රමාණය
283 self.size = d_modelවේගවත්බර අවධානය මොඩියුලය
285 self.attn = attnFeed-ඉදිරිජාලය
287 self.feed_forward = feed_forwardහැලෙනස්ථරය
289 self.dropout = nn.Dropout(dropout_prob)සාමාන්යකරණයස්ථර
292 self.norm_self_attn = nn.LayerNorm([d_model])
293 self.norm_ff = nn.LayerNorm([d_model])295 def forward(self, x: torch.Tensor):වේගවත්බර ගණනය කරන්න ස්වයං අවධානය
297 attn = self.attn(x)ස්වයංඅවධානය ප්රතිඵල එකතු
299 x = x + self.dropout(attn)පෝෂණයසඳහා සාමාන්යකරණය කරන්න
302 z = self.norm_ff(x)Feed-forwardජාලය හරහා ගමන් කරන්න
304 ff = self.feed_forward(z)ප්රතිපෝෂණඉදිරි ප්රති results ල නැවත එක් කරන්න
306 x = x + self.dropout(ff)309 return xමෙයබහු ට්රාන්ස්ෆෝමර් ස්ථර සහිත සාමාන්ය ට්රාන්ස්ෆෝමර් මොඩියුලයකි
312class FastWeightsAttentionTransformer(Module):316 def __init__(self, layer: FastWeightsAttentionTransformerLayer, n_layers: int):
317 super().__init__()ට්රාන්ස්ෆෝමර්ස්ථරයේ පිටපත් සාදන්න
319 self.layers = clone_module_list(layer, n_layers)අවසානසාමාන්යකරණ ස්තරය
321 self.norm = nn.LayerNorm([layer.size])323 def forward(self, x: torch.Tensor):
324 for i, layer in enumerate(self.layers):ස්ථරප්රතිදානය ලබා ගන්න
326 x = layer(x)ප්රතිදානයසාමාන්යකරණය කරන්න
329 return self.norm(x)