package func.nn.backprop;
/**
* A resilient backpropagation implementation
* @author Andrew Guillory gtg008g@mail.gatech.edu
* @version 1.0
*/
public class RPROPUpdateRule extends WeightUpdateRule {
/**
* The increase parameter
*/
private static final double INCREASE = 1.2;
/**
* The decrease parameter
*/
private static final double DECREASE = .5;
/**
* The initial learning rate
*/
private double initialLearningRate;
/**
* The max learning rate
*/
private double maxLearningRate;
/**
* The min learning rate
*/
private double minLearningRate;
/**
* Make a new rprop update rule
* @param initial the initial learning rate
* @param max the maximum learning rate
* @param min the minimum learning rate
*/
public RPROPUpdateRule(double initial, double max, double min) {
this.initialLearningRate = initial;
this.maxLearningRate = max;
this.minLearningRate = min;
}
/**
* Make a new rprop update rule with default values
*/
public RPROPUpdateRule() {
this(.1, 50, .000001);
}
/**
* @see nn.backprop.BackPropagationUpdateRule#update(nn.backprop.BackPropagationLink)
*/
public void update(BackPropagationLink link) {
if (link.getLearningRate() == 0) {
link.setLearningRate(initialLearningRate);
}
double sign = 0;
if (link.getError() < 0) {
sign = -1;
} else if (link.getError() > 0) {
sign = 1;
}
if (link.getLastError() * link.getError() > 0) {
link.setLearningRate(Math.min(
link.getLearningRate() * INCREASE, maxLearningRate));
link.changeWeight(-sign * link.getLearningRate());
} else if (link.getLastError() * link.getError() < 0) {
link.setLearningRate(Math.max(
link.getLearningRate() * DECREASE, minLearningRate));
link.setError(0);
link.changeWeight(-link.getLastChange());
} else {
link.changeWeight(-sign * link.getLearningRate());
}
}
}