වේගයෙන්ට්රාන්ස්ෆෝමර් බර

කඩදාසි රේඛීය ට්රාන්ස්ෆෝමර් පයිටෝර්ච් හි රහසින් වේගවත් බර මතක පද්ධති රේඛීය ස්වයං අවධානය සහ වේගවත් බර පද්ධති අතර සමානකම් සොයා ගන්නා අතර ඒ මත පදනම්ව ස්වයං අවධානය යාවත්කාලීන කිරීමේ රීතියට වෙනස් කිරීම් සිදු කරයි. එය සරල, නමුත් effective ලදායී කර්නල් ශ්රිතයක් ද හඳුන්වා දෙයි.

කතුවරුන්කඩදාසි සමඟ සංසන්දනය කරන වෙනත් ප්රභේද ඇතුළුව කඩදාසි නිල වශයෙන් ක්රියාත්මක කිරීමක් ලබා දී ඇත.

වේගවත්බර

යෙදවුම් හෝ දිග අනුපිළිවෙලක් සලකා බලන්න. එක් එක් පියවර ප්රමාණයේ දෛශිකයකි ; i.e . වේගවත් බර ආකෘතිය ප්රතිදානය නිෂ්පාදනය කිරීම සඳහා සෑම පියවරකදීම බර අනුකෘතියක් ජනනය කරයි ,

යනු පිටත නිෂ්පාදිතය (), අනුකෘතියක් ලබා දීම සඳහා දෛශික දෙකේ මූලද්රව්ය එකිනෙකා සමඟ ගුණ කරනු ලැබේ. යනු සක්රිය කිරීමේ කාර්යයකි. පුහුණු කළ හැකි බර (පරාමිතීන්) වේ. එක් එක් පියවරේදී ජනනය වන වේගවත් බර වේ.

රේඛීයස්වයං අවධානය

මුල්ට්රාන්ස්ෆෝමර් ස්වයං අවධානය යනු, (පැහැදිලි කිරීම සඳහා මඟ හැරීම)

කොහේද

ස්වයංඅවධානය රේඛීයකරණය කිරීම පිටුපස ඇති අදහස නම්, සොෆ්ට්මැක්ස් කර්නලය වෙනත් කර්නලයක් සමඟ ප්රතිස්ථාපනය කිරීමයි, එවිට අපට ස්වයං අවධානය ක්රියාකාරිත්වයේ හරය වේගයෙන් ගණනය කළ හැකිය:

මෙයලබා දෙයි

අපටඒවා කාර්යක්ෂමව ගණනය කළ හැකිය:

මෙයවේගවත් බරට බෙහෙවින් සමාන ය.

කඩදාසිනව රේඛීය අවධානය ප්රක්ෂේපණ ශ්රිතයක් හඳුන්වා දෙන අතර සාමාන්යකරණය වෙනස් කිරීම සඳහා නව යාවත්කාලීන රීතියක්

කුඩාෂේක්ස්පියර් දත්ත කට්ටලයෙහි වේගවත් බර ට්රාන්ස්ෆෝමරයක් පුහුණු කිරීම සඳහා පුහුණු කේතය සහ සටහන් පොතක් මෙන්න.

Open In Colab View Run

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

නිර්නවාදීපරාමිති නිදහස් ව්යාපෘතිය (DPFP)

කඩදාසිතුළ හඳුන්වා දී ඇති නව ප්රක්ෂේපණ ශ්රිතය මෙයයි. ඩීපීඑෆ්පී ව්යාපෘති මානයන්හි මානයන්හි මානයන් , අධි-පරාමිතියක් කොහෙද?

ප්රමාණයේදෛශිකයක් ලබා දීම සහ කොතැනද , සහ . යනු දෛශිකයේ -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 = eps
149    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 = attn

Feed-ඉදිරිජාලය

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)