docstr: Backward function.
  
  Pseudo-code:
  
  .. code:: python
  
      g, out = ctx.backward_cache
      grad_out = dgl.EData(g, grad_out)
      out = dgl.EData(g, out)
      sds = out * grad_out  # type dgl.EData
      sds_sum = sds.dst_sum()  # type dgl.NData
      grad_score = sds - sds * sds_sum  # multiple expressions
code: def backward(self, grad_out):
      """Backward function.
  
      Pseudo-code:
  
      .. code:: python
  
          g, out = ctx.backward_cache
          grad_out = dgl.EData(g, grad_out)
          out = dgl.EData(g, out)
          sds = out * grad_out  # type dgl.EData
          sds_sum = sds.dst_sum()  # type dgl.NData
          grad_score = sds - sds * sds_sum  # multiple expressions
      """
      (out,) = self.saved_tensors
      gidx = self.gidx
      sds = out * grad_out
      accum = gspmm(gidx, "copy_rhs", "sum", None, sds)
      grad_score = sds - gsddmm(gidx, "mul", out, accum, "e", "v")
      self.save_tensors = None
      return grad_score
  
imports: import mxnet
  import numpy
  from mxnet import nd
  from ..._sparse_ops import _bwd_segment_cmp, _csrmask, _csrmm, _csrsum, _gsddmm, _gspmm, _scatter_add, _segment_reduce
  from ...base import ALL, dgl_warning, is_all
  from ...heterograph_index import create_unitgraph_from_csr
  from .tensor import asnumpy, context, copy_to, to_backend_ctx, zerocopy_from_numpy
label_desc: Use image node_id 3 for calling the EdgeSoftmax obj's underlying member method code with example usage: obj.backward(grad_out) and returns: grad_score