මෙය PyTorch කඩදාසි ක්රියාත්මක කිරීම MLPs වෙත අවධානය යොමු කරන්න .
මෙමලිපිය බහු ස්ථර පර්සෙප්ට්රෝන් (එම්එල්පී) පදනම් කරගත් ගෘහ නිර්මාණ ශිල්පයක් ගේටින් සමඟ හඳුන්වා දෙන අතර ඒවා ජීඑම්එල්පීලෙස නම් කරයි. එය GMLP කුට්ටි තොගයකින් සමන්විත වේ.
GMLPආකෘතිය මත පදනම් වූ ස්වයංක්රීය ප්රතිගාමී ආකෘතියක් සඳහා පුහුණු කේතය මෙන්න.
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_modelx
හැඩයේ ආදාන කාවැද්දීම වේ [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 * mask156 z2 = torch.einsum('ij,jbd->ibd', weight, z2) + self.bias[:seq_len, None, None]159 return z1 * z2