public double sumLoss(
      List<Pair<Matrix>> pairs, Matrix u, Matrix w, Matrix bias, BilinearLearnerParameters params) {
    LossFunction loss = params.getTyped(BilinearLearnerParameters.LOSS);
    loss = new MatLossFunction(loss);
    double total = 0;
    int i = 0;
    int ntasks = 0;
    for (Pair<Matrix> pair : pairs) {
      Matrix X = pair.firstObject();
      Matrix Y = pair.secondObject();
      SparseMatrix Yexp = BilinearSparseOnlineLearner.expandY(Y);
      Matrix expectedAll = u.transpose().times(X.transpose()).times(w);
      loss.setY(Yexp);
      loss.setX(expectedAll);
      if (bias != null) loss.setBias(bias);
      logger.debug("Testing pair: " + i);
      total += loss.eval(null); // Assums an identity w.
      i++;
      ntasks += Y.getNumColumns();
    }
    total /= ntasks;

    return Math.sqrt(total);
  }