Generic 1-layer training
This commit is contained in:
parent
c16c3c5dc9
commit
a38e4c3c77
@ -706,65 +706,65 @@ namespace NanoBrain {
|
||||
Debug.Log($"Updated weight: {loss.magnitude} {loss} {scaledOutput} {synapse.weight}");
|
||||
}
|
||||
|
||||
public void BackPropagation1(Vector3 cost, Vector3 error, float learningRate) {
|
||||
cost = Vector3.Scale(error, error); // error^2
|
||||
float3 derivative = 2 * error; // derivative of (error^2)
|
||||
// inverted because it uses the non-convential
|
||||
// error=(actual-taget) instead of (target-actual)
|
||||
// dSSR / dPredicted
|
||||
// public void BackPropagation1(Vector3 cost, Vector3 error, float learningRate) {
|
||||
// cost = Vector3.Scale(error, error); // error^2
|
||||
// float3 derivative = 2 * error; // derivative of (error^2)
|
||||
// // inverted because it uses the non-convential
|
||||
// // error=(actual-taget) instead of (target-actual)
|
||||
// // dSSR / dPredicted
|
||||
|
||||
// Bias
|
||||
float3 deltaBias = derivative;
|
||||
// deltaBias *= 1; // because bias is always fully applied
|
||||
Vector3 stepSize = deltaBias * learningRate;
|
||||
this.bias -= stepSize;
|
||||
// // Bias
|
||||
// float3 deltaBias = derivative;
|
||||
// // deltaBias *= 1; // because bias is always fully applied
|
||||
// Vector3 stepSize = deltaBias * learningRate;
|
||||
// this.bias -= stepSize;
|
||||
|
||||
foreach (Synapse synapse in this.synapses) {
|
||||
// derivative for the weight?
|
||||
float3 deltaSynapse = derivative; // dSSR/dPredicted
|
||||
// derivative for the previous activation
|
||||
deltaSynapse *= synapse.neuron.activation; // dPredicted/dWeight
|
||||
// foreach (Synapse synapse in this.synapses) {
|
||||
// // derivative for the weight?
|
||||
// float3 deltaSynapse = derivative; // dSSR/dPredicted
|
||||
// // derivative for the previous activation
|
||||
// deltaSynapse *= synapse.neuron.activation; // dPredicted/dWeight
|
||||
|
||||
// // derivative for the activator
|
||||
// switch (activator) {
|
||||
// case ActivationType.Linear:
|
||||
// //delta2 *= 1;
|
||||
// break;
|
||||
// default:
|
||||
// break;
|
||||
// // // derivative for the activator
|
||||
// // switch (activator) {
|
||||
// // case ActivationType.Linear:
|
||||
// // //delta2 *= 1;
|
||||
// // break;
|
||||
// // default:
|
||||
// // break;
|
||||
// // }
|
||||
// float deltaWeight = length(deltaSynapse);
|
||||
// synapse.weight += learningRate * deltaWeight;
|
||||
|
||||
// synapse.neuron.BackPropagation2(derivative * synapse.weight, learningRate);
|
||||
// }
|
||||
// }
|
||||
float deltaWeight = length(deltaSynapse);
|
||||
synapse.weight += learningRate * deltaWeight;
|
||||
|
||||
synapse.neuron.BackPropagation2(derivative * synapse.weight, learningRate);
|
||||
}
|
||||
}
|
||||
|
||||
public void BackPropagation0(Vector3 error, float learningRate) {
|
||||
float3 derivative = 2 * error; // derivative of (error^2)
|
||||
public void BackPropagation0(float error, float learningRate) {
|
||||
float derivative = 2 * error; // derivative of (error^2)
|
||||
// inverted because it uses the non-convential
|
||||
// error=(actual-taget) instead of (target-actual)
|
||||
// dSSR / dPredicted
|
||||
BackPropagation2(derivative, learningRate);
|
||||
}
|
||||
|
||||
public void BackPropagation2(Vector3 derivative, float learningRate) {
|
||||
public void BackPropagation2(float derivative, float learningRate) {
|
||||
|
||||
// Bias
|
||||
float3 deltaBias = derivative; // dSSR/dActivator
|
||||
switch (activator) { // dActivator/dBias
|
||||
case ActivationType.Linear:
|
||||
//deltaBias *= 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
// deltaBias *= 1; // because bias is always fully applied
|
||||
Vector3 stepSize = deltaBias * learningRate;
|
||||
this.bias -= stepSize;
|
||||
// float3 deltaBias = derivative; // dSSR/dActivator
|
||||
// switch (activator) { // dActivator/dBias
|
||||
// case ActivationType.Linear:
|
||||
// //deltaBias *= 1;
|
||||
// break;
|
||||
// default:
|
||||
// break;
|
||||
// }
|
||||
// // deltaBias *= 1; // because bias is always fully applied
|
||||
// Vector3 stepSize = deltaBias * learningRate;
|
||||
// this.bias -= stepSize;
|
||||
|
||||
foreach (Synapse synapse in this.synapses) {
|
||||
synapse.BackPropagation(length(derivative), learningRate);
|
||||
synapse.BackPropagation(this, derivative, learningRate);
|
||||
// // derivative for the weight?
|
||||
// float3 deltaSynapse = derivative; // dSSR/dActivator
|
||||
|
||||
@ -785,7 +785,7 @@ namespace NanoBrain {
|
||||
// float deltaWeight = length(deltaSynapse);
|
||||
// synapse.weight += learningRate * deltaWeight;
|
||||
|
||||
BackPropagation2(derivative * synapse.weight, learningRate);
|
||||
// BackPropagation2(derivative * synapse.weight, learningRate);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -33,13 +33,15 @@ namespace NanoBrain {
|
||||
this.weight = weight;
|
||||
}
|
||||
|
||||
public virtual void BackPropagation(float error, float learningRate) {
|
||||
public virtual void BackPropagation(Neuron receiver, float error, float learningRate) {
|
||||
float derivative = error;
|
||||
switch (neuron.activator) {
|
||||
|
||||
switch (receiver.activator) {
|
||||
case Neuron.ActivationType.Linear:
|
||||
derivative *= 1;
|
||||
break;
|
||||
default:
|
||||
Debug.Log("other activator");
|
||||
break;
|
||||
}
|
||||
derivative *= math.length(neuron.activation);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user