code: def backward(self, indexes, grad_outputs):
      y, gy = self.get_retained_inputs()
      (ggx,) = grad_outputs
      gs = chainer.functions.sum(ggx * y, axis=self.axis, keepdims=True)
      ga = ggx - chainer.functions.broadcast_to(gs, gy.shape)
      ret = []
      if 0 in indexes:
          s = chainer.functions.broadcast_to(
              chainer.functions.sum(
                  y * gy, axis=self.axis, keepdims=True
              ),
              gy.shape,
          )
          gy2 = ga * gy - ggx * s
          ret.append(gy2)
      if 1 in indexes:
          ggy = ga * y
          ret.append(ggy)
      return tuple(ret)
  
file_path: chainer/chainer/functions/activation/softmax.py
imports: import chainer
  from chainer import backend
  from chainer.backends import cuda
  from chainer import function_node
  import chainer.functions
  from chainer.utils import type_check
label_desc: Use image node_id 3 for calling the _SoftmaxGrad obj's underlying member method code with example usage: obj.backward(indexes, grad_outputs) and returns: tuple