@Override public double getUnnormalizedLogProbability(Assignment assignment) { Preconditions.checkArgument(assignment.containsAll(getVars().getVariableNumsArray())); Tensor inputFeatureVector = (Tensor) assignment.getValue(getInputVariable().getOnlyVariableNum()); if (conditionalVars.size() == 0) { // No normalization for any conditioned-on variables. This case // allows a more efficient implementation than the default // in ClassifierFactor. VariableNumMap outputVars = getOutputVariables(); Tensor outputTensor = SparseTensor.singleElement( outputVars.getVariableNumsArray(), outputVars.getVariableSizes(), outputVars.assignmentToIntArray(assignment), 1.0); Tensor featureIndicator = outputTensor.outerProduct(inputFeatureVector); return logWeights.innerProduct(featureIndicator).getByDimKey(); } else { // Default to looking up the answer in the output log probabilities int[] outputIndexes = getOutputVariables().assignmentToIntArray(assignment); Tensor logProbs = getOutputLogProbTensor(inputFeatureVector); return logProbs.getByDimKey(outputIndexes); } }
@Override public void incrementSufficientStatisticsFromAssignment( SufficientStatistics gradient, SufficientStatistics currentParameters, Assignment assignment, double count) { Preconditions.checkArgument(assignment.containsAll(getVars().getVariableNumsArray())); Assignment subAssignment = assignment.intersection(getVars().getVariableNumsArray()); long keyNum = initialWeights .getWeights() .dimKeyToKeyNum(initialWeights.getVars().assignmentToIntArray(subAssignment)); int index = initialWeights.getWeights().keyNumToIndex(keyNum); ((TensorSufficientStatistics) gradient).incrementFeatureByIndex(count, index); }
@Override public void log(long iteration, int exampleNum, Assignment example, FactorGraph graph) { if (showExamples) { if (iteration % logInterval == 0) { String prob = ""; if (example.containsAll(graph.getVariables().getVariableNumsArray())) { prob = Double.toString(graph.getUnnormalizedLogProbability(example)); } print( iteration + "." + exampleNum + " " + prob + ": example: " + graph.assignmentToObject(example)); } } }
@Override public void incrementSufficientStatisticsFromMarginal( SufficientStatistics gradient, SufficientStatistics currentParameters, Factor marginal, Assignment conditionalAssignment, double count, double partitionFunction) { if (conditionalAssignment.containsAll(getVars().getVariableNumsArray())) { // Short-circuit the slow computation below if possible. double multiplier = marginal.getTotalUnnormalizedProbability() * count / partitionFunction; incrementSufficientStatisticsFromAssignment( gradient, currentParameters, conditionalAssignment, multiplier); } else { VariableNumMap conditionedVars = initialWeights.getVars().intersection(conditionalAssignment.getVariableNumsArray()); TableFactor productFactor = (TableFactor) initialWeights .product( TableFactor.pointDistribution( conditionedVars, conditionalAssignment.intersection(conditionedVars))) .product(marginal); Tensor productFactorWeights = productFactor.getWeights(); double[] productFactorValues = productFactorWeights.getValues(); int tensorSize = productFactorWeights.size(); double multiplier = count / partitionFunction; TensorSufficientStatistics tensorGradient = (TensorSufficientStatistics) gradient; for (int i = 0; i < tensorSize; i++) { int builderIndex = (int) productFactorWeights.indexToKeyNum(i); tensorGradient.incrementFeatureByIndex(productFactorValues[i] * multiplier, builderIndex); } } }