class_docstr: Implement of large margin arc distance with intertopk and subcenter:
  Reference:
      MULTI-QUERY MULTI-HEAD ATTENTION POOLING AND INTER-TOPK PENALTY
      FOR SPEAKER VERIFICATION.
      https://arxiv.org/pdf/2110.05042.pdf
      Sub-center ArcFace: Boosting Face Recognition by
      Large-Scale Noisy Web Faces.
      https://ibug.doc.ic.ac.uk/media/uploads/documents/eccv_1445.pdf
  Args:
      in_features: size of each input sample
      out_features: size of each output sample
      scale: norm of input feature
      margin: margin
      cos(theta + margin)
      K: number of sub-centers
      k_top: number of hard samples
      mp: margin penalty of hard samples
      do_lm: whether do large margin finetune
code: def forward(self, input, label):
      if len(label.size()) == 2:
          label = label.squeeze(1)
      cosine = F.linear(
          F.normalize(input), F.normalize(self.weight)
      )  # (batch, out_dim * k)
      cosine = torch.reshape(
          cosine, (-1, self.out_features, self.K)
      )  # (batch, out_dim, k)
      cosine, _ = torch.max(cosine, 2)  # (batch, out_dim)
  
      sine = torch.sqrt(1.0 - torch.pow(cosine, 2))
      phi = cosine * self.cos_m - sine * self.sin_m
      phi_mp = cosine * self.cos_mp + sine * self.sin_mp
  
      if self.easy_margin:
          phi = torch.where(cosine > 0, phi, cosine)
      else:
          ########
          # phi = torch.where(cosine > self.th, phi, cosine - self.mm)
          phi = torch.where(cosine > self.th, phi, cosine - self.mmm)
          ########
  
      one_hot = torch.zeros_like(cosine)
      one_hot.scatter_(1, label.view(-1, 1), 1)
  
      if self.k_top > 0:
          # topk (j != y_i)
          _, top_k_index = torch.topk(
              cosine - 2 * one_hot, self.k_top
          )  # exclude j = y_i
          top_k_one_hot = input.new_zeros(cosine.size()).scatter_(
              1, top_k_index, 1
          )
  
          # sum
          output = (
              (one_hot * phi)
              + (top_k_one_hot * phi_mp)
              + ((1.0 - one_hot - top_k_one_hot) * cosine)
          )
      else:
          output = (one_hot * phi) + ((1.0 - one_hot) * cosine)
      output *= self.scale
  
      loss = self.ce(output, label)
      return loss
  
file_path: espnet/espnet2/spk/loss/aamsoftmax_subcenter_intertopk.py
imports: import math
  import torch
  import torch.nn
  import torch.nn.functional
  from espnet2.spk.loss.abs_loss import AbsLoss
label_desc: Use image node_id 3 for calling the ArcMarginProduct_intertopk_subcenter obj's underlying member method code with example usage: obj.forward(input, label) and returns: loss