code: @Override
      public void backward() {
          Tensor x = modInX.getOutput();
          Tensor w = modInW.getOutput();
          {
              Tensor tmp = new Tensor(yAdj); // copy
              tmp.elemDivide(w);
              correctForZeros(tmp);
              modInX.getOutputAdj().elemAdd(tmp);
          }
          {
              Tensor tmp = new Tensor(w); // copy
              tmp.fill(s.one());
              tmp.elemDivide(w);
              tmp.elemDivide(w);
              tmp.multiply(s.fromReal(-1));
              tmp.elemMultiply(yAdj);
              tmp.elemMultiply(x); 
              correctForZeros(tmp);
              modInW.getOutputAdj().elemAdd(tmp);
          }
      }
docs: Backward pass:
  dG/dx_i += dG/dy_i dy_i/dx_i = dG/dy_i / w_i
  dG/dw_i += dG/dy_i dy_i/dw_i = dG/dy_i * x_i / (- w_i^2)