class_docstr: Sparse Multi-head Attention Module
class_docstr_tok: ["Sparse","Multi-head","Attention","Module"]
code: def __init__(self, hidden_size=80, num_heads=8):
      super().__init__()
      self.hidden_size = hidden_size
      self.num_heads = num_heads
      self.head_dim = hidden_size // num_heads
      self.scaling = self.head_dim**-0.5
  
      self.q_proj = nn.Linear(hidden_size, hidden_size)
      self.k_proj = nn.Linear(hidden_size, hidden_size)
      self.v_proj = nn.Linear(hidden_size, hidden_size)
      self.out_proj = nn.Linear(hidden_size, hidden_size)
  
imports: import dgl
  import dgl.nn
  import dgl.sparse
  import torch
  import torch.nn
  import torch.nn.functional
  import torch.optim
  from dgl.data import AsGraphPredDataset
  from dgl.dataloading import GraphDataLoader
  from ogb.graphproppred import collate_dgl, DglGraphPropPredDataset, Evaluator
  from ogb.graphproppred.mol_encoder import AtomEncoder
  from tqdm import tqdm
label_desc: Use image node_id 1 to create a new SparseMHA object from inherited base classes: nn with example: obj = SparseMHA(hidden_size, num_heads)