public void train() { double mu; int qid, i, j, pSize; for (int n = 0; n < m_maxIter; n++) { Utils.shuffle(m_order, m_trainingSize); qid = 0; while (qid < m_trainingSize) { pSize = 0; Arrays.fill(m_g, 0.0); for (j = 0; j < m_windowSize; j++) { // collect the gradients in mini-batch pSize += gradientUpdate(m_queries.get(m_order[qid % m_trainingSize])); qid++; } // Step 4: gradient from regularization for (i = 0; i < m_weight.length; i++) m_g[i] = m_g[i] / pSize + m_lambda * m_weight[i]; mu = Math.random() * m_step; for (i = 0; i < m_weight.length; i++) m_weight[i] -= mu * m_g[i]; } m_step *= m_shrinkage; } }