MLPs(GMLP) වෙත අවධානය යොමු කරන්න

මෙය PyTorch කඩදාසි ක්රියාත්මක කිරීම MLPs වෙත අවධානය යොමු කරන්න .

මෙමලිපිය බහු ස්ථර පර්සෙප්ට්රෝන් (එම්එල්පී) පදනම් කරගත් ගෘහ නිර්මාණ ශිල්පයක් ගේටින් සමඟ හඳුන්වා දෙන අතර ඒවා ජීඑම්එල්පීලෙස නම් කරයි. එය GMLP කුට්ටි තොගයකින් සමන්විත වේ.

GMLPආකෘතිය මත පදනම් වූ ස්වයංක්රීය ප්රතිගාමී ආකෘතියක් සඳහා පුහුණු කේතය මෙන්න.

View Run

21from typing import Optional
22
23import torch
24from torch import nn

ජීඑම්එල්පීබ්ලොක්

සෑමබ්ලොක් එකක්ම ආදාන කාවැද්දීම් සඳහා පහත දැක්වෙන පරිවර්තනයන් සිදු කරයි අනුක්රමික දිග සහ කාවැද්දීම් වල මානයන් වේ:

ඉගෙන ගත හැකි ප්රක්ෂේපණ බර කොහේද සහ ඇත. පහත අර්ථ දක්වා ඇති අභ්යවකාශ ගේටින් ඒකකය වේ. නිමැවුම් මානයන් අඩක් වනු ඇත . GeLuවැනි සක්රිය කිරීමේ කාර්යයකි.

27class GMLPBlock(nn.Module):
  • d_model යනු මානයන් ()
  • d_ffn හි මානයන් වේ
  • seq_len ටෝකන් අනුක්රමයේ දිග ()
48    def __init__(self, d_model: int, d_ffn: int, seq_len: int):
54        super().__init__()

පෙර-වැඩෙන්නේසිට සාමාන්යකරණය ස්ථරය

56        self.norm = nn.LayerNorm([d_model])

සක්රියකිරීමේ කාර්යය

58        self.activation = nn.GELU()

සඳහාප්රක්ෂේපනය ස්ථරය

60        self.proj1 = nn.Linear(d_model, d_ffn)

අභ්යවකාශගේටින් ඒකකය

62        self.sgu = SpacialGatingUnit(d_ffn, seq_len)

සඳහාප්රක්ෂේපනය ස්ථරය

64        self.proj2 = nn.Linear(d_ffn // 2, d_model)

කාවැද්දීමේප්රමාණය ( එන්කෝඩරයඅවශ්ය වේ. අපි ට්රාන්ස්ෆෝමර් ගෘහ නිර්මාණ ශිල්පයෙන් එන්කෝඩර් මොඩියුලය භාවිතා කරන අතර ට්රාන්ස්ෆෝමර් ස්ථරයවෙනුවට ආදේශකයක් ලෙස ජීඑම්එල්පී බ්ලොක් ප්ලග් කරමු.

68        self.size = d_model
  • x හැඩයේ ආදාන කාවැද්දීම වේ [seq_len, batch_size, d_model]
  • mask යනු එකිනෙකා අතර ටෝකන වල දෘශ්යතාව පාලනය [seq_len, seq_len, 1] කරන හැඩයේ බූලියන් වෙස් මුහුණකි.
70    def forward(self, *, x: torch.Tensor, mask: Optional[torch.Tensor] = None):

කෙටිමංසම්බන්ධතාවය සඳහා පිටපතක් තබා ගන්න

77        shortcut = x

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

79        x = self.norm(x)

ප්රක්ෂේපණයසහ සක්රිය කිරීම

81        z = self.activation(self.proj1(x))

අභ්යවකාශගේටින් ඒකකය

83        z = self.sgu(z, mask)

අවසානප්රක්ෂේපණය

85        z = self.proj2(z)

කෙටිමංසම්බන්ධතාවය එක් කරන්න

88        return z + shortcut

අවකාශීයගේටින් ඒකකය

අනුක්රමිකමානය ඔස්සේ රේඛීය පරිවර්තනයක් වන අතර එය මූලද්රව්ය අනුව ගුණ කිරීමකි. සමාන ප්රමාණයේ කොටස් වලට සහ නාලිකා මානය ඔස්සේ (කාවැද්දීමේ මානය) බෙදා ඇත.

91class SpacialGatingUnit(nn.Module):
  • d_z හි මානයන් වේ
  • seq_len අනුක්රමය දිග වේ
101    def __init__(self, d_z: int, seq_len: int):
106        super().__init__()

අයදුම්කිරීමට පෙර සාමාන්යකරණය ස්ථරය

108        self.norm = nn.LayerNorm([d_z // 2])

සිරුරේ බර .

කුඩාඅගයන් හා නැඹුරුව සඳහා බර ආරම්භ කිරීම වැදගත් බව කඩදාසි සටහන් කරයි , එවිට මූලික පුහුණුව තුළ අනන්යතාවයට සමීප වේ (භේදය හැරුණු විට).

113        self.weight = nn.Parameter(torch.zeros(seq_len, seq_len).uniform_(-0.01, 0.01), requires_grad=True)

සිරුරේබර

පක්ෂග්රාහීවආරම්භ කිරීම වැදගත් බව කඩදාසි සටහන් කරයි.

117        self.bias = nn.Parameter(torch.ones(seq_len), requires_grad=True)
  • z හැඩයේ ආදානය වේ [seq_len, batch_size, d_z]
  • mask යනු එකිනෙකා අතර ටෝකන වල දෘශ්යතාව පාලනය [seq_len, seq_len, 1] කරන හැඩයේ බූලියන් වෙස් මුහුණකි. ප්රමාණයේ අවසාන මානය 1 වන්නේ වෙනත් ට්රාන්ස්ෆෝමර් ක්රියාත්මක කිරීම් වලදී අප සතුව ඇති අතර අනුකූලතාව සඳහා ඉතිරිව ඇති කණ්ඩායමයි.
119    def forward(self, z: torch.Tensor, mask: Optional[torch.Tensor] = None):

අනුක්රමිකදිග ලබා ගන්න

128        seq_len = z.shape[0]

බෙදන්න සහ

130        z1, z2 = torch.chunk(z, 2, dim=-1)

ආවරණපරීක්ෂා කරන්න

133        if mask is not None:

mask හැඩය ඇත [seq_len_q, seq_len_k, batch_size] . මෙම ක්රියාත්මක කිරීම කණ්ඩායමේ සියලුම සාම්පල සඳහා එකම වෙස් මුහුණක් පමණක් සහාය වන 1 බැවින් කණ්ඩායම් මානය ප්රමාණයෙන් යුක්ත විය යුතුය.

137            assert mask.shape[0] == 1 or mask.shape[0] == seq_len
138            assert mask.shape[1] == seq_len

මෙන්නඅපි සහාය දෙන්නේ සියලුම සාම්පල සඳහා එකම වෙස් මුහුණක් පමණි

140            assert mask.shape[2] == 1

කණ්ඩායම්මානය ඉවත් කරන්න

142            mask = mask[:, :, 0]

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

145        z2 = self.norm(z2)

බරඅනුකෘතිය ලබා ගන්න; වඩා විශාල නම් ට්රන්කේට් කරන්න seq_len

147        weight = self.weight[:seq_len, :seq_len]

පඩිසඳහා ආවරණ යොදන්න.

එසේ නම් ටෝකනයෙන් කිසිදු තොරතුරක් ලබා නොගනී.

152        if mask is not None:
153            weight = weight * mask

156        z2 = torch.einsum('ij,jbd->ibd', weight, z2) + self.bias[:seq_len, None, None]

159        return z1 * z2