ගැඹුරු සම්මතය

Open In Colab

මෙය ඩීප්නෙට් කඩදාසි වලින් ඩීප් නෝම් හි පයිටෝච් ක්රියාත්මක කිරීම: ට්රාන්ස්ෆෝමර් 1,000 ස්ථර දක්වා පරිමාණය කිරීම.

ලේයර් නෝම් සහ බර ආරම්භ කිරීමේ යෝජනා ක්රමය ප්රතිස්ථාපනය කිරීම සඳහා නව සාමාන්යකරණ ශ්රිතයක් හරහා අතිශය ගැඹුරු ට්රාන්ස්ෆෝමර් ස්ථාවර කිරීමේ ක්රමයක් කඩදාසි යෝජනා කරයි. මෙය පශ්චාත්-ස්ථර සම්මතයේ ක්රියාකාරිත්වය සහ පූර්ව ස්ථර සම්මතයේ ස්ථායිතාව ඒකාබද්ධ කරයි. DeepNorms සමඟ ට්රාන්ස්ෆෝමර් ඉගෙනීමේ අනුපාතයක් නොමැතිව පවා ස්ථාවර විය යුතුය.

කඩදාසි පළමු ස්ථරය ප්රතිදානයන් වෙනස්කම් (එම ආදාන සඳහා) ස්ථාවර පුහුණු තුළ ක්රමයෙන් වෙනස් බව පෙන්නුම්; අස්ථාවර විට එය මූලික පුහුණු පියවර තුළ වේගයෙන් වෙනස් වේ. මෙය සිදුවන්නේ කුඩා අගයන් සඳහා බර ආරම්භ කිරීම සහ පුහුණුව ස්ථාවර වන ඉගෙනුම් අනුපාතය උණුසුම්-ඉහළ යාමයි. නව සාමාන්යකරණය සහ බර ආරම්භ කිරීමේ යාන්ත්රණය ව්යුත්පන්න කිරීම සඳහා ස්ථර ප්රතිදානවල වෙනස්කම් කුඩා කර තබා ගැනීමේ අදහස ඔවුන් භාවිතා කරයි.

බර ආරම්භකකරණය

සාමාන්යයෙන්, බර ආරම්භ කරනු ලබන්නේ සේවියර් හෝ කයිමිං මුලපිරීම් සමඟ ය. මෙම කඩදාසි පරිමාණයන් (වාසි සකසයි) ට්රාන්ස්ෆෝමර් ප්රමාණය අනුව නියත විසින් බර.

DeepNorm යෝජනා කරන්නේ Feed-Forward ජාලයේ රේඛීය පරිවර්තන දෙකෙහි බර පරිමාණය කිරීම, අගය ප්රක්ෂේපණ පරිවර්තනය කිරීම සහ ප්රතිදාන ප්රක්ෂේපණය අවධානය ස්ථරයේ පරිවර්තනය කිරීමයි. මෙම පරිවර්තනයේ බර පරිමාණය කර ඇත (සමාන වාසියක් ඇත).

පරිමාණය ක්රියාත්මක වේ

සාමාන්යකරණ කාර්යය

ට්රාන්ස්ෆෝමරයේ ගැඹුර මත රඳා පවතින නියතයක් යනු ස්ථර සාමාන්යකරණය වන අතර එය -th ට්රාන්ස්ෆෝමර් උප-ස්ථරයේ (FFN හෝ අවධානය) වේ.

මෙම ශ්රිතය පශ්චාත්-ස්ථර නියමය ප්රතිස්ථාපනය කිරීමට භාවිතා කරයි.

සහ නියතයන්

එන්කෝඩරයේ ස්ථර ගණන කොතැනද සහ විකේතකයේ ස්ථර ගණන වේ.

ව්යුත්පන්න කිරීම සඳහා කඩදාසි වෙත යොමු වන්න.

DeepNorm භාවිතා කරන අත්හදා බැලීමේ ක්රියාත්මක කිරීමක් මෙන්න.

73from typing import Union, List
74
75import torch
76from torch import nn, Size
77
78from labml_nn.normalization.layer_norm import LayerNorm
79from labml_nn.transformers import MultiHeadAttention
80from labml_nn.transformers.feed_forward import FeedForward
81from labml_nn.transformers.utils import subsequent_mask

ගැඹුරුසාමාන්යකරණය

84class DeepNorm(nn.Module):
  • alpha වේ
  • normalized_shape ස්ථර නෝම් සඳහා හැඩයයි
  • eps ස්ථර නෝම් සඳහා වේ
  • elementwise_affine LayerNorm හි මූලික පරිවර්තනයක් කළ යුතුද යන්න දැක්වෙන ධජයකි
91    def __init__(self, alpha: float, normalized_shape: Union[int, List[int], Size], *,
92                 eps: float = 1e-5,
93                 elementwise_affine: bool = True):
100        super().__init__()
101
102        self.alpha = alpha

ආරම්භකරන්න

104        self.layer_norm = LayerNorm(normalized_shape, eps=eps, elementwise_affine=elementwise_affine)
  • x පෙර ස්ථරයෙන් ප්රතිදානය වේ
  • gx වත්මන් උප ස්ථරයේ ප්රතිදානය වේ
  • 106    def forward(self, x: torch.Tensor, gx: torch.Tensor):

    112        return self.layer_norm(x + self.alpha * gx)

    ඩීප්නෝම් සමඟ ට්රාන්ස්ෆෝමර් විකේතක ස්ථරය

    මෙයDeepNorm සමඟ ට්රාන්ස්ෆෝමර් විකේතක ස්ථරයක් ක්රියාත්මක කරයි. එන්කෝඩර් ස්ථර වලට සමාන ස්වරූපයක් ඇත.

    115class DeepNormTransformerLayer(nn.Module):
    • d_model ටෝකනය කාවැද්දීමේ ප්රමාණයයි
    • self_attn ස්වයං අවධානය මොඩියුලය
    • feed_forward යනු ආහාර ඉදිරි මොඩියුලයයි
    • deep_norm_alpha DeepNorm හි සංගුණකය
    • deep_norm_beta බර ආරම්භ කිරීම පරිමාණය කිරීම සඳහා නියත වේ
    122    def __init__(self, *,
    123                 d_model: int,
    124                 self_attn: MultiHeadAttention,
    125                 feed_forward: FeedForward,
    126                 deep_norm_alpha: float,
    127                 deep_norm_beta: float,
    128                 ):
    136        super().__init__()
    137
    138        self.self_attn = self_attn
    139        self.feed_forward = feed_forward

    අවධානයෙන්පසු DeepNorms සහ ඉදිරි ජාලය පෝෂණය කරන්න

    141        self.self_attn_norm = DeepNorm(deep_norm_alpha, [d_model])
    142        self.feed_forward_norm = DeepNorm(deep_norm_alpha, [d_model])

    ආරම්භයෙන්පසු පරිමාණ බර

    145        with torch.no_grad():

    ජාලරේඛීය පරිවර්තනයන් ඉදිරියට පෝෂණය කරන්න

    147            feed_forward.layer1.weight *= deep_norm_beta
    148            feed_forward.layer2.weight *= deep_norm_beta

    අවධානයඅගය ප්රක්ෂේපනය

    151            self_attn.value.linear.weight *= deep_norm_beta

    අවධානයයොමු ප්රතිදානය ව්යාපෘතිය

    153            self_attn.output.weight *= deep_norm_beta

    පළමුඇමතුමෙන් වෙස්මුහුණ ආරම්භ කරනු ඇත

    156        self.mask = None
    • x හැඩයේ කාවැද්දීම් වේ [seq_len, batch_size, d_model]
    158    def forward(self, x: torch.Tensor):

    හේතුවෙස්මුහුණක් සාදන්න

    163        if self.mask is None or self.mask.size(0) != len(x):

    පසුකාලීනවෙස්මුහුණ, අනාගත ටෝකන දැකීමෙන් ටෝකන වසං කරනු ඇත

    165            self.mask = subsequent_mask(len(x)).to(x.device)

    ස්වයංඅවධානය හරහා ධාවනය කරන්න, i.e. යතුරු සහ වටිනාකම් ස්වයං සිට

    168        x = self.self_attn_norm(x, self.self_attn(query=x, key=x, value=x, mask=self.mask))

    Feed-forwardජාලය හරහා ගමන් කරන්න

    170        x = self.feed_forward_norm(x, self.feed_forward(x))

    173        return x