1import math
2
3import torch
4from torch import nn
5
6from labml_helpers.module import Module
7from labml_nn.transformers import MultiHeadAttention

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

මෙයඇත්ත වශයෙන්ම මන්දගාමී ය

10class SpatialDepthWiseConvolution(Module):
  • d_k එක් එක් හිසෙහි නාලිකා ගණන වේ
17    def __init__(self, d_k: int, kernel_size: int = 3):
21        super().__init__()
22        self.kernel_size = kernel_size

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

. ල ලබා ගනිමු
27        rng = 1 / math.sqrt(kernel_size)
28        self.kernels = nn.Parameter(torch.zeros((kernel_size, d_k)).uniform_(-rng, rng))

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

30    def forward(self, x: torch.Tensor):
35        res = x * self.kernels[0].view(1, 1, 1, -1)
36
37        for i in range(1, len(self.kernels)):
38            res[i:] += x[:-i] * self.kernels[i].view(1, 1, 1, -1)
39
40        return res

බහු-Dconv-හිසඅවධානය (MDHA)

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

43class MultiDConvHeadAttention(MultiHeadAttention):
51    def __init__(self, heads: int, d_model: int, dropout_prob: float = 0.1):
52        super().__init__(heads, d_model, dropout_prob)

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

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

59        self.query = nn.Sequential(self.query, SpatialDepthWiseConvolution(self.d_k))
60        self.key = nn.Sequential(self.key, SpatialDepthWiseConvolution(self.d_k))
61        self.value = nn.Sequential(self.value, SpatialDepthWiseConvolution(self.d_k))