මෙය PyTorch හි දිගු පරාස අනුක්රමික ආකෘති නිර්මාණය සඳහා සම්පීඩ්යතා ට්රාන්ස්ෆෝමර් ක්රියාත්මක කිරීමයි.
මෙය ට්රාන්ස්ෆෝමර් එක්ස්එල් හි දිගුවකි, එහිදී අතීත මතකයන් දිගු අවධානයක් ලබා දීම සඳහා සම්පීඩිත වේ. එනම්, furthest මතකයන් මතකයන් බවට සම්පීඩනය කරනු ලැබේ, සම්පීඩන අනුපාතය කොහෙද .
සම්පීඩනමෙහෙයුම ලෙස අර්ථ දැක්වේ . කඩදාසි සඳහා බහු තේරීම් හඳුන්වා දෙන අතර අප ක්රියාත්මක කර ඇත්තේ 1D කැටි ගැස්ම පමණක් වන අතර එය හොඳම ප්රති. ල ලබා දෙන බව පෙනේ. සෑම ස්ථරයකම වෙනම සම්පීඩන මෙහෙයුමක් ඇත.
බීපීටීටීසමඟ සම්පීඩන පුහුණු කිරීම සඳහා ඉතා විශාල පරිගණකමය ප්රස්ථාරයක් (බොහෝ කාල පියවර) පවත්වා ගැනීම අවශ්ය වන බැවින්, කඩදාසි ස්වයංක්රීයව කේතීකරණ අලාභයක් සහ අවධානය ප්රතිනිර්මාණය කිරීමේ අලාභයක් යෝජනා කරයි. ස්වයංක්රීය කේතීකරණ අලාභය සම්පීඩිත මතකයන් වලින් මුල් මතකයන් විකේතනය කර අලාභය ගණනය කරයි. අවධානය ප්රතිනිර්මාණය අහිමි සම්පීඩිත මතකය මත සහ සම්පීඩිත නොවන මතකය මත බහු-ප්රධානත්වයෙන් අවධානය යොමු ප්රතිඵල ගණනය හා ඔවුන් අතර මධ්යන්ය වර්ග දෝෂයක් ලැබෙන. වඩා හොඳ ප්රති. ල ලබා දෙන බැවින් අපි මෙහි දෙවැන්න ක්රියාත්මක කර ඇත්තෙමු.
මෙමක්රියාත්මක කිරීම පූර්ව ස්ථර සාමාන්යකරණය භාවිතා කරන අතර කඩදාසි පශ්චාත්-ස්ථර සාමාන්යකරණය භාවිතා කරයි. පූර්ව ස්ථර සම්මතය FFN සහ ස්වයං අවධානයට පෙර ස්ථර සම්මතය සිදු කරයි, සහ අවශේෂ සම්බන්ධතාවයේ ගමන් කිරීම සාමාන්ය තත්වයට පත් නොවේ. සම්මත ට්රාන්ස්ෆෝමර් සැකසුම්වලදී මෙය වඩාත් ස්ථායී විය යුතුය.
කුඩාෂේක්ස්පියර් දත්ත කට්ටලයේ සම්පීඩ්යතා ට්රාන්ස්ෆෝමර් ආකෘතියක් පුහුණු කිරීම සඳහා පුහුණු කේතය සහ සටහන් පොතක් මෙන්න.
54from typing import Optional, List
55
56import torch
57import torch.nn.functional as F
58from torch import nn
59
60from labml_helpers.module import Module, TypedModuleList
61from labml_nn.transformers.feed_forward import FeedForward
62from labml_nn.transformers.mha import PrepareForMultiHeadAttention
63from labml_nn.transformers.xl.relative_mha import RelativeMultiHeadAttention
64from labml_nn.utils import clone_module_list67class Conv1dCompression(Module):compression_rate
d_model
කාවැද්දීම ප්රමාණය වේ75 def __init__(self, compression_rate: int, d_model: int):80 super().__init__()
81 self.conv = nn.Conv1d(d_model, d_model, kernel_size=compression_rate, stride=compression_rate) mem
හැඩය ඇත [seq_len, batch, d_model]
83 def forward(self, mem: torch.Tensor):සංවහනස්තරය හරහා එය ධාවනය කළ හැකි වන mem
පරිදි මානයන් පරිපූර්ණ කරන්න. කැටි ගැසුණු ස්තරය ස්වරූපයෙන් පිළිගනී [batch, features, sequence]
90 mem = mem.permute(1, 2, 0)සම්පීඩිතමතකය කැටි ගැසුණු ස්තරය හරහා ධාවනය කිරීමෙන් ලබා ගන්න
92 c_mem = self.conv(mem)නැවතපිහිටුවීමට අවසර දෙන්න [seq_len, batch, d_model]
94 return c_mem.permute(2, 0, 1)97class CompressiveTransformerLayer(Module):d_model
ටෝකනය කාවැද්දීමේ ප්රමාණයයි self_attn
ස්වයං අවධානය මොඩියුලය feed_forward
යනු ආහාර ඉදිරි මොඩියුලයයි dropout_prob
ස්වයං අවධානයෙන් පසු ඉවත් වීමේ සම්භාවිතාව සහ FFN compress
සම්පීඩන ශ්රිතය 103 def __init__(self, *,
104 d_model: int,
105 self_attn: RelativeMultiHeadAttention,
106 feed_forward: FeedForward,
107 dropout_prob: float,
108 compress: Conv1dCompression):116 super().__init__()
117 self.compress = compress
118 self.size = d_model
119 self.self_attn = self_attn
120 self.feed_forward = feed_forward
121 self.dropout = nn.Dropout(dropout_prob)
122 self.norm_self_attn = nn.LayerNorm([d_model])
123 self.norm_ff = nn.LayerNorm([d_model])මතකයසහ සම්පීඩිත මතකය සමඟ සාමාන්යකරණය කළ ටෝකන් කාවැද්දීම් සංයුක්ත කරන්න.
z
ස්ථර සාමාන්යකරණය කරන ලද ටෝකන් කාවැද්දීම් වේ. mem
c_mem
සහ මතකය සහ සම්පීඩිත මතකය (සාමාන්යකරණය නොවේ). 125 def concat_memory(self, z: torch.Tensor, mem: Optional[torch.Tensor], c_mem: Optional[torch.Tensor]):මතකයක්නොමැති නම් ටෝකන් කාවැද්දීම් නැවත ලබා දෙන්න
134 if mem is None:
135 return zසම්පීඩිතමතකය තිබේ නම් එය මතකය සමඟ සංයුක්ත වේ
138 if c_mem is not None:
139 mem = torch.cat((c_mem, mem), dim=0)සාමාන්යකරණස්තරය හරහා මතකය ධාවනය කරන්න
142 mem = self.norm_self_attn(mem)සාමාන්යකරණයකළ මතකය සහ සාමාන්යකරණය කළ ටෝකන් කාවැද්දීම් සංයුක්ත කරන්න
144 return torch.cat((mem, z), dim=0)x
යනු හැඩයේ ටෝකන් මට්ටමේ විශේෂාංග දෛශිකවල ආතකයකි [seq_len, batch_size, d_model]
mem
යනු අතීත ටෝකන් මට්ටමේ විශේෂාංග දෛශික (මතකය) හැඩයේ ටෙන්සරයකි [mem_len, batch_size, d_model]
c_mem
සම්පීඩිත මතකයේ ආතතියක් වේ [c_mem_len, batch_size, d_model]
mask
යනු හැඩයේ අනුකෘතියක් [seq_len, c_mem_len + mem_len + seq_len, batch_size]
හෝ [seq_len, c_mem_len + mem_len + seq_len, 1]
. mask[i, j]
ටෝකන් වලට ටෝකනය දැකිය i
හැකි නම් j
සත්යයකි. 146 def forward(self, *,
147 x: torch.Tensor,
148 mem: Optional[torch.Tensor],
149 c_mem: Optional[torch.Tensor],
150 mask: torch.Tensor):ස්වයංඅවධානය යොමු කිරීමට පෙර දෛශික සාමාන්යකරණය කරන්න
160 z = self.norm_self_attn(x)මතකයසහ සම්පීඩිත මතකය සාමාන්යකරණය කර සංයුක්ත කරන්න
162 m_z = self.concat_memory(z, mem, c_mem)අවධානය
164 self_attn = self.self_attn(query=z, key=m_z, value=m_z, mask=mask)අවධානයයොමු ප්රතිඵල එකතු කරන්න
166 x = x + self.dropout(self_attn)පෝෂණයසඳහා සාමාන්යකරණය කරන්න
169 z = self.norm_ff(x)Feed-forwardජාලය හරහා ගමන් කරන්න
171 ff = self.feed_forward(z)ප්රතිපෝෂණඉදිරි ප්රති results ල නැවත එක් කරන්න
173 x = x + self.dropout(ff)176 return x179class CompressiveTransformer(Module):186 def __init__(self, layer: CompressiveTransformerLayer, n_layers: int):
187 super().__init__()ට්රාන්ස්ෆෝමර්ස්ථරයේ පිටපත් සාදන්න
189 self.layers = clone_module_list(layer, n_layers)අවසානසාමාන්යකරණ ස්තරය
191 self.norm = nn.LayerNorm([layer.size])x
යනු හැඩයේ ටෝකන් කාවැද්දීමේ දෛශිකවල ආතකයකි [seq_len, batch_size, d_model]
mem
යනු එක් එක් ස්තරය [mem_len, batch_size, d_model]
සඳහා හැඩයේ දෛශික අතීත ටෝකන් මට්ටමේ ආතති ලැයිස්තුවකි c_mem
යනු එක් එක් ස්ථරය [c_mem_len, batch_size, d_model]
සඳහා සම්පීඩිත මතකයේ ආතති ලැයිස්තුවකි mask
ආවරණ අනුකෘතිය වේ193 def forward(self, x: torch.Tensor, mem: List[torch.Tensor], c_mem: List[torch.Tensor], mask: torch.Tensor):ටෝකන්මට්ටමේ විශේෂාංග දෛශික ගබඩා කිරීම සඳහා ලැයිස්තු ගත කරන්න, එය ඊළඟ අනුක්රමික කණ්ඩායම සඳහා මතකයන් බවට පත්වනු ඇත.
204 new_mem = []එක්එක් ට්රාන්ස්ෆෝමර් ස්ථරය හරහා ධාවනය කරන්න
206 for i, layer in enumerate(self.layers):විශේෂාංගදෛශික ලැයිස්තුවට එක් කරන්න
208 new_mem.append(x.detach())මතකය
210 m = mem[i] if mem else Noneසම්පීඩිතමතකය
212 cm = c_mem[i] if c_mem else Noneට්රාන්ස්ෆෝමර්XL ස්තරය හරහා ධාවනය කරන්න
214 x = layer(x=x, mem=m, c_mem=cm, mask=mask)අවසානවශයෙන්, දෛශික සාමාන්යකරණය කරන්න
216 return self.norm(x), new_memඅවධානයප්රතිනිර්මාණය කිරීමේ අලාභය ස්වයං අවධානය ප්රතිදානය සම්පීඩිත නොවන මතකය සමඟ සහ සම්පීඩිත මතකය සමඟ ප්රතිනිර්මාණය කරන අතර මේ දෙක අතර මධ්යන්ය කොටු දෝෂය ගණනය කරයි. ස්ථානීය කේතීකරණයකින් තොරව මෙය සිදු කරයි.
අවධානයප්රතිනිර්මාණය අහිමි සම්පීඩන කාර්යය ගණනය හා පුහුණු කරන විට, සියලු පරාමිතීන් නමුත් ශීත කළ ඇත. මෙයට යතුර/වටිනාකම් ප්රක්ෂේපණ සහ සාමාන්යකරණයෙන් පසු පක්ෂග්රාහී/පරිමාණය ඇතුළත් වේ.
මෙමඅලාභය ආකෘතියේ හරස් එන්ට්රොපිය-අලාභයෙන් ස්වාධීනව ගණනය කළ හැකි බැවින් ඔබට යාවත්කාලීන කිරීම් පමණක් වෙනම ප්රශස්තිකරණයක් තිබිය හැකිය . කෙසේ වෙතත්, අපි යාවත්කාලීන කිරීමට එම ප්රශස්තකරණය භාවිතා අවධානය ප්රතිසංස්කරණය අහිමි ගණනය කිරීමේදී එසේ, අපි ඵලය අනුක්රමික ගණනය සිට හැර අනෙකුත් සියලු පරාමිතීන් වෙන්.
219class AttentionReconstructionLoss: layers
සම්පීඩ්යතා ට්රාන්ස්ෆෝමර් ස්ථර ලැයිස්තුවයි
237 def __init__(self, layers: TypedModuleList[CompressiveTransformerLayer]):241 self.layers = layers
242 self.loss_func = nn.MSELoss()මෙයනැවත ක්රියාත්මක කිරීමකි 'සූදානම් කිරීමේ සූත්රයඅවධානය යොමු කිරීම' ප්රක්ෂේපණ ශ්රේණියේ ගණනය කිරීම් වලින් වෙන් කර ඇති පරාමිතීන් සමඟ සිදු කරනු ලැබේ.
pmha
යනු 'සූදානම් කිරීමේ සූත්රයහෙඩ්අවධානය යොමු කිරීම' මොඩියුලය x
ටෝකන් කාවැද්දීම් සමඟ ආතතියෙන් යුක්ත වේ244 def prepare_for_attn(self, pmha: PrepareForMultiHeadAttention, x: torch.Tensor):කාවැද්දීමමානයක් හැර ආදාන හැඩය; [seq_len, batch_size]
.
254 head_shape = x.shape[:-1]ප්රක්ෂේපණබර සහ නැඹුරුව වෙන් කරන්න
257 weight = pmha.linear.weight.detach()
258 bias = pmha.linear.bias.detach() if pmha.linear.bias is not None else Noneරේඛීයපරිණාමනය
260 x = F.linear(x, weight, bias)අවසානමානය හිස් බවට බෙදන්න
263 x = x.view(*head_shape, pmha.heads, pmha.d_k)නිමැවුමේහැඩය [seq_len, batch_size, heads, d_k]
හෝ [batch_size, d_model]
266 return x මෙයප්රක්ෂේපණ පරාමිතීන් වෙන් කිරීම සඳහා 'සූදානම් කිරීමේ සූත්රයහෙඩ්අවධානය prepare_for_attn
වෙනුවට කැඳවන 'බහු-ප්රධාන අවධානය' නැවත ක්රියාත්මක කිරීමකි.
268 def attn(self, layer: RelativeMultiHeadAttention, query: torch.Tensor, key: torch.Tensor, value: torch.Tensor):විමසුමගණනය කරන්න, යතුර සහ අගය ප්රක්ෂේපණ
275 query = self.prepare_for_attn(layer.query, query)
276 key = self.prepare_for_attn(layer.key, key)
277 value = self.prepare_for_attn(layer.value, value)අවධානයලකුණු ගණනය කරන්න . මෙය හැඩයේ ආතතිකයක් ලබා දෙයි [seq_len, seq_len, batch_size, heads]
.
281 scores = torch.einsum('ibhd,jbhd->ijbh', query, key)පරිමාණලකුණු
284 scores *= layer.scaleප්රධාන අනුක්රමය මානයක් ඔස්සේ අවධානය
288 attn = layer.softmax(scores)අගයන්අනුව ගුණ කරන්න
292 return torch.einsum("ijbh,jbhd->ibhd", attn, value)වෙන්කරන ලද මාරුව සහ පරිමාණ පරාමිතීන් සමඟ ස්ථර සාමාන්යකරණය සිදු කරන්න.
294 def norm(self, ln: nn.LayerNorm, x: torch.Tensor):වෙන්මාරුව (bias
) සහ පරිමාණය (weight
) පරාමිතීන්
300 weight = ln.weight.detach() if ln.weight is not None else None
301 bias = ln.bias.detach() if ln.bias is not None else Noneස්ථරයසාමාන්යකරණය
304 return F.layer_norm(x, ln.normalized_shape, weight, bias, ln.eps)මෙයස්ථරයක් සඳහා අලාභය ගණනය කරයි
306 def calc_loss(self, layer: CompressiveTransformerLayer, h: torch.Tensor, mem: torch.Tensor):ටෝකන්කාවැද්දීම් සහ මතකය වෙන් කරන්න.
312 h = h.detach()
313 mem = mem.detach()සමඟමතකය සංකෝචනය කරන්න . හි පරාමිතීන් යනු ශ්රේණියේ ගණනය කිරීම් වලින් වෙන් කර නොමැති එකම පරාමිතීන් වේ.
317 c_mem = layer.compress(mem)කාවැද්දීම්සහ මතකයන් සාමාන්යකරණය කරන්න
320 h = self.norm(layer.norm_self_attn, h)
321 mem = self.norm(layer.norm_self_attn, mem)
322 c_mem = self.norm(layer.norm_self_attn, c_mem)සම්පීඩිතනොවන මතකය සමඟ අවධානය ගණනය කරන්න
325 attn_mem = self.attn(layer.self_attn, h, mem, mem)සම්පීඩිතමතකය සමඟ අවධානය ගණනය කරන්න
327 attn_cmem = self.attn(layer.self_attn, h, c_mem, c_mem)මධ්යන්යවර්ග දෝෂය ගණනය කරන්න
330 return self.loss_func(attn_cmem, attn_mem)332 def __call__(self, h: List[torch.Tensor], mem: List[torch.Tensor]):එක්එක් ස්ථරය සඳහා පාඩු ගණනය කරන්න
334 losses = [self.calc_loss(layer, h[n], mem[n]) for n, layer in enumerate(self.layers)]අලාභවලඑකතුව
336 return sum(losses)