public override void BackwardPass(int numStates, int curState) { if (DenseFeatureSize > 0) { //Update hidden-output weights Parallel.ForEach(negativeSampleWordList, c => { var err = Err[c]; var featureWeightCol = DenseWeights[c]; var featureWeightsLearningRateCol = DenseWeightsLearningRate[c]; var j = 0; while (j < DenseFeatureSize - Vector <float> .Count) { RNNHelper.UpdateFeatureWeights(DenseFeature, featureWeightCol, featureWeightsLearningRateCol, err, j); j += Vector <float> .Count; } while (j < DenseFeatureSize) { var delta = RNNHelper.NormalizeGradient(err * DenseFeature[j]); var newLearningRate = RNNHelper.UpdateLearningRate(DenseWeightsLearningRate, c, j, delta); featureWeightCol[j] += newLearningRate * delta; j++; } }); } if (SparseFeatureSize > 0) { //Update hidden-output weights Parallel.ForEach(negativeSampleWordList, c => { var er2 = Err[c]; var vector_c = SparseWeights[c]; foreach (var pair in SparseFeature) { var pos = pair.Key; var val = pair.Value; var delta = RNNHelper.NormalizeGradient(er2 * val); var newLearningRate = RNNHelper.UpdateLearningRate(SparseWeightsLearningRate, c, pos, delta); vector_c[pos] += newLearningRate * delta; } }); } }