ප්රයිමර්EZ හි වෙනස්කම් මොනවාද යන්න බැලීමට අපි යම් වෙනස්කම් කිහිපයක් උත්සාහ කළෙමු.
12import torch
13from torch import nn
14
15from labml_helpers.module import Module
16from labml_nn.transformers import MultiHeadAttention19class 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අපි බහු-ප්රධාන අවධානය අපගේ මුල් ක්රියාත්මක කිරීම දීර් 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අපි බහු-ප්රධාන අවධානය අපගේ මුල් ක්රියාත්මක කිරීම දීර් 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))