ප්රයිමර් EZ විචලනයන්

ප්රයිමර්EZ හි වෙනස්කම් මොනවාද යන්න බැලීමට අපි යම් වෙනස්කම් කිහිපයක් උත්සාහ කළෙමු.

12import torch
13from torch import nn
14
15from labml_helpers.module import Module
16from labml_nn.transformers import MultiHeadAttention

අවකාශීයගැඹුර නැණවත් හවුල් සම්මුතිය

අපිඑකම කර්නලය සියලුම නාලිකා හරහා බෙදා ගනිමු.

19class SpatialDepthWiseSharedConvolution(Module):
26    def __init__(self, kernel_size: int = 3):
27        super().__init__()
28        self.kernel_size = kernel_size

අපිපයිටෝර්ච් Conv1d මොඩියුලය භාවිතා කරමු. අපි දෙපැත්තටම පුරවන එකතු කර පසුව නිවැරදි වඩාත්ම kernel_size - 1 ප්රති

. ල ලබා ගනිමු
33        self.conv = nn.Conv1d(in_channels=1, out_channels=1, kernel_size=(kernel_size,), padding=(kernel_size - 1,))

x හැඩය ඇත [seq_len, batch_size, heads, d_k]

35    def forward(self, x: torch.Tensor):

හැඩයලබා ගන්න

41        seq_len, batch_size, heads, d_k = x.shape

කිරීමටඅවසර [batch_size, heads, d_k, seq_len]

43        x = x.permute(1, 2, 3, 0)

හැඩයවෙනස් කරන්න [batch_size * heads * d_k, seq_len]

45        x = x.view(batch_size * heads * d_k, 1, seq_len)

1Dකැටි ගැසුමේ ආකෘතියේ ආදානය පිළිගනී [N, channels, sequence]

48        x = self.conv(x)

අපිදෙපැත්තෙන්ම ආවරණයකින් සමන්විත බැවින් නිවැරදි වඩාත්ම kernel_size - 1 ප්රති results ල බෝග කරන්න

50        x = x[:, :, :-(self.kernel_size - 1)]

නැවතහැඩගස්වන්න [batch_size, heads, d_k, seq_len]

52        x = x.view(batch_size, heads, d_k, seq_len)

කිරීමටඅවසර [seq_len, batch_size, heads, d_k]

54        x = x.permute(3, 0, 1, 2)

57        return x

බහු-ගැඹුරු-ප්රඥාව-බෙදා-COV-හිසඅවධානය

අපි බහු-ප්රධාන අවධානය අපගේ මුල් ක්රියාත්මක කිරීම දීර් extend කරන අතර විමසුම, යතුර සහ වටිනාකම් ප්රක්ෂේපණ සඳහා අවකාශීය ගැඹුරට හවුල් හවුල් සම්මුතියක් එක් කරමු.

60class MultiDSharedConvHeadAttention(MultiHeadAttention):
68    def __init__(self, heads: int, d_model: int, dropout_prob: float = 0.1):
69        super().__init__(heads, d_model, dropout_prob)

බහු-ප්රධාන අවධානය විමසුම නිර්මාණය කරනු ඇත, ප්රධාන සහ අගය ප්රක්ෂේපනය මොඩියුල self.query self.key , සහ self.value .

අපිඔවුන් එක් එක් අවකාශීය ගැඹුර-නැණවත් හවුල් convolution ස්ථරය ඒකාබද්ධ හා වෙනුවට self.query self.key , සහ self.value .

76        self.query = nn.Sequential(self.query, SpatialDepthWiseSharedConvolution())
77        self.key = nn.Sequential(self.key, SpatialDepthWiseSharedConvolution())
78        self.value = nn.Sequential(self.value, SpatialDepthWiseSharedConvolution())

හිසසංකෝචනය සඳහා අවකාශීය ගැඹුර නැණවත්

81class SpatialDepthWisePerHeadConvolution(Module):
  • heads හිස් සංඛ්යාව වේ
  • d_k එක් එක් හිසෙහි නාලිකා ගණන වේ
86    def __init__(self, heads: int, d_k: int, kernel_size: int = 3):
91        super().__init__()
92        self.kernel_size = kernel_size

අපිපයිටෝර්ච් Conv1d මොඩියුලය භාවිතා කරමු. එක් එක් නාලිකාව සහ හිස සඳහා වෙනම සංවහනයක් (විවිධ කර්නල් සමඟ) සිදු වන පරිදි එක් එක් හිසෙන් නාලිකා ගණනට සමාන වන පරිදි අපි කණ්ඩායම් ගණන සකස් කරමු. අපි දෙපැත්තටම පුරවන එකතු කර පසුව නිවැරදි වඩාත්ම kernel_size - 1 ප්රති

. ල ලබා ගනිමු
98        self.conv = nn.Conv1d(in_channels=d_k * heads, out_channels=d_k * heads,
99                              kernel_size=(kernel_size,), padding=(kernel_size - 1,), groups=d_k * heads)

x හැඩය ඇත [seq_len, batch_size, heads, d_k]

101    def forward(self, x: torch.Tensor):

හැඩයලබා ගන්න

107        seq_len, batch_size, heads, d_k = x.shape

කිරීමටඅවසර [batch_size, heads, d_k, seq_len]

109        x = x.permute(1, 2, 3, 0)

හැඩයවෙනස් කරන්න [batch_size heads * d_k, seq_len]

111        x = x.view(batch_size, heads * d_k, seq_len)

1Dකැටි ගැසුමේ ආකෘතියේ ආදානය පිළිගනී [N, channels, sequence]

114        x = self.conv(x)

අපිදෙපැත්තෙන්ම ආවරණයකින් සමන්විත බැවින් නිවැරදි වඩාත්ම kernel_size - 1 ප්රති results ල බෝග කරන්න

116        x = x[:, :, :-(self.kernel_size - 1)]

නැවතහැඩගස්වන්න [batch_size, heads, d_k, seq_len]

118        x = x.view(batch_size, heads, d_k, seq_len)

කිරීමටඅවසර [seq_len, batch_size, heads, d_k]

120        x = x.permute(3, 0, 1, 2)

123        return x

බහු-per-හිසගැඹුරු-ප්රඥාව-කේතු-හිස අවධානය

අපි බහු-ප්රධාන අවධානය අපගේ මුල් ක්රියාත්මක කිරීම දීර් and කරන අතර විමසුම, යතුර සහ වටිනාකම් ප්රක්ෂේපණ සඳහා අවකාශීය ගැඹුර-නැණවත් සම්මුතිය එක් කරමු.

126class MultiDPHConvHeadAttention(MultiHeadAttention):
134    def __init__(self, heads: int, d_model: int, dropout_prob: float = 0.1):
135        super().__init__(heads, d_model, dropout_prob)

බහු-ප්රධාන අවධානය විමසුම නිර්මාණය කරනු ඇත, ප්රධාන සහ අගය ප්රක්ෂේපනය මොඩියුල self.query self.key , සහ self.value .

අපිඑක් එක් ඒවාට අවකාශීය එක්-හිස ගැඹුර-නැණවත් කැටි ගැසුණු ස්ථරයක් ඒකාබද්ධ කර ප්රතිස්ථාපනය කරමු self.query self.key , සහ self.value .

142        self.query = nn.Sequential(self.query, SpatialDepthWisePerHeadConvolution(heads, self.d_k))
143        self.key = nn.Sequential(self.key, SpatialDepthWisePerHeadConvolution(heads, self.d_k))
144        self.value = nn.Sequential(self.value, SpatialDepthWisePerHeadConvolution(heads, self.d_k))