final implementation of shc
This commit is contained in:
@@ -17,12 +17,21 @@ class Neuron(Actor):
|
||||
# input_idps: [(input_id, [w1, w2, ...])]
|
||||
self.inputs = {}
|
||||
self.order = []
|
||||
|
||||
"""
|
||||
for (inp_id, weights) in input_idps:
|
||||
self.order.append(inp_id)
|
||||
self.inputs[inp_id] = {"weights": list(weights), "got": False, "val": None}
|
||||
# WICHTIG: Bias lernbar machen
|
||||
self.bias = random.uniform(-2.0, 2.0)
|
||||
# Für Backup/Restore
|
||||
"""
|
||||
|
||||
self.bias = 0.0
|
||||
for (inp_id, weights) in input_idps:
|
||||
if inp_id == "bias":
|
||||
self.bias = float(weights[0])
|
||||
else:
|
||||
self.order.append(inp_id)
|
||||
self.inputs[inp_id] = {"weights": list(weights), "got": False, "val": None}
|
||||
|
||||
self._backup_inputs = None
|
||||
self._backup_bias = None
|
||||
|
||||
@@ -61,13 +70,11 @@ class Neuron(Actor):
|
||||
print(f"Neuron {self.nid}: input_sum={acc + self.bias:.3f}, output={out:.3f}")
|
||||
|
||||
elif tag == "get_backup":
|
||||
# Packe Gewichte + Bias zurück
|
||||
idps = [(i, self.inputs[i]["weights"]) for i in self.order]
|
||||
idps.append(("bias", self.bias))
|
||||
await self.cx_pid.send(("backup_from_neuron", self.nid, idps))
|
||||
|
||||
elif tag == "weight_backup":
|
||||
# Tiefkopie der Gewichte + Bias
|
||||
print(f"Neuron {self.nid}: backing up weights")
|
||||
self._backup_inputs = {k: {"weights": v["weights"][:]} for k, v in self.inputs.items()}
|
||||
self._backup_bias = self.bias
|
||||
@@ -79,21 +86,17 @@ class Neuron(Actor):
|
||||
self.bias = self._backup_bias
|
||||
|
||||
elif tag == "weight_perturb":
|
||||
# In neuron.py weight_perturb, add:
|
||||
print(f"Neuron {self.nid}: perturbing {len([w for i in self.order for w in self.inputs[i]['weights']])} weights")
|
||||
# MP wie im Buch: 1/sqrt(TotalWeightsIncludingBias)
|
||||
tot_w = sum(len(self.inputs[i]["weights"]) for i in self.order) + 1
|
||||
mp = 1 / math.sqrt(tot_w)
|
||||
delta_mag = 2.0 * math.pi
|
||||
sat_lim = 2.0 * math.pi
|
||||
|
||||
# Gewichte perturbieren
|
||||
for i in self.order:
|
||||
ws = self.inputs[i]["weights"]
|
||||
for j in range(len(ws)):
|
||||
if random.random() < mp:
|
||||
ws[j] = _sat(ws[j] + (random.random() - 0.5) * delta_mag, -sat_lim, sat_lim)
|
||||
# Bias perturbieren
|
||||
if random.random() < mp:
|
||||
self.bias = _sat(self.bias + (random.random() - 0.5) * delta_mag, -sat_lim, sat_lim)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user