සම්පීඩ්යතාට්රාන්ස්ෆෝමර්

මෙය PyTorch හි දිගු පරාස අනුක්රමික ආකෘති නිර්මාණය සඳහා සම්පීඩ්යතා ට්රාන්ස්ෆෝමර් ක්රියාත්මක කිරීමයි.

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

සම්පීඩනමෙහෙයුම

සම්පීඩනමෙහෙයුම ලෙස අර්ථ දැක්වේ . කඩදාසි සඳහා බහු තේරීම් හඳුන්වා දෙන අතර අප ක්රියාත්මක කර ඇත්තේ 1D කැටි ගැස්ම පමණක් වන අතර එය හොඳම ප්රති. ල ලබා දෙන බව පෙනේ. සෑම ස්ථරයකම වෙනම සම්පීඩන මෙහෙයුමක් ඇත.

සම්පීඩනමෙහෙයුම පුහුණු කිරීම

බීපීටීටීසමඟ සම්පීඩන පුහුණු කිරීම සඳහා ඉතා විශාල පරිගණකමය ප්රස්ථාරයක් (බොහෝ කාල පියවර) පවත්වා ගැනීම අවශ්ය වන බැවින්, කඩදාසි ස්වයංක්රීයව කේතීකරණ අලාභයක් සහ අවධානය ප්රතිනිර්මාණය කිරීමේ අලාභයක් යෝජනා කරයි. ස්වයංක්රීය කේතීකරණ අලාභය සම්පීඩිත මතකයන් වලින් මුල් මතකයන් විකේතනය කර අලාභය ගණනය කරයි. අවධානය ප්රතිනිර්මාණය අහිමි සම්පීඩිත මතකය මත සහ සම්පීඩිත නොවන මතකය මත බහු-ප්රධානත්වයෙන් අවධානය යොමු ප්රතිඵල ගණනය හා ඔවුන් අතර මධ්යන්ය වර්ග දෝෂයක් ලැබෙන. වඩා හොඳ ප්රති. ල ලබා දෙන බැවින් අපි මෙහි දෙවැන්න ක්රියාත්මක කර ඇත්තෙමු.

මෙමක්රියාත්මක කිරීම පූර්ව ස්ථර සාමාන්යකරණය භාවිතා කරන අතර කඩදාසි පශ්චාත්-ස්ථර සාමාන්යකරණය භාවිතා කරයි. පූර්ව ස්ථර සම්මතය FFN සහ ස්වයං අවධානයට පෙර ස්ථර සම්මතය සිදු කරයි, සහ අවශේෂ සම්බන්ධතාවයේ ගමන් කිරීම සාමාන්ය තත්වයට පත් නොවේ. සම්මත ට්රාන්ස්ෆෝමර් සැකසුම්වලදී මෙය වඩාත් ස්ථායී විය යුතුය.

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

Open In Colab View Run

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_list

1Dසම්මුති සම්පීඩනය

මෙයසමහර tensor මානයක් permutations nn.Conv1d සමග පමණ සරල දවටනය වේ.

67class 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):
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 x

සම්පීඩ්යතා ට්රාන්ස්ෆෝමර් ආකෘතිය

මෙයබහු සම්පීඩ්යතා ට්රාන්ස්ෆෝමර් ස්ථර වලින් සමන්විත වේ

179class 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()

මෙයනැවත ක්රියාත්මක කිරීමකි 'සූදානම් කිරීමේ සූත්රයඅවධානය යොමු කිරීම' ප්රක්ෂේපණ ශ්රේණියේ ගණනය කිරීම් වලින් වෙන් කර ඇති පරාමිතීන් සමඟ සිදු කරනු ලැබේ.

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)