From a38e4c3c77e27241a2d5fca8b4f89045a6950e27 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Fri, 3 Jul 2026 11:44:58 +0200 Subject: [PATCH] Generic 1-layer training --- Runtime/Scripts/Core/Neuron.cs | 90 ++++++++++++++++----------------- Runtime/Scripts/Core/Synapse.cs | 8 +-- 2 files changed, 50 insertions(+), 48 deletions(-) diff --git a/Runtime/Scripts/Core/Neuron.cs b/Runtime/Scripts/Core/Neuron.cs index 9a9ccef..7cda0b8 100644 --- a/Runtime/Scripts/Core/Neuron.cs +++ b/Runtime/Scripts/Core/Neuron.cs @@ -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; - // } - float deltaWeight = length(deltaSynapse); - synapse.weight += learningRate * deltaWeight; + // // // 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); - } - } + // 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); } } diff --git a/Runtime/Scripts/Core/Synapse.cs b/Runtime/Scripts/Core/Synapse.cs index 22ee378..8a66fe6 100644 --- a/Runtime/Scripts/Core/Synapse.cs +++ b/Runtime/Scripts/Core/Synapse.cs @@ -22,7 +22,7 @@ namespace NanoBrain { public float weight; public bool trainable = false; - + /// /// Create a new Synapse /// @@ -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);