class_docstr: siamese neural network using Kernel Point
  Convolution to learn descriptors on patch(for registration).
docstr: Calculate losses, gradients, and update network weights; called in every training iteration
code: def backward(self):
      """Calculate losses, gradients, and update network weights; called in every training iteration"""
      # caculate the intermediate results if necessary; here self.output has been computed during function <forward>
      # calculate loss given the input and intermediate results
      if hasattr(self, "loss"):
          self.loss.backward()
  
imports: from typing import Any
  import torch
  import torch.nn.functional
  from torch.nn import Linear
  from torch.nn import Sequential
  from torch_geometric.data import Data
  from torch_geometric.nn import global_mean_pool
  import logging
  from torch_points3d.core.losses import *
  from torch_points3d.core.common_modules import MLP
  from torch_points3d.core.common_modules import FastBatchNorm1d
  from torch_points3d.core.base_conv.partial_dense import *
  from torch_points3d.models.registration.base import FragmentBaseModel
  from torch_points3d.models.base_architectures import BackboneBasedModel
  from torch_points3d.models.registration.base import create_batch_siamese
  from torch_points3d.models.base_model import BaseModel
  from torch_points3d.models.base_architectures.unet import UnwrappedUnetBasedModel
  from torch_points3d.modules.KPConv import *
  from torch_points3d.datasets.registration.pair import PairMultiScaleBatch
label_desc: Use image node_id 7 for calling the PatchKPConv obj's underlying member method code with example usage: obj.backward() without return types