code: def training_step(self, batch, batch_idx):
      utils.update_momentum(self.anchor_backbone, self.backbone, 0.996)
      utils.update_momentum(
          self.anchor_projection_head, self.projection_head, 0.996
      )
  
      views = batch[0]
      views = [
          view.to(self.device, non_blocking=True) for view in views
      ]
      targets = views[0]
      anchors = views[1]
      anchors_focal = torch.concat(views[2:], dim=0)
  
      targets_out = self.backbone(targets)
      targets_out = self.projection_head(targets_out)
      anchors_out = self.encode_masked(anchors)
      anchors_focal_out = self.encode_masked(anchors_focal)
      anchors_out = torch.cat([anchors_out, anchors_focal_out], dim=0)
  
      loss = self.criterion(
          anchors_out, targets_out, self.prototypes.data
      )
      return loss
  
file_path: lightly/examples/pytorch_lightning/pmsn.py
imports: import copy
  import pytorch_lightning
  import torch
  import torchvision
  from torch import nn
  from lightly.loss import PMSNLoss
  from lightly.models import utils
  from lightly.models.modules.heads import MSNProjectionHead
  from lightly.models.modules.masked_autoencoder import MAEBackbone
  from lightly.transforms import MSNTransform
label_desc: Use image node_id 2 for calling the PMSN obj's underlying member method code with example usage: obj.training_step(batch, batch_idx) and returns: loss