docs: protected void bprop(int target) {
        assert (target != missing_int_value); // no correction of weights/biases for missing label
        float m = momentum();
        float r = _minfo.adaDelta() ? 0 : rate(_minfo.get_processed_total()) * (1f - m);
        float g; //partial derivative dE/dy * dy/dnet
        final float rows = _a.size();
        for( int row = 0; row < rows; row++ ) {
          final float t = (row == target ? 1f : 0f);
          final float y = _a.get(row);
          //dy/dnet = derivative of softmax = (1-y)*y
          if (params.loss == Loss.CrossEntropy) {
            //nothing else needed, -dCE/dy * dy/dnet = target - y
            //cf. http://www.stanford.edu/group/pdplab/pdphandbook/handbookch6.html
            g = t - y;
          } else {
            assert(params.loss == Loss.MeanSquare);
            //-dMSE/dy = target-y
            g = (t - y) * (1f - y) * y;
          }
          // this call expects dE/dnet
          bprop(row, g, r, m);
        }
      }