From b41223f9951c0bd7308d79ac3a66eeb6cccdfa85 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 19 Jun 2024 12:55:12 -0700 Subject: [PATCH 01/13] zenke rules --- RecurrentFF/model/hidden_layer.py | 108 +++++++++++++++++++++++++----- RecurrentFF/settings.py | 3 + config.toml | 3 + 3 files changed, 98 insertions(+), 16 deletions(-) diff --git a/RecurrentFF/model/hidden_layer.py b/RecurrentFF/model/hidden_layer.py index 277a6eb..f64361d 100644 --- a/RecurrentFF/model/hidden_layer.py +++ b/RecurrentFF/model/hidden_layer.py @@ -1,5 +1,6 @@ from enum import Enum import math +import random from typing import Dict, Optional, cast from typing_extensions import Self @@ -412,8 +413,69 @@ def set_previous_layer(self, previous_layer: Self) -> None: def set_next_layer(self, next_layer: Self) -> None: self.next_layer = next_layer + def generate_lpl_loss_predictive(self) -> Tensor: + def generate_loss(current_act: Tensor, previous_act: Tensor) -> Tensor: + loss = (current_act - previous_act.detach()) ** 2 + loss = torch.sum(loss, dim=1) + loss = torch.sum(loss, dim=0) + loss = loss / \ + (2 * current_act.shape[0] * current_act.shape[1]) + return loss + + pos_loss = generate_loss( + self.pos_activations.current, self.pos_activations.previous) + + return pos_loss + + def generate_lpl_loss_hebbian(self) -> Tensor: + def generate_loss(activations: Tensor) -> Tensor: + # activations = activations.detach() + mean_act = torch.mean(activations, dim=0).detach() + mean_subtracted = activations - mean_act + + sigma_squared = torch.sum( + mean_subtracted ** 2, dim=0) / (activations.shape[0] - 1) + + loss = -torch.log(sigma_squared).sum() / sigma_squared.shape[0] + return loss + + pos_loss = generate_loss(self.pos_activations.current) + + return pos_loss + + def generate_lpl_loss_decorrelative(self) -> Tensor: + def generate_loss(activations: torch.Tensor) -> torch.Tensor: + # Ensure activations are detached from the computation graph + # activations = activations.detach() + + # Compute the mean across the batch dimension + mean_act = torch.mean(activations, dim=0) + + # Subtract mean from activations and square the result + deviations = (activations - mean_act) ** 2 + + # Outer product along feature dimension for each batch + # This computes the pairwise squared differences efficiently + loss = torch.einsum('bi,bj->bij', deviations, deviations) + + # Sum over all batches and features, exclude the diagonal elements + # Diagonal elements correspond to the squared terms which we want to avoid + batch_size, n_features = activations.shape + loss = torch.sum(loss) - \ + torch.sum(torch.einsum('bii->b', loss)) / 2 + + # Normalize the loss + loss = loss / (batch_size * n_features * (n_features - 1)) + + return loss + + pos_loss = generate_loss(self.pos_activations.current) + + return pos_loss + # @profile(stdout=False, filename='baseline.prof', # skip=Settings.new().model.skip_profiling) + def train_layer(self, # type: ignore[override] input_data: TrainInputData, label_data: TrainLabelData, @@ -421,42 +483,56 @@ def train_layer(self, # type: ignore[override] self.optimizer.zero_grad() pos_activations = None - neg_activations = None + # neg_activations = None if input_data is not None and label_data is not None: (pos_input, neg_input) = input_data (pos_labels, neg_labels) = label_data pos_activations = self.forward( ForwardMode.PositiveData, pos_input, pos_labels, should_damp) - neg_activations = self.forward( - ForwardMode.NegativeData, neg_input, neg_labels, should_damp) + # neg_activations = self.forward( + # ForwardMode.NegativeData, neg_input, neg_labels, should_damp) elif input_data is not None: (pos_input, neg_input) = input_data pos_activations = self.forward( ForwardMode.PositiveData, pos_input, None, should_damp) - neg_activations = self.forward( - ForwardMode.NegativeData, neg_input, None, should_damp) + # neg_activations = self.forward( + # ForwardMode.NegativeData, neg_input, None, should_damp) elif label_data is not None: (pos_labels, neg_labels) = label_data pos_activations = self.forward( ForwardMode.PositiveData, None, pos_labels, should_damp) - neg_activations = self.forward( - ForwardMode.NegativeData, None, neg_labels, should_damp) + # neg_activations = self.forward( + # ForwardMode.NegativeData, None, neg_labels, should_damp) else: pos_activations = self.forward( ForwardMode.PositiveData, None, None, should_damp) - neg_activations = self.forward( - ForwardMode.NegativeData, None, None, should_damp) + # neg_activations = self.forward( + # ForwardMode.NegativeData, None, None, should_damp) pos_badness = layer_activations_to_badness(pos_activations) - neg_badness = layer_activations_to_badness(neg_activations) + # neg_badness = layer_activations_to_badness(neg_activations) - # Loss function equivelent to: - # plot3d log(1 + exp(-n + 1)) + log(1 + exp(p - 1)) for n=0 to 3, p=0 - # to 3 - layer_loss: Tensor = F.softplus(torch.cat([ - (-1 * neg_badness) + self.settings.model.loss_threshold, + ff_layer_loss: Tensor = F.softplus( pos_badness - self.settings.model.loss_threshold - ])).mean() + ).mean() + ff_layer_loss = self.settings.model.loss_scale_ff * ff_layer_loss + + lpl_loss_predictive: Tensor = self.settings.model.loss_scale_predictive * \ + self.generate_lpl_loss_predictive() + lpl_loss_hebbian: Tensor = self.settings.model.loss_scale_hebbian * \ + self.generate_lpl_loss_hebbian() + lpl_loss_decorrelative: Tensor = self.settings.model.loss_scale_decorrelative * \ + self.generate_lpl_loss_decorrelative() + + if random.random() < 0.005: + print("ff_layer_loss: ", ff_layer_loss) + print("lpl_loss_predictive: ", lpl_loss_predictive) + print("lpl_loss_hebbian: ", lpl_loss_hebbian) + print("lpl_loss_decorrelative: ", lpl_loss_decorrelative) + print() + + layer_loss: Tensor = ff_layer_loss + lpl_loss_predictive + \ + lpl_loss_hebbian + lpl_loss_decorrelative layer_loss.backward() self.optimizer.step() diff --git a/RecurrentFF/settings.py b/RecurrentFF/settings.py index b97a233..5b4dfbc 100644 --- a/RecurrentFF/settings.py +++ b/RecurrentFF/settings.py @@ -55,6 +55,9 @@ class Model(BaseModel): should_replace_neg_data: bool should_load_weights: bool dropout: float + loss_scale_predictive: float + loss_scale_hebbian: float + loss_scale_decorrelative: float lr_step_size: int lr_gamma: float diff --git a/config.toml b/config.toml index ac409bb..10867e6 100644 --- a/config.toml +++ b/config.toml @@ -18,6 +18,9 @@ should_load_weights = false lr_step_size = 10000 lr_gamma = 0.90 dropout = 0.0 +loss_scale_predictive = 1 +loss_scale_hebbian = 1 +loss_scale_decorrelative = 1 [model.ff_rmsprop] momentum = 0.0 From 30869056768210a5e5c74f115acf414a0b1be28c Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 19 Jun 2024 14:20:11 -0700 Subject: [PATCH 02/13] messy but good framework for future change --- .../data_scenario/static_single_class.py | 9 ++- RecurrentFF/model/hidden_layer.py | 72 ++++++++++-------- RecurrentFF/model/inner_layers.py | 10 +-- RecurrentFF/model/model.py | 10 ++- RecurrentFF/settings.py | 1 + RecurrentFF/util.py | 2 +- computation_graph | 72 ++++++++++++++++++ computation_graph.png | Bin 0 -> 57328 bytes config.toml | 9 ++- 9 files changed, 137 insertions(+), 48 deletions(-) create mode 100644 computation_graph create mode 100644 computation_graph.png diff --git a/RecurrentFF/model/data_scenario/static_single_class.py b/RecurrentFF/model/data_scenario/static_single_class.py index ed57166..d771fac 100644 --- a/RecurrentFF/model/data_scenario/static_single_class.py +++ b/RecurrentFF/model/data_scenario/static_single_class.py @@ -378,7 +378,8 @@ class label, using a two-step process: and is_test_set, "Cannot write activations for batch size > 1" activity_tracker = StaticSingleClassActivityTracker() - forward_mode = ForwardMode.PredictData if is_test_set else ForwardMode.PositiveData + # forward_mode = ForwardMode.PredictData if is_test_set else ForwardMode.PositiveData + forward_mode = ForwardMode.PositiveData # tuple: (correct, total) accuracy_contexts = [] @@ -405,7 +406,7 @@ class label, using a two-step process: # evaluate badness for each possible label for label in range(self.settings.data_config.num_classes): - self.inner_layers.reset_activations(not is_test_set) + self.inner_layers.reset_activations(True) upper_clamped_tensor = self.get_preinit_upper_clamped_tensor( (data.shape[1], self.settings.data_config.num_classes)) @@ -413,7 +414,7 @@ class label, using a two-step process: for _preinit_step in range( 0, self.settings.model.prelabel_timesteps): self.inner_layers.advance_layers_forward( - forward_mode, data[0], upper_clamped_tensor, False) + data[0], upper_clamped_tensor, False) if write_activations: activity_tracker.track_partial_activations( self.inner_layers) @@ -431,7 +432,7 @@ class label, using a two-step process: badnesses = [] for iteration in range(0, iterations): self.inner_layers.advance_layers_forward( - forward_mode, data[iteration], one_hot_labels, True) + data[iteration], one_hot_labels, True) if write_activations: activity_tracker.track_partial_activations( self.inner_layers) diff --git a/RecurrentFF/model/hidden_layer.py b/RecurrentFF/model/hidden_layer.py index f64361d..b7b999b 100644 --- a/RecurrentFF/model/hidden_layer.py +++ b/RecurrentFF/model/hidden_layer.py @@ -1,3 +1,4 @@ +from dataclasses import make_dataclass from enum import Enum import math import random @@ -11,6 +12,8 @@ from torch.optim import RMSprop, Adam, Adadelta, Optimizer from torch.optim.lr_scheduler import StepLR from profilehooks import profile +from torchviz import make_dot + from RecurrentFF.util import ( Activations, @@ -66,13 +69,13 @@ def eval(self: Self) -> Self: def forward(self, mode: ForwardMode) -> torch.Tensor: if mode == ForwardMode.PositiveData: assert self.source.pos_activations is not None - source_activations = self.source.pos_activations.previous.detach() + source_activations = self.source.pos_activations.previous elif mode == ForwardMode.NegativeData: assert self.source.neg_activations is not None - source_activations = self.source.neg_activations.previous.detach() + source_activations = self.source.neg_activations.previous elif mode == ForwardMode.PredictData: assert self.source.predict_activations is not None - source_activations = self.source.predict_activations.previous.detach() + source_activations = self.source.predict_activations.previous source_activations_stdized = standardize_layer_activations( source_activations, self.source.settings.model.epsilon) @@ -363,19 +366,19 @@ def reset_activations(self, isTraining: bool) -> None: activations_dim = self.train_activations_dim pos_activations_current = torch.zeros( - activations_dim[0], activations_dim[1]).to( + activations_dim[0], activations_dim[1], requires_grad=False).to( self.settings.device.device) pos_activations_previous = torch.zeros( - activations_dim[0], activations_dim[1]).to( + activations_dim[0], activations_dim[1], requires_grad=False).to( self.settings.device.device) self.pos_activations = Activations( pos_activations_current, pos_activations_previous) neg_activations_current = torch.zeros( - activations_dim[0], activations_dim[1]).to( + activations_dim[0], activations_dim[1], requires_grad=False).to( self.settings.device.device) neg_activations_previous = torch.zeros( - activations_dim[0], activations_dim[1]).to( + activations_dim[0], activations_dim[1], requires_grad=False).to( self.settings.device.device) self.neg_activations = Activations( neg_activations_current, neg_activations_previous) @@ -386,10 +389,10 @@ def reset_activations(self, isTraining: bool) -> None: activations_dim = self.test_activations_dim predict_activations_current = torch.zeros( - activations_dim[0], activations_dim[1]).to( + activations_dim[0], activations_dim[1], requires_grad=False).to( self.settings.device.device) predict_activations_previous = torch.zeros( - activations_dim[0], activations_dim[1]).to( + activations_dim[0], activations_dim[1], requires_grad=False).to( self.settings.device.device) self.predict_activations = Activations( predict_activations_current, predict_activations_previous) @@ -415,7 +418,7 @@ def set_next_layer(self, next_layer: Self) -> None: def generate_lpl_loss_predictive(self) -> Tensor: def generate_loss(current_act: Tensor, previous_act: Tensor) -> Tensor: - loss = (current_act - previous_act.detach()) ** 2 + loss = (current_act - previous_act) ** 2 loss = torch.sum(loss, dim=1) loss = torch.sum(loss, dim=0) loss = loss / \ @@ -429,8 +432,7 @@ def generate_loss(current_act: Tensor, previous_act: Tensor) -> Tensor: def generate_lpl_loss_hebbian(self) -> Tensor: def generate_loss(activations: Tensor) -> Tensor: - # activations = activations.detach() - mean_act = torch.mean(activations, dim=0).detach() + mean_act = torch.mean(activations, dim=0) mean_subtracted = activations - mean_act sigma_squared = torch.sum( @@ -445,9 +447,6 @@ def generate_loss(activations: Tensor) -> Tensor: def generate_lpl_loss_decorrelative(self) -> Tensor: def generate_loss(activations: torch.Tensor) -> torch.Tensor: - # Ensure activations are detached from the computation graph - # activations = activations.detach() - # Compute the mean across the batch dimension mean_act = torch.mean(activations, dim=0) @@ -485,20 +484,31 @@ def train_layer(self, # type: ignore[override] pos_activations = None # neg_activations = None if input_data is not None and label_data is not None: - (pos_input, neg_input) = input_data - (pos_labels, neg_labels) = label_data + try: + (pos_input, neg_input) = input_data + (pos_labels, neg_labels) = label_data + except ValueError: + pos_input = input_data + pos_labels = label_data + pos_activations = self.forward( ForwardMode.PositiveData, pos_input, pos_labels, should_damp) # neg_activations = self.forward( # ForwardMode.NegativeData, neg_input, neg_labels, should_damp) elif input_data is not None: - (pos_input, neg_input) = input_data + try: + (pos_input, neg_input) = input_data + except ValueError: + pos_input = input_data pos_activations = self.forward( ForwardMode.PositiveData, pos_input, None, should_damp) # neg_activations = self.forward( # ForwardMode.NegativeData, neg_input, None, should_damp) elif label_data is not None: - (pos_labels, neg_labels) = label_data + try: + (pos_labels, neg_labels) = label_data + except ValueError: + pos_labels = label_data pos_activations = self.forward( ForwardMode.PositiveData, None, pos_labels, should_damp) # neg_activations = self.forward( @@ -525,6 +535,7 @@ def train_layer(self, # type: ignore[override] self.generate_lpl_loss_decorrelative() if random.random() < 0.005: + # print("pos_act: ", pos_activations) print("ff_layer_loss: ", ff_layer_loss) print("lpl_loss_predictive: ", lpl_loss_predictive) print("lpl_loss_hebbian: ", lpl_loss_hebbian) @@ -535,6 +546,11 @@ def train_layer(self, # type: ignore[override] lpl_loss_hebbian + lpl_loss_decorrelative layer_loss.backward() + # params = dict(self.named_parameters()) + # params['pos_activations'] = pos_activations + # dot = make_dot(layer_loss, params=dict(params)) + # dot.render('computation_graph', format='png') + self.optimizer.step() return cast(float, layer_loss.item()) @@ -617,15 +633,14 @@ def forward(self, mode: ForwardMode, data: torch.Tensor, labels: torch.Tensor, s Activations, previous_layer.predict_activations).previous prev_act = cast(Activations, self.predict_activations).previous - prev_layer_prev_timestep_activations = prev_layer_prev_timestep_activations.detach() + prev_layer_prev_timestep_activations = prev_layer_prev_timestep_activations prev_layer_stdized = standardize_layer_activations( prev_layer_prev_timestep_activations, self.settings.model.epsilon) - next_layer_prev_timestep_activations = next_layer_prev_timestep_activations.detach() + next_layer_prev_timestep_activations = next_layer_prev_timestep_activations next_layer_stdized = standardize_layer_activations( next_layer_prev_timestep_activations, self.settings.model.epsilon) - prev_act = prev_act.detach() prev_act_stdized = standardize_layer_activations( prev_act, self.settings.model.epsilon) @@ -655,7 +670,6 @@ def forward(self, mode: ForwardMode, data: torch.Tensor, labels: torch.Tensor, s assert self.predict_activations is not None prev_act = cast(Activations, self.predict_activations).previous - prev_act = prev_act.detach() prev_act_stdized = standardize_layer_activations( prev_act, self.settings.model.epsilon) @@ -688,11 +702,10 @@ def forward(self, mode: ForwardMode, data: torch.Tensor, labels: torch.Tensor, s Activations, next_layer.predict_activations).previous prev_act = cast(Activations, self.predict_activations).previous - next_layer_prev_timestep_activations = next_layer_prev_timestep_activations.detach() + next_layer_prev_timestep_activations = next_layer_prev_timestep_activations next_layer_stdized = standardize_layer_activations( next_layer_prev_timestep_activations, self.settings.model.epsilon) - prev_act = prev_act.detach() prev_act_stdized = standardize_layer_activations( prev_act, self.settings.model.epsilon) @@ -725,11 +738,10 @@ def forward(self, mode: ForwardMode, data: torch.Tensor, labels: torch.Tensor, s Activations, previous_layer.predict_activations).previous prev_act = cast(Activations, self.predict_activations).previous - prev_layer_prev_timestep_activations = prev_layer_prev_timestep_activations.detach() + prev_layer_prev_timestep_activations = prev_layer_prev_timestep_activations prev_layer_stdized = standardize_layer_activations( prev_layer_prev_timestep_activations, self.settings.model.epsilon) - prev_act = prev_act.detach() prev_act_stdized = standardize_layer_activations( prev_act, self.settings.model.epsilon) @@ -764,12 +776,12 @@ def forward(self, mode: ForwardMode, data: torch.Tensor, labels: torch.Tensor, s if mode == ForwardMode.PositiveData: assert self.pos_activations is not None - self.pos_activations.current = new_activation + self.pos_activations.current = new_activation.detach() elif mode == ForwardMode.NegativeData: assert self.neg_activations is not None - self.neg_activations.current = new_activation + self.neg_activations.current = new_activation.detach() elif mode == ForwardMode.PredictData: assert self.predict_activations is not None - self.predict_activations.current = new_activation + self.predict_activations.current = new_activation.detach() return new_activation diff --git a/RecurrentFF/model/inner_layers.py b/RecurrentFF/model/inner_layers.py index ad7b9e0..ba90a7e 100644 --- a/RecurrentFF/model/inner_layers.py +++ b/RecurrentFF/model/inner_layers.py @@ -255,7 +255,6 @@ def advance_layers_train( def advance_layers_forward( self, - mode: ForwardMode, input_data: torch.Tensor, label_data: torch.Tensor, should_damp: bool) -> None: @@ -296,15 +295,16 @@ def advance_layers_forward( this is because the overhead of creating threads is not worth it for the small amount of computation done in each thread. """ + # TODOPRE: save and restore params for i, layer in enumerate(self.layers): if i == 0 and len(self.layers) == 1: - layer.forward(mode, input_data, label_data, should_damp) + layer.train_layer(input_data, label_data, should_damp) elif i == 0: - layer.forward(mode, input_data, None, should_damp) + layer.train_layer(input_data, None, should_damp) elif i == len(self.layers) - 1: - layer.forward(mode, None, label_data, should_damp) + layer.train_layer(None, label_data, should_damp) else: - layer.forward(mode, None, None, should_damp) + layer.train_layer(None, None, should_damp) for layer in self.layers: layer.advance_stored_activations() diff --git a/RecurrentFF/model/model.py b/RecurrentFF/model/model.py index 78243dc..98a5b8f 100644 --- a/RecurrentFF/model/model.py +++ b/RecurrentFF/model/model.py @@ -229,17 +229,19 @@ def __train_batch( for preinit_step in range(0, self.settings.model.prelabel_timesteps): logging.debug("Preinitialization step: " + str(preinit_step)) + print("Preinitialization step: " + + str(preinit_step)) pos_input = input_data.pos_input[0] - neg_input = input_data.neg_input[0] + # neg_input = input_data.neg_input[0] preinit_upper_clamped_tensor = self.processor.get_preinit_upper_clamped_tensor( label_data.pos_labels[0].shape) self.inner_layers.advance_layers_forward( - ForwardMode.PositiveData, pos_input, preinit_upper_clamped_tensor, False) - self.inner_layers.advance_layers_forward( - ForwardMode.NegativeData, neg_input, preinit_upper_clamped_tensor, False) + pos_input, preinit_upper_clamped_tensor, False) + # self.inner_layers.advance_layers_forward( + # neg_input, preinit_upper_clamped_tensor, False) num_layers = len(self.settings.model.hidden_sizes) layer_metrics = LayerMetrics(num_layers) diff --git a/RecurrentFF/settings.py b/RecurrentFF/settings.py index 5b4dfbc..b71f5f5 100644 --- a/RecurrentFF/settings.py +++ b/RecurrentFF/settings.py @@ -55,6 +55,7 @@ class Model(BaseModel): should_replace_neg_data: bool should_load_weights: bool dropout: float + loss_scale_ff: float loss_scale_predictive: float loss_scale_hebbian: float loss_scale_decorrelative: float diff --git a/RecurrentFF/util.py b/RecurrentFF/util.py index 1fcaca1..e2aff56 100644 --- a/RecurrentFF/util.py +++ b/RecurrentFF/util.py @@ -77,7 +77,7 @@ def __iter__(self) -> Generator[torch.Tensor, None, None]: yield self.previous def advance(self) -> None: - self.previous = self.current + self.previous = self.current.clone() class ForwardMode(Enum): diff --git a/computation_graph b/computation_graph new file mode 100644 index 0000000..477f1a1 --- /dev/null +++ b/computation_graph @@ -0,0 +1,72 @@ +digraph { + graph [size="12,12"] + node [align=left fontname=monospace fontsize=10 height=0.2 ranksep=0.1 shape=box style=filled] + 5135880304 [label=" + ()" fillcolor=darkolivegreen1] + 5135741136 [label=AddBackward0] + 5135740944 -> 5135741136 + 5135740944 [label=AddBackward0] + 5135742096 -> 5135740944 + 5135742096 [label=AddBackward0] + 5135742144 -> 5135742096 + 5135742144 [label=MulBackward0] + 5135742336 -> 5135742144 + 5135742336 [label=MeanBackward0] + 5135742432 -> 5135742336 + 5135742432 [label=SoftplusBackward0] + 5135742528 -> 5135742432 + 5135742528 [label=SubBackward0] + 5135742624 -> 5135742528 + 5135742624 [label=MeanBackward1] + 5135742720 -> 5135742624 + 5135742720 [label=PowBackward0] + 5135742816 -> 5135742720 + 5135742816 [label=AddBackward0] + 5135742912 -> 5135742816 + 5135742912 [label=MulBackward0] + 5135743008 -> 5135742912 + 5135743008 [label=LeakyReluBackward0] + 5135743104 -> 5135743008 + 5135743104 [label=AddBackward0] + 5135743200 -> 5135743104 + 5135743200 [label=AddBackward0] + 5135743344 -> 5135743200 + 5135743344 [label=LinearBackward0] + 5135333504 -> 5135743344 + 5135249680 [label="forward_linear.weight + (705, 704)" fillcolor=lightblue] + 5135249680 -> 5135333504 + 5135333504 [label=AccumulateGrad] + 5135333552 -> 5135743344 + 5135249392 [label="forward_linear.bias + (705)" fillcolor=lightblue] + 5135249392 -> 5135333552 + 5135333552 [label=AccumulateGrad] + 5135743296 -> 5135743200 + 5135743296 [label=MulBackward0] + 5135743392 -> 5135743296 + 5135743392 [label=LinearBackward0] + 5135334320 -> 5135743392 + 5135485936 [label="backward_linear.weight + (705, 10)" fillcolor=lightblue] + 5135485936 -> 5135334320 + 5135334320 [label=AccumulateGrad] + 5135333600 -> 5135743392 + 5135483728 [label="backward_linear.bias + (705)" fillcolor=lightblue] + 5135483728 -> 5135333600 + 5135333600 [label=AccumulateGrad] + 5135743152 -> 5135743104 + 5135743152 [label=LinearBackward0] + 5135333456 -> 5135743152 + 5135484496 [label="lateral_linear.weight + (705, 705)" fillcolor=lightblue] + 5135484496 -> 5135333456 + 5135333456 [label=AccumulateGrad] + 5135333744 -> 5135743152 + 5135483824 [label="lateral_linear.bias + (705)" fillcolor=lightblue] + 5135483824 -> 5135333744 + 5135333744 [label=AccumulateGrad] + 5135741136 -> 5135880304 +} diff --git a/computation_graph.png b/computation_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..c6786fefec1c8405bdf88970024e22bf4f67bd1f GIT binary patch literal 57328 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%0Dwc1rhLCdC{C4~Gi>1s*}?Ab{Ws#vZuCq45yo7z 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 BPN)C? literal 0 HcmV?d00001 diff --git a/config.toml b/config.toml index 10867e6..70381d2 100644 --- a/config.toml +++ b/config.toml @@ -2,7 +2,7 @@ device = "mps" [model] -hidden_sizes = [700, 700, 700, 700, 700] +hidden_sizes = [701, 702, 703, 704, 705] epochs = 30000 prelabel_timesteps = 10 loss_threshold = 1.5 @@ -18,9 +18,10 @@ should_load_weights = false lr_step_size = 10000 lr_gamma = 0.90 dropout = 0.0 -loss_scale_predictive = 1 -loss_scale_hebbian = 1 -loss_scale_decorrelative = 1 +loss_scale_ff = 0 +loss_scale_predictive = 0 +loss_scale_hebbian = 0 +loss_scale_decorrelative = 0 [model.ff_rmsprop] momentum = 0.0 From 6bf6697b8278334332576f19cce77e2af9330976 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 19 Jun 2024 15:54:14 -0700 Subject: [PATCH 03/13] wat --- RecurrentFF/model/hidden_layer.py | 57 +++++--- RecurrentFF/model/model.py | 5 +- computation_graph | 207 ++++++++++++++++++++---------- computation_graph.png | Bin 57328 -> 153116 bytes 4 files changed, 184 insertions(+), 85 deletions(-) diff --git a/RecurrentFF/model/hidden_layer.py b/RecurrentFF/model/hidden_layer.py index b7b999b..88a7e09 100644 --- a/RecurrentFF/model/hidden_layer.py +++ b/RecurrentFF/model/hidden_layer.py @@ -279,6 +279,11 @@ def init_residual_connection(self, residual_connection: ResidualConnection) -> N def init_optimizer(self) -> None: self.optimizer: Optimizer + # param_optimizer = [(name, param) for name, param in self.named_parameters()] + # for (name, param) in param_optimizer: + # print(name) + # print(param.shape) + # input() if self.settings.model.ff_optimizer == "adam": self.optimizer = Adam(self.parameters(), lr=self.settings.model.ff_adam.learning_rate) @@ -416,7 +421,7 @@ def set_previous_layer(self, previous_layer: Self) -> None: def set_next_layer(self, next_layer: Self) -> None: self.next_layer = next_layer - def generate_lpl_loss_predictive(self) -> Tensor: + def generate_lpl_loss_predictive(self, current_activations_with_grad: torch.Tensor) -> Tensor: def generate_loss(current_act: Tensor, previous_act: Tensor) -> Tensor: loss = (current_act - previous_act) ** 2 loss = torch.sum(loss, dim=1) @@ -425,12 +430,13 @@ def generate_loss(current_act: Tensor, previous_act: Tensor) -> Tensor: (2 * current_act.shape[0] * current_act.shape[1]) return loss + assert current_activations_with_grad.requires_grad == True + assert self.pos_activations.previous.requires_grad == False pos_loss = generate_loss( - self.pos_activations.current, self.pos_activations.previous) - + current_activations_with_grad, self.pos_activations.previous) return pos_loss - def generate_lpl_loss_hebbian(self) -> Tensor: + def generate_lpl_loss_hebbian(self, current_activations_with_grad: torch.Tensor) -> Tensor: def generate_loss(activations: Tensor) -> Tensor: mean_act = torch.mean(activations, dim=0) mean_subtracted = activations - mean_act @@ -441,11 +447,11 @@ def generate_loss(activations: Tensor) -> Tensor: loss = -torch.log(sigma_squared).sum() / sigma_squared.shape[0] return loss - pos_loss = generate_loss(self.pos_activations.current) - + assert current_activations_with_grad.requires_grad == True + pos_loss = generate_loss(current_activations_with_grad) return pos_loss - def generate_lpl_loss_decorrelative(self) -> Tensor: + def generate_lpl_loss_decorrelative(self, current_activations_with_grad: torch.Tensor) -> Tensor: def generate_loss(activations: torch.Tensor) -> torch.Tensor: # Compute the mean across the batch dimension mean_act = torch.mean(activations, dim=0) @@ -468,8 +474,8 @@ def generate_loss(activations: torch.Tensor) -> torch.Tensor: return loss - pos_loss = generate_loss(self.pos_activations.current) - + assert current_activations_with_grad.requires_grad == True + pos_loss = generate_loss(current_activations_with_grad) return pos_loss # @profile(stdout=False, filename='baseline.prof', @@ -526,13 +532,17 @@ def train_layer(self, # type: ignore[override] pos_badness - self.settings.model.loss_threshold ).mean() ff_layer_loss = self.settings.model.loss_scale_ff * ff_layer_loss - lpl_loss_predictive: Tensor = self.settings.model.loss_scale_predictive * \ - self.generate_lpl_loss_predictive() + self.generate_lpl_loss_predictive(pos_activations) lpl_loss_hebbian: Tensor = self.settings.model.loss_scale_hebbian * \ - self.generate_lpl_loss_hebbian() + self.generate_lpl_loss_hebbian(pos_activations) lpl_loss_decorrelative: Tensor = self.settings.model.loss_scale_decorrelative * \ - self.generate_lpl_loss_decorrelative() + self.generate_lpl_loss_decorrelative(pos_activations) + + assert ff_layer_loss.requires_grad == True + assert lpl_loss_predictive.requires_grad == True + assert lpl_loss_hebbian.requires_grad == True + assert lpl_loss_decorrelative.requires_grad == True if random.random() < 0.005: # print("pos_act: ", pos_activations) @@ -544,13 +554,30 @@ def train_layer(self, # type: ignore[override] layer_loss: Tensor = ff_layer_loss + lpl_loss_predictive + \ lpl_loss_hebbian + lpl_loss_decorrelative + print(self.size) + print(pos_activations) + # print(layer_loss) + # for name, param in self.named_parameters(): + # print(name, param.grad) + # optimizer_params = [] + # for d in self.optimizer.param_groups: + # for tensor in d['params']: + # print(tensor.shape) + # optimizer_params.append(tensor) + # print("optimizer params") + # input() + # input() + # print() layer_loss.backward() # params = dict(self.named_parameters()) - # params['pos_activations'] = pos_activations - # dot = make_dot(layer_loss, params=dict(params)) + # dot = make_dot(layer_loss, params=params) # dot.render('computation_graph', format='png') + # input() + # print all grads of parameters + for name, param in self.named_parameters(): + print(name, param.grad) self.optimizer.step() return cast(float, layer_loss.item()) diff --git a/RecurrentFF/model/model.py b/RecurrentFF/model/model.py index 98a5b8f..912bfdf 100644 --- a/RecurrentFF/model/model.py +++ b/RecurrentFF/model/model.py @@ -172,6 +172,9 @@ def train_model(self, train_loader: torch.utils.data.DataLoader, test_loader: to self.train() for batch_num, (input_data, label_data) in enumerate(train_loader): + # if batch_num == 1: + # break + input_data.move_to_device_inplace(self.settings.device.device) label_data.move_to_device_inplace(self.settings.device.device) @@ -229,8 +232,6 @@ def __train_batch( for preinit_step in range(0, self.settings.model.prelabel_timesteps): logging.debug("Preinitialization step: " + str(preinit_step)) - print("Preinitialization step: " + - str(preinit_step)) pos_input = input_data.pos_input[0] # neg_input = input_data.neg_input[0] diff --git a/computation_graph b/computation_graph index 477f1a1..ec9a32a 100644 --- a/computation_graph +++ b/computation_graph @@ -1,72 +1,143 @@ digraph { - graph [size="12,12"] + graph [size="19.8,19.8"] node [align=left fontname=monospace fontsize=10 height=0.2 ranksep=0.1 shape=box style=filled] - 5135880304 [label=" + 5028592144 [label=" ()" fillcolor=darkolivegreen1] - 5135741136 [label=AddBackward0] - 5135740944 -> 5135741136 - 5135740944 [label=AddBackward0] - 5135742096 -> 5135740944 - 5135742096 [label=AddBackward0] - 5135742144 -> 5135742096 - 5135742144 [label=MulBackward0] - 5135742336 -> 5135742144 - 5135742336 [label=MeanBackward0] - 5135742432 -> 5135742336 - 5135742432 [label=SoftplusBackward0] - 5135742528 -> 5135742432 - 5135742528 [label=SubBackward0] - 5135742624 -> 5135742528 - 5135742624 [label=MeanBackward1] - 5135742720 -> 5135742624 - 5135742720 [label=PowBackward0] - 5135742816 -> 5135742720 - 5135742816 [label=AddBackward0] - 5135742912 -> 5135742816 - 5135742912 [label=MulBackward0] - 5135743008 -> 5135742912 - 5135743008 [label=LeakyReluBackward0] - 5135743104 -> 5135743008 - 5135743104 [label=AddBackward0] - 5135743200 -> 5135743104 - 5135743200 [label=AddBackward0] - 5135743344 -> 5135743200 - 5135743344 [label=LinearBackward0] - 5135333504 -> 5135743344 - 5135249680 [label="forward_linear.weight - (705, 704)" fillcolor=lightblue] - 5135249680 -> 5135333504 - 5135333504 [label=AccumulateGrad] - 5135333552 -> 5135743344 - 5135249392 [label="forward_linear.bias - (705)" fillcolor=lightblue] - 5135249392 -> 5135333552 - 5135333552 [label=AccumulateGrad] - 5135743296 -> 5135743200 - 5135743296 [label=MulBackward0] - 5135743392 -> 5135743296 - 5135743392 [label=LinearBackward0] - 5135334320 -> 5135743392 - 5135485936 [label="backward_linear.weight - (705, 10)" fillcolor=lightblue] - 5135485936 -> 5135334320 - 5135334320 [label=AccumulateGrad] - 5135333600 -> 5135743392 - 5135483728 [label="backward_linear.bias - (705)" fillcolor=lightblue] - 5135483728 -> 5135333600 - 5135333600 [label=AccumulateGrad] - 5135743152 -> 5135743104 - 5135743152 [label=LinearBackward0] - 5135333456 -> 5135743152 - 5135484496 [label="lateral_linear.weight - (705, 705)" fillcolor=lightblue] - 5135484496 -> 5135333456 - 5135333456 [label=AccumulateGrad] - 5135333744 -> 5135743152 - 5135483824 [label="lateral_linear.bias - (705)" fillcolor=lightblue] - 5135483824 -> 5135333744 - 5135333744 [label=AccumulateGrad] - 5135741136 -> 5135880304 + 5028444480 [label=AddBackward0] + 5028444624 -> 5028444480 + 5028444624 [label=AddBackward0] + 5028444528 -> 5028444624 + 5028444528 [label=AddBackward0] + 5028444912 -> 5028444528 + 5028444912 [label=MulBackward0] + 5028445056 -> 5028444912 + 5028445056 [label=MeanBackward0] + 5028445152 -> 5028445056 + 5028445152 [label=SoftplusBackward0] + 5028445248 -> 5028445152 + 5028445248 [label=SubBackward0] + 5028445344 -> 5028445248 + 5028445344 [label=MeanBackward1] + 5028445440 -> 5028445344 + 5028445440 [label=PowBackward0] + 5028445488 -> 5028445440 + 5028445488 [label=LeakyReluBackward0] + 5028445632 -> 5028445488 + 5028445632 [label=AddBackward0] + 5028445776 -> 5028445632 + 5028445776 [label=AddBackward0] + 5028446016 -> 5028445776 + 5028446016 [label=LinearBackward0] + 5028446160 -> 5028446016 + 5028007568 [label="forward_linear.weight + (701, 784)" fillcolor=lightblue] + 5028007568 -> 5028446160 + 5028446160 [label=AccumulateGrad] + 5028446112 -> 5028446016 + 5028005648 [label="forward_linear.bias + (701)" fillcolor=lightblue] + 5028005648 -> 5028446112 + 5028446112 [label=AccumulateGrad] + 5028445968 -> 5028445776 + 5028445968 [label=MulBackward0] + 5028446064 -> 5028445968 + 5028446064 [label=LinearBackward0] + 5028856112 -> 5028446064 + 5028009104 [label="backward_linear.weight + (701, 702)" fillcolor=lightblue] + 5028009104 -> 5028856112 + 5028856112 [label=AccumulateGrad] + 5028856064 -> 5028446064 + 5028009296 [label="backward_linear.bias + (701)" fillcolor=lightblue] + 5028009296 -> 5028856064 + 5028856064 [label=AccumulateGrad] + 5028445728 -> 5028445632 + 5028445728 [label=LinearBackward0] + 5028445920 -> 5028445728 + 5028008432 [label="lateral_linear.weight + (701, 701)" fillcolor=lightblue] + 5028008432 -> 5028445920 + 5028445920 [label=AccumulateGrad] + 5028855872 -> 5028445728 + 5028008816 [label="lateral_linear.bias + (701)" fillcolor=lightblue] + 5028008816 -> 5028855872 + 5028855872 [label=AccumulateGrad] + 5028444864 -> 5028444528 + 5028444864 [label=MulBackward0] + 5028445200 -> 5028444864 + 5028445200 [label=DivBackward0] + 5028445392 -> 5028445200 + 5028445392 [label=SumBackward1] + 5028445584 -> 5028445392 + 5028445584 [label=SumBackward1] + 5028445872 -> 5028445584 + 5028445872 [label=PowBackward0] + 5028856208 -> 5028445872 + 5028856208 [label=SubBackward0] + 5028445488 -> 5028856208 + 5028444768 -> 5028444624 + 5028444768 [label=MulBackward0] + 5028445296 -> 5028444768 + 5028445296 [label=DivBackward0] + 5028445008 -> 5028445296 + 5028445008 [label=NegBackward0] + 5028444816 -> 5028445008 + 5028444816 [label=SumBackward0] + 5028856016 -> 5028444816 + 5028856016 [label=LogBackward0] + 5028856400 -> 5028856016 + 5028856400 [label=DivBackward0] + 5028856496 -> 5028856400 + 5028856496 [label=SumBackward1] + 5028856592 -> 5028856496 + 5028856592 [label=PowBackward0] + 5028856688 -> 5028856592 + 5028856688 [label=SubBackward0] + 5028445488 -> 5028856688 + 5028856784 -> 5028856688 + 5028856784 [label=MeanBackward1] + 5028445488 -> 5028856784 + 5028444672 -> 5028444480 + 5028444672 [label=MulBackward0] + 5028444960 -> 5028444672 + 5028444960 [label=DivBackward0] + 5028444384 -> 5028444960 + 5028444384 [label=SubBackward0] + 5028856448 -> 5028444384 + 5028856448 [label=SumBackward0] + 5028856736 -> 5028856448 + 5028856736 [label=MulBackward0] + 5028856832 -> 5028856736 + 5028856832 [label=PermuteBackward0] + 5028856976 -> 5028856832 + 5028856976 [label=UnsqueezeBackward0] + 5028857072 -> 5028856976 + 5028857072 [label=PowBackward0] + 5028857168 -> 5028857072 + 5028857168 [label=SubBackward0] + 5028445488 -> 5028857168 + 5028857264 -> 5028857168 + 5028857264 [label=MeanBackward1] + 5028445488 -> 5028857264 + 5028856880 -> 5028856736 + 5028856880 [label=PermuteBackward0] + 5028857120 -> 5028856880 + 5028857120 [label=UnsqueezeBackward0] + 5028857072 -> 5028857120 + 5028856352 -> 5028444384 + 5028856352 [label=DivBackward0] + 5028857024 -> 5028856352 + 5028857024 [label=SumBackward0] + 5028857216 -> 5028857024 + 5028857216 [label=SumBackward1] + 5028857312 -> 5028857216 + 5028857312 [label=PermuteBackward0] + 5028857408 -> 5028857312 + 5028857408 [label=PermuteBackward0] + 5028857504 -> 5028857408 + 5028857504 [label=DiagonalBackward0] + 5028856736 -> 5028857504 + 5028444480 -> 5028592144 } diff --git a/computation_graph.png b/computation_graph.png index c6786fefec1c8405bdf88970024e22bf4f67bd1f..dec20856c8005ce80dacfb6220421106b0e695b0 100644 GIT binary patch literal 153116 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

AV%fA3WB@ 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 AP5=M^ literal 57328 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%0Dwc1rhLCdC{C4~Gi>1s*}?Ab{Ws#vZuCq45yo7z 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 BPN)C? From 86831538e3130afd1f9bc69aad262caa08f8d5ea Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 19 Jun 2024 16:01:30 -0700 Subject: [PATCH 04/13] hyperparams --- config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.toml b/config.toml index 70381d2..d2fcd3a 100644 --- a/config.toml +++ b/config.toml @@ -2,7 +2,7 @@ device = "mps" [model] -hidden_sizes = [701, 702, 703, 704, 705] +hidden_sizes = [1, 2, 3, 4, 5] epochs = 30000 prelabel_timesteps = 10 loss_threshold = 1.5 From bb9488e4f4684023a569972503ef301fd5ca226e Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 19 Jun 2024 16:47:44 -0700 Subject: [PATCH 05/13] progress --- RecurrentFF/model/hidden_layer.py | 18 ++++++++++++++---- config.toml | 10 +++++----- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/RecurrentFF/model/hidden_layer.py b/RecurrentFF/model/hidden_layer.py index 88a7e09..ab3abe9 100644 --- a/RecurrentFF/model/hidden_layer.py +++ b/RecurrentFF/model/hidden_layer.py @@ -455,22 +455,28 @@ def generate_lpl_loss_decorrelative(self, current_activations_with_grad: torch.T def generate_loss(activations: torch.Tensor) -> torch.Tensor: # Compute the mean across the batch dimension mean_act = torch.mean(activations, dim=0) + # print("mean_act", mean_act) # Subtract mean from activations and square the result deviations = (activations - mean_act) ** 2 + # print("deviations", deviations[0]) # Outer product along feature dimension for each batch # This computes the pairwise squared differences efficiently loss = torch.einsum('bi,bj->bij', deviations, deviations) + # print("loss", loss[0]) # Sum over all batches and features, exclude the diagonal elements # Diagonal elements correspond to the squared terms which we want to avoid batch_size, n_features = activations.shape loss = torch.sum(loss) - \ torch.sum(torch.einsum('bii->b', loss)) / 2 + # print("loss", loss) # Normalize the loss + # print("batch size * n_features * (n_features - 1)", batch_size * n_features * (n_features - 1)) loss = loss / (batch_size * n_features * (n_features - 1)) + # print("loss", loss) return loss @@ -554,8 +560,12 @@ def train_layer(self, # type: ignore[override] layer_loss: Tensor = ff_layer_loss + lpl_loss_predictive + \ lpl_loss_hebbian + lpl_loss_decorrelative + print(ff_layer_loss) + print(lpl_loss_predictive) + print(lpl_loss_hebbian) + print(lpl_loss_decorrelative) print(self.size) - print(pos_activations) + print(pos_activations[0]) # print(layer_loss) # for name, param in self.named_parameters(): # print(name, param.grad) @@ -565,7 +575,7 @@ def train_layer(self, # type: ignore[override] # print(tensor.shape) # optimizer_params.append(tensor) # print("optimizer params") - # input() + input() # input() # print() layer_loss.backward() @@ -576,8 +586,8 @@ def train_layer(self, # type: ignore[override] # input() # print all grads of parameters - for name, param in self.named_parameters(): - print(name, param.grad) + # for name, param in self.named_parameters(): + # print(name, param.grad) self.optimizer.step() return cast(float, layer_loss.item()) diff --git a/config.toml b/config.toml index d2fcd3a..30256dc 100644 --- a/config.toml +++ b/config.toml @@ -2,7 +2,7 @@ device = "mps" [model] -hidden_sizes = [1, 2, 3, 4, 5] +hidden_sizes = [2, 3, 4, 5, 6] epochs = 30000 prelabel_timesteps = 10 loss_threshold = 1.5 @@ -18,10 +18,10 @@ should_load_weights = false lr_step_size = 10000 lr_gamma = 0.90 dropout = 0.0 -loss_scale_ff = 0 -loss_scale_predictive = 0 -loss_scale_hebbian = 0 -loss_scale_decorrelative = 0 +loss_scale_ff = 1 +loss_scale_predictive = 1 +loss_scale_hebbian = 1 +loss_scale_decorrelative = 1 [model.ff_rmsprop] momentum = 0.0 From c3d17ea0051ae20e5347bad9670c849ea6484272 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 20 Jun 2024 13:33:39 -0700 Subject: [PATCH 06/13] loss adjustment --- RecurrentFF/benchmarks/mnist/mnist.py | 2 +- .../data_scenario/static_single_class.py | 169 +++++++++--------- RecurrentFF/model/hidden_layer.py | 79 ++++---- RecurrentFF/model/model.py | 3 - config.toml | 10 +- 5 files changed, 139 insertions(+), 124 deletions(-) diff --git a/RecurrentFF/benchmarks/mnist/mnist.py b/RecurrentFF/benchmarks/mnist/mnist.py index aaabd80..90e7754 100644 --- a/RecurrentFF/benchmarks/mnist/mnist.py +++ b/RecurrentFF/benchmarks/mnist/mnist.py @@ -12,7 +12,7 @@ DATA_SIZE = 784 NUM_CLASSES = 10 TRAIN_BATCH_SIZE = 500 -TEST_BATCH_SIZE = 5000 +TEST_BATCH_SIZE = 500 ITERATIONS = 15 DATASET = "MNIST" diff --git a/RecurrentFF/model/data_scenario/static_single_class.py b/RecurrentFF/model/data_scenario/static_single_class.py index d771fac..8159146 100644 --- a/RecurrentFF/model/data_scenario/static_single_class.py +++ b/RecurrentFF/model/data_scenario/static_single_class.py @@ -388,102 +388,101 @@ class label, using a two-step process: if limit_batches is not None and batch == limit_batches: break - with torch.no_grad(): - data, labels = test_data - data = data.to(self.settings.device.device) - labels = labels.to(self.settings.device.device) + data, labels = test_data + data = data.to(self.settings.device.device) + labels = labels.to(self.settings.device.device) - if write_activations: - activity_tracker.reinitialize(data, labels) - - # since this is static singleclass we can use the first frame - # for the label - labels = labels[0] - - iterations = data.shape[0] - - all_labels_badness = [] - - # evaluate badness for each possible label - for label in range(self.settings.data_config.num_classes): - self.inner_layers.reset_activations(True) - - upper_clamped_tensor = self.get_preinit_upper_clamped_tensor( - (data.shape[1], self.settings.data_config.num_classes)) - - for _preinit_step in range( - 0, self.settings.model.prelabel_timesteps): - self.inner_layers.advance_layers_forward( - data[0], upper_clamped_tensor, False) - if write_activations: - activity_tracker.track_partial_activations( - self.inner_layers) - - one_hot_labels = torch.zeros( - data.shape[1], - self.settings.data_config.num_classes, - device=self.settings.device.device) - one_hot_labels[:, label] = 1.0 - - lower_iteration_threshold = iterations // 2 - \ - iterations // 10 - upper_iteration_threshold = iterations // 2 + \ - iterations // 10 - badnesses = [] - for iteration in range(0, iterations): - self.inner_layers.advance_layers_forward( - data[iteration], one_hot_labels, True) - if write_activations: - activity_tracker.track_partial_activations( - self.inner_layers) - - if iteration >= lower_iteration_threshold and iteration <= upper_iteration_threshold: - layer_badnesses = [] - for layer in self.inner_layers: - activations = cast(Activations, layer.pos_activations).current \ - if forward_mode == ForwardMode.PositiveData \ - else cast(Activations, layer.predict_activations).current - - layer_badnesses.append( - layer_activations_to_badness( - activations)) - - badnesses.append(torch.stack( - layer_badnesses, dim=1)) + if write_activations: + activity_tracker.reinitialize(data, labels) + + # since this is static singleclass we can use the first frame + # for the label + labels = labels[0] + + iterations = data.shape[0] + + all_labels_badness = [] + + # evaluate badness for each possible label + for label in range(self.settings.data_config.num_classes): + self.inner_layers.reset_activations(True) + + upper_clamped_tensor = self.get_preinit_upper_clamped_tensor( + (data.shape[1], self.settings.data_config.num_classes)) + for _preinit_step in range( + 0, self.settings.model.prelabel_timesteps): + self.inner_layers.advance_layers_forward( + data[0], upper_clamped_tensor, False) if write_activations: - activity_tracker.cut_activations() + activity_tracker.track_partial_activations( + self.inner_layers) - # tensor of shape (batch_size, iterations, num_layers) - badnesses_stacked = torch.stack(badnesses, dim=1) - badnesses_mean_over_iterations = badnesses_stacked.mean( - dim=1) - badness_mean_over_layers = badnesses_mean_over_iterations.mean( - dim=1) + one_hot_labels = torch.zeros( + data.shape[1], + self.settings.data_config.num_classes, + device=self.settings.device.device) + one_hot_labels[:, label] = 1.0 + + lower_iteration_threshold = iterations // 2 - \ + iterations // 10 + upper_iteration_threshold = iterations // 2 + \ + iterations // 10 + badnesses = [] + for iteration in range(0, iterations): + self.inner_layers.advance_layers_forward( + data[iteration], one_hot_labels, True) + if write_activations: + activity_tracker.track_partial_activations( + self.inner_layers) - logging.debug("Badness for prediction" + " " + - str(label) + ": " + str(badness_mean_over_layers)) - all_labels_badness.append(badness_mean_over_layers) + if iteration >= lower_iteration_threshold and iteration <= upper_iteration_threshold: + layer_badnesses = [] + for layer in self.inner_layers: + activations = cast(Activations, layer.pos_activations).current \ + if forward_mode == ForwardMode.PositiveData \ + else cast(Activations, layer.predict_activations).current - all_labels_badness_stacked = torch.stack( - all_labels_badness, dim=1) + layer_badnesses.append( + layer_activations_to_badness( + activations)) + + badnesses.append(torch.stack( + layer_badnesses, dim=1)) - # select the label with the maximum badness - predicted_labels = torch.argmin( - all_labels_badness_stacked, dim=1) if write_activations: - anti_predictions = torch.argmax( - all_labels_badness_stacked, dim=1) - activity_tracker.filter_and_persist( - predicted_labels, anti_predictions, labels) + activity_tracker.cut_activations() + + # tensor of shape (batch_size, iterations, num_layers) + badnesses_stacked = torch.stack(badnesses, dim=1) + badnesses_mean_over_iterations = badnesses_stacked.mean( + dim=1) + badness_mean_over_layers = badnesses_mean_over_iterations.mean( + dim=1) + + logging.debug("Badness for prediction" + " " + + str(label) + ": " + str(badness_mean_over_layers)) + all_labels_badness.append(badness_mean_over_layers) + + all_labels_badness_stacked = torch.stack( + all_labels_badness, dim=1) + + # select the label with the maximum badness + predicted_labels = torch.argmin( + all_labels_badness_stacked, dim=1) + if write_activations: + anti_predictions = torch.argmax( + all_labels_badness_stacked, dim=1) + activity_tracker.filter_and_persist( + predicted_labels, anti_predictions, labels) - logging.debug("Predicted labels: " + str(predicted_labels)) - logging.debug("Actual labels: " + str(labels)) + logging.debug("Predicted labels: " + str(predicted_labels)) + logging.debug("Actual labels: " + str(labels)) - total = data.size(1) - correct = (predicted_labels == labels).sum().item() + total = data.size(1) + correct = (predicted_labels == labels).sum().item() - accuracy_contexts.append((correct, total)) + accuracy_contexts.append((correct, total)) total_correct = sum(correct for correct, _total in accuracy_contexts) total_submissions = sum( diff --git a/RecurrentFF/model/hidden_layer.py b/RecurrentFF/model/hidden_layer.py index ab3abe9..de49f47 100644 --- a/RecurrentFF/model/hidden_layer.py +++ b/RecurrentFF/model/hidden_layer.py @@ -439,12 +439,16 @@ def generate_loss(current_act: Tensor, previous_act: Tensor) -> Tensor: def generate_lpl_loss_hebbian(self, current_activations_with_grad: torch.Tensor) -> Tensor: def generate_loss(activations: Tensor) -> Tensor: mean_act = torch.mean(activations, dim=0) + # print("mean_act:", mean_act) mean_subtracted = activations - mean_act + # print("mean: ", mean_subtracted) sigma_squared = torch.sum( mean_subtracted ** 2, dim=0) / (activations.shape[0] - 1) + # print("sigma: ", sigma_squared) - loss = -torch.log(sigma_squared).sum() / sigma_squared.shape[0] + loss = -torch.log(sigma_squared + 0.00000001).sum() / sigma_squared.shape[0] + # print("loss: ", loss) return loss assert current_activations_with_grad.requires_grad == True @@ -532,40 +536,56 @@ def train_layer(self, # type: ignore[override] # ForwardMode.NegativeData, None, None, should_damp) pos_badness = layer_activations_to_badness(pos_activations) - # neg_badness = layer_activations_to_badness(neg_activations) - ff_layer_loss: Tensor = F.softplus( pos_badness - self.settings.model.loss_threshold ).mean() ff_layer_loss = self.settings.model.loss_scale_ff * ff_layer_loss - lpl_loss_predictive: Tensor = self.settings.model.loss_scale_predictive * \ - self.generate_lpl_loss_predictive(pos_activations) - lpl_loss_hebbian: Tensor = self.settings.model.loss_scale_hebbian * \ - self.generate_lpl_loss_hebbian(pos_activations) - lpl_loss_decorrelative: Tensor = self.settings.model.loss_scale_decorrelative * \ - self.generate_lpl_loss_decorrelative(pos_activations) + + # y = 4exp(-log(x+1.5)) + ff_layer_loss_min: Tensor = torch.sqrt(torch.square(pos_activations) + 0.001).mean() + ff_layer_loss_min = 4 * torch.exp(-torch.log(ff_layer_loss_min + self.settings.model.loss_threshold)) + + # lpl_loss_predictive: Tensor = self.settings.model.loss_scale_predictive * \ + # self.generate_lpl_loss_predictive(pos_activations) + # lpl_loss_hebbian: Tensor = self.settings.model.loss_scale_hebbian * \ + # self.generate_lpl_loss_hebbian(pos_activations) + # lpl_loss_decorrelative: Tensor = self.settings.model.loss_scale_decorrelative * \ + # self.generate_lpl_loss_decorrelative(pos_activations) assert ff_layer_loss.requires_grad == True - assert lpl_loss_predictive.requires_grad == True - assert lpl_loss_hebbian.requires_grad == True - assert lpl_loss_decorrelative.requires_grad == True - - if random.random() < 0.005: - # print("pos_act: ", pos_activations) - print("ff_layer_loss: ", ff_layer_loss) - print("lpl_loss_predictive: ", lpl_loss_predictive) - print("lpl_loss_hebbian: ", lpl_loss_hebbian) - print("lpl_loss_decorrelative: ", lpl_loss_decorrelative) - print() - - layer_loss: Tensor = ff_layer_loss + lpl_loss_predictive + \ - lpl_loss_hebbian + lpl_loss_decorrelative - print(ff_layer_loss) - print(lpl_loss_predictive) - print(lpl_loss_hebbian) - print(lpl_loss_decorrelative) - print(self.size) - print(pos_activations[0]) + assert ff_layer_loss_min.requires_grad == True + # assert lpl_loss_predictive.requires_grad == True + # assert lpl_loss_hebbian.requires_grad == True + # assert lpl_loss_decorrelative.requires_grad == True + + # if random.random() < 0.005: + # # print("pos_act: ", pos_activations) + # print("ff_layer_loss: ", ff_layer_loss) + # print("lpl_loss_predictive: ", lpl_loss_predictive) + # print("lpl_loss_hebbian: ", lpl_loss_hebbian) + # print("lpl_loss_decorrelative: ", lpl_loss_decorrelative) + # print() + + # layer_loss: Tensor = ff_layer_loss + lpl_loss_predictive + \ + # lpl_loss_hebbian + lpl_loss_decorrelative + ff_layer_loss_min + layer_loss: Tensor = ff_layer_loss + ff_layer_loss_min + + # print(ff_layer_loss) + # print(lpl_loss_predictive) + # print(lpl_loss_hebbian) + # print(lpl_loss_decorrelative) + + # important block + # + # print("ff_layer_loss: ", ff_layer_loss) + # print("lpl_loss_predictive: ", lpl_loss_predictive) + # print("lpl_loss_hebbian: ", lpl_loss_hebbian) + # print("lpl_loss_decorrelative: ", lpl_loss_decorrelative) + # print(self.size) + + # print(pos_activations[0]) + # input() + # print(layer_loss) # for name, param in self.named_parameters(): # print(name, param.grad) @@ -575,7 +595,6 @@ def train_layer(self, # type: ignore[override] # print(tensor.shape) # optimizer_params.append(tensor) # print("optimizer params") - input() # input() # print() layer_loss.backward() diff --git a/RecurrentFF/model/model.py b/RecurrentFF/model/model.py index 912bfdf..8ee7435 100644 --- a/RecurrentFF/model/model.py +++ b/RecurrentFF/model/model.py @@ -172,9 +172,6 @@ def train_model(self, train_loader: torch.utils.data.DataLoader, test_loader: to self.train() for batch_num, (input_data, label_data) in enumerate(train_loader): - # if batch_num == 1: - # break - input_data.move_to_device_inplace(self.settings.device.device) label_data.move_to_device_inplace(self.settings.device.device) diff --git a/config.toml b/config.toml index 30256dc..19f8d22 100644 --- a/config.toml +++ b/config.toml @@ -2,7 +2,7 @@ device = "mps" [model] -hidden_sizes = [2, 3, 4, 5, 6] +hidden_sizes = [100, 100, 100, 100, 100] epochs = 30000 prelabel_timesteps = 10 loss_threshold = 1.5 @@ -19,13 +19,13 @@ lr_step_size = 10000 lr_gamma = 0.90 dropout = 0.0 loss_scale_ff = 1 -loss_scale_predictive = 1 -loss_scale_hebbian = 1 -loss_scale_decorrelative = 1 +loss_scale_predictive = 0 +loss_scale_hebbian = 0 +loss_scale_decorrelative = 0 [model.ff_rmsprop] momentum = 0.0 -learning_rate = 0.000005 +learning_rate = 0.0005 [model.classifier_rmsprop] momentum = 0 From fb543e06c79916c5689d76af4cbf36e6a3a693e6 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 20 Jun 2024 13:35:04 -0700 Subject: [PATCH 07/13] hidden layer lpl loss now using --- RecurrentFF/model/hidden_layer.py | 30 +++++++++++++++--------------- config.toml | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/RecurrentFF/model/hidden_layer.py b/RecurrentFF/model/hidden_layer.py index de49f47..940d4df 100644 --- a/RecurrentFF/model/hidden_layer.py +++ b/RecurrentFF/model/hidden_layer.py @@ -542,21 +542,21 @@ def train_layer(self, # type: ignore[override] ff_layer_loss = self.settings.model.loss_scale_ff * ff_layer_loss # y = 4exp(-log(x+1.5)) - ff_layer_loss_min: Tensor = torch.sqrt(torch.square(pos_activations) + 0.001).mean() - ff_layer_loss_min = 4 * torch.exp(-torch.log(ff_layer_loss_min + self.settings.model.loss_threshold)) + # ff_layer_loss_min: Tensor = torch.sqrt(torch.square(pos_activations) + 0.001).mean() + # ff_layer_loss_min = 4 * torch.exp(-torch.log(ff_layer_loss_min + self.settings.model.loss_threshold)) - # lpl_loss_predictive: Tensor = self.settings.model.loss_scale_predictive * \ - # self.generate_lpl_loss_predictive(pos_activations) - # lpl_loss_hebbian: Tensor = self.settings.model.loss_scale_hebbian * \ - # self.generate_lpl_loss_hebbian(pos_activations) - # lpl_loss_decorrelative: Tensor = self.settings.model.loss_scale_decorrelative * \ - # self.generate_lpl_loss_decorrelative(pos_activations) + lpl_loss_predictive: Tensor = self.settings.model.loss_scale_predictive * \ + self.generate_lpl_loss_predictive(pos_activations) + lpl_loss_hebbian: Tensor = self.settings.model.loss_scale_hebbian * \ + self.generate_lpl_loss_hebbian(pos_activations) + lpl_loss_decorrelative: Tensor = self.settings.model.loss_scale_decorrelative * \ + self.generate_lpl_loss_decorrelative(pos_activations) assert ff_layer_loss.requires_grad == True - assert ff_layer_loss_min.requires_grad == True - # assert lpl_loss_predictive.requires_grad == True - # assert lpl_loss_hebbian.requires_grad == True - # assert lpl_loss_decorrelative.requires_grad == True + # assert ff_layer_loss_min.requires_grad == True + assert lpl_loss_predictive.requires_grad == True + assert lpl_loss_hebbian.requires_grad == True + assert lpl_loss_decorrelative.requires_grad == True # if random.random() < 0.005: # # print("pos_act: ", pos_activations) @@ -566,9 +566,9 @@ def train_layer(self, # type: ignore[override] # print("lpl_loss_decorrelative: ", lpl_loss_decorrelative) # print() - # layer_loss: Tensor = ff_layer_loss + lpl_loss_predictive + \ - # lpl_loss_hebbian + lpl_loss_decorrelative + ff_layer_loss_min - layer_loss: Tensor = ff_layer_loss + ff_layer_loss_min + layer_loss: Tensor = ff_layer_loss + lpl_loss_predictive + \ + lpl_loss_hebbian + lpl_loss_decorrelative + # layer_loss: Tensor = ff_layer_loss + ff_layer_loss_min # print(ff_layer_loss) # print(lpl_loss_predictive) diff --git a/config.toml b/config.toml index 19f8d22..0215263 100644 --- a/config.toml +++ b/config.toml @@ -25,7 +25,7 @@ loss_scale_decorrelative = 0 [model.ff_rmsprop] momentum = 0.0 -learning_rate = 0.0005 +learning_rate = 0.000005 [model.classifier_rmsprop] momentum = 0 From 19056d6cb9fa715a3718c1a2fd411a776bc6fb20 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 20 Jun 2024 13:39:33 -0700 Subject: [PATCH 08/13] do not reset activations --- .../data_scenario/static_single_class.py | 2 +- RecurrentFF/model/hidden_layer.py | 106 +++++++++++------- RecurrentFF/model/model.py | 2 +- 3 files changed, 70 insertions(+), 40 deletions(-) diff --git a/RecurrentFF/model/data_scenario/static_single_class.py b/RecurrentFF/model/data_scenario/static_single_class.py index 8159146..d1958a8 100644 --- a/RecurrentFF/model/data_scenario/static_single_class.py +++ b/RecurrentFF/model/data_scenario/static_single_class.py @@ -405,7 +405,7 @@ class label, using a two-step process: # evaluate badness for each possible label for label in range(self.settings.data_config.num_classes): - self.inner_layers.reset_activations(True) + # self.inner_layers.reset_activations(True) upper_clamped_tensor = self.get_preinit_upper_clamped_tensor( (data.shape[1], self.settings.data_config.num_classes)) diff --git a/RecurrentFF/model/hidden_layer.py b/RecurrentFF/model/hidden_layer.py index 940d4df..7b22308 100644 --- a/RecurrentFF/model/hidden_layer.py +++ b/RecurrentFF/model/hidden_layer.py @@ -366,44 +366,74 @@ def step_learning_rate(self) -> None: self.scheduler.step() def reset_activations(self, isTraining: bool) -> None: - activations_dim = None - if isTraining: - activations_dim = self.train_activations_dim - - pos_activations_current = torch.zeros( - activations_dim[0], activations_dim[1], requires_grad=False).to( - self.settings.device.device) - pos_activations_previous = torch.zeros( - activations_dim[0], activations_dim[1], requires_grad=False).to( - self.settings.device.device) - self.pos_activations = Activations( - pos_activations_current, pos_activations_previous) - - neg_activations_current = torch.zeros( - activations_dim[0], activations_dim[1], requires_grad=False).to( - self.settings.device.device) - neg_activations_previous = torch.zeros( - activations_dim[0], activations_dim[1], requires_grad=False).to( - self.settings.device.device) - self.neg_activations = Activations( - neg_activations_current, neg_activations_previous) - - self.predict_activations = None - - else: - activations_dim = self.test_activations_dim - - predict_activations_current = torch.zeros( - activations_dim[0], activations_dim[1], requires_grad=False).to( - self.settings.device.device) - predict_activations_previous = torch.zeros( - activations_dim[0], activations_dim[1], requires_grad=False).to( - self.settings.device.device) - self.predict_activations = Activations( - predict_activations_current, predict_activations_previous) - - self.pos_activations = None - self.neg_activations = None + activations_dim = self.train_activations_dim + + pos_activations_current = torch.zeros( + activations_dim[0], activations_dim[1], requires_grad=False).to( + self.settings.device.device) + pos_activations_previous = torch.zeros( + activations_dim[0], activations_dim[1], requires_grad=False).to( + self.settings.device.device) + self.pos_activations = Activations( + pos_activations_current, pos_activations_previous) + + neg_activations_current = torch.zeros( + activations_dim[0], activations_dim[1], requires_grad=False).to( + self.settings.device.device) + neg_activations_previous = torch.zeros( + activations_dim[0], activations_dim[1], requires_grad=False).to( + self.settings.device.device) + self.neg_activations = Activations( + neg_activations_current, neg_activations_previous) + + activations_dim = self.test_activations_dim + + predict_activations_current = torch.zeros( + activations_dim[0], activations_dim[1], requires_grad=False).to( + self.settings.device.device) + predict_activations_previous = torch.zeros( + activations_dim[0], activations_dim[1], requires_grad=False).to( + self.settings.device.device) + self.predict_activations = Activations( + predict_activations_current, predict_activations_previous) + + # if isTraining: + # activations_dim = self.train_activations_dim + + # pos_activations_current = torch.zeros( + # activations_dim[0], activations_dim[1], requires_grad=False).to( + # self.settings.device.device) + # pos_activations_previous = torch.zeros( + # activations_dim[0], activations_dim[1], requires_grad=False).to( + # self.settings.device.device) + # self.pos_activations = Activations( + # pos_activations_current, pos_activations_previous) + + # neg_activations_current = torch.zeros( + # activations_dim[0], activations_dim[1], requires_grad=False).to( + # self.settings.device.device) + # neg_activations_previous = torch.zeros( + # activations_dim[0], activations_dim[1], requires_grad=False).to( + # self.settings.device.device) + # self.neg_activations = Activations( + # neg_activations_current, neg_activations_previous) + + # self.predict_activations = None + + # else: + # activations_dim = self.test_activations_dim + + # predict_activations_current = torch.zeros( + # activations_dim[0], activations_dim[1], requires_grad=False).to( + # self.settings.device.device) + # predict_activations_previous = torch.zeros( + # activations_dim[0], activations_dim[1], requires_grad=False).to( + # self.settings.device.device) + # self.predict_activations = Activations( + # predict_activations_current, predict_activations_previous) + + # self.pos_activations = None + # self.neg_activations = None def advance_stored_activations(self) -> None: if self.pos_activations is not None: diff --git a/RecurrentFF/model/model.py b/RecurrentFF/model/model.py index 8ee7435..6744f82 100644 --- a/RecurrentFF/model/model.py +++ b/RecurrentFF/model/model.py @@ -224,7 +224,7 @@ def __train_batch( total_batch_count: int) -> Tuple[LayerMetrics, List[float], List[float]]: logging.info("Batch: " + str(batch_num)) - self.inner_layers.reset_activations(True) + # self.inner_layers.reset_activations(True) for preinit_step in range(0, self.settings.model.prelabel_timesteps): logging.debug("Preinitialization step: " + From 602da49f9695360235d720952e88cee961ace265 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 20 Jun 2024 15:34:04 -0700 Subject: [PATCH 09/13] sweep --- .gitignore | 3 +- RecurrentFF/model/model.py | 6 +- RecurrentFF/search/new_search.py | 188 +++++++++++++++++++++++++++ RecurrentFF/search/sweep_config.yaml | 33 +++++ config.toml | 10 +- 5 files changed, 237 insertions(+), 3 deletions(-) create mode 100644 RecurrentFF/search/new_search.py create mode 100644 RecurrentFF/search/sweep_config.yaml diff --git a/.gitignore b/.gitignore index 9713d0a..625f716 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,5 @@ sequences cifar-data/ .DS_Store *.parquet -.mypy_cache/ \ No newline at end of file +.mypy_cache/ +*.log \ No newline at end of file diff --git a/RecurrentFF/model/model.py b/RecurrentFF/model/model.py index 6744f82..1020eb6 100644 --- a/RecurrentFF/model/model.py +++ b/RecurrentFF/model/model.py @@ -17,7 +17,6 @@ from RecurrentFF.model.inner_layers import InnerLayers, LayerMetrics from RecurrentFF.util import ( Activations, - ForwardMode, LatentAverager, TrainInputData, TrainLabelData, @@ -172,6 +171,9 @@ def train_model(self, train_loader: torch.utils.data.DataLoader, test_loader: to self.train() for batch_num, (input_data, label_data) in enumerate(train_loader): + if batch_num == 1: + break + input_data.move_to_device_inplace(self.settings.device.device) label_data.move_to_device_inplace(self.settings.device.device) @@ -216,6 +218,8 @@ def train_model(self, train_loader: torch.utils.data.DataLoader, test_loader: to self.inner_layers.step_learning_rates() + return train_accuracy + def __train_batch( self, batch_num: int, diff --git a/RecurrentFF/search/new_search.py b/RecurrentFF/search/new_search.py new file mode 100644 index 0000000..cab91d6 --- /dev/null +++ b/RecurrentFF/search/new_search.py @@ -0,0 +1,188 @@ +import logging +import random +import time +from typing import TextIO +import torch +import wandb +from RecurrentFF.benchmarks.mnist.mnist import MNIST_loaders +from RecurrentFF.model.model import RecurrentFFNet +from RecurrentFF.settings import Settings + +from RecurrentFF.util import set_logging + + +# DATA_SIZE = 784 +# NUM_CLASSES = 10 +# TRAIN_BATCH_SIZE = 500 +# TEST_BATCH_SIZE = 500 + +DEVICE = "mps" + +NUM_SEEDS_BENCH = 1 + +datetime_str = time.strftime("%Y%m%d-%H%M%S") +RUNNING_LOG_FILENAME = f"running_log_{datetime_str}.log" + + +def objective() -> None: + wandb.init( + project="Recurrent-FF", + config={ + "architecture": "Recurrent-FF", + "dataset": "MNIST", + }, + # allow_val_change=True # TODOPRE: review this as it is silencing a warning + ) + + settings = Settings.new() + + settings.model.hidden_sizes = [100, 100, 100, 100, 100] + + settings.model.ff_rmsprop.learning_rate = wandb.config.learning_rate + settings.model.ff_rmsprop.momentum = wandb.config.momentum + + settings.model.prelabel_timesteps = wandb.config.prelabel_timesteps + settings.data_config.iterations = wandb.config.iterations + + settings.model.loss_scale_ff = wandb.config.loss_scale_ff + settings.model.loss_scale_predictive = wandb.config.loss_scale_predictive + settings.model.loss_scale_hebbian = wandb.config.loss_scale_hebbian + settings.model.loss_scale_decorrelative = wandb.config.loss_scale_decorrelative + + settings.model.damping_factor = wandb.config.damping_factor + + # layer_sizes = wandb.config.layer_sizes + # learning_rate = wandb.config.learning_rate + # dt = wandb.config.dt + # exc_to_inhib_conn_c = wandb.config.exc_to_inhib_conn_c + # exc_to_inhib_conn_sigma_squared = wandb.config.exc_to_inhib_conn_sigma_squared + # percentage_inhibitory = wandb.config.percentage_inhibitory + # decay_beta = wandb.config.decay_beta + # tau_mean = wandb.config.tau_mean + # tau_var = wandb.config.tau_var + # tau_stdp = wandb.config.tau_stdp + # tau_rise_alpha = wandb.config.tau_rise_alpha + # tau_fall_alpha = wandb.config.tau_fall_alpha + # tau_rise_epsilon = wandb.config.tau_rise_epsilon + # tau_fall_epsilon = wandb.config.tau_fall_epsilon + # threshold_scale = wandb.config.threshold_scale + # threshold_decay = wandb.config.threshold_decay + + # sum layer sizes to get total neurons + # total_neurons = sum(layer_sizes) + # layer_sparsity = NUM_NEURONS_CONNECT_ACROSS_LAYERS / total_neurons + + run_settings = f""" + running with: + settings: {settings.model_dump()} + """ + # run_settings = f""" + # running with: + # layer_sizes: {layer_sizes} + # learning_rate: {learning_rate} + # dt: {dt} + # percentage_inhibitory: {percentage_inhibitory} + # exc_to_inhib_conn_c: {exc_to_inhib_conn_c} + # exc_to_inhib_conn_sigma_squared: {exc_to_inhib_conn_sigma_squared} + # layer_sparsity: {layer_sparsity} + # decay_beta: {decay_beta}, + # tau_mean: {tau_mean}, + # tau_var: {tau_var}, + # tau_stdp: {tau_stdp}, + # tau_rise_alpha: {tau_rise_alpha}, + # tau_fall_alpha: {tau_fall_alpha}, + # tau_rise_epsilon: {tau_rise_epsilon}, + # tau_fall_epsilon: {tau_fall_epsilon}, + # threshold_scale: {threshold_scale}, + # threshold_decay: {threshold_decay}, + # """ + # logging.info(run_settings) + + with open(RUNNING_LOG_FILENAME, "a") as running_log: + running_log.write(f"{run_settings}") + running_log.flush() + + cum_pass_rate = 0 + for _ in range(NUM_SEEDS_BENCH): + pass_rate = bench_specific_seed( + running_log, + settings + ) + wandb.log({"train_accuracy": pass_rate}) + cum_pass_rate += pass_rate + + running_log.write( + run_settings + f"train_accuracy: {cum_pass_rate / NUM_SEEDS_BENCH}\n\n======================================\ + =========================================") + running_log.flush() + + wandb.log({"average_image_predict_success": cum_pass_rate / NUM_SEEDS_BENCH}) + + +# @profile(stdout=False, filename='baseline.prof', +# skip=True) +def bench_specific_seed(running_log: TextIO, + settings: Settings + ) -> float: + rand = random.randint(1000, 9999) + torch.manual_seed(rand) + running_log.write(f"Seed: {rand}\n") + + # settings = Settings( + # layer_sizes=layer_sizes, + # data_size=dataset.num_classes, + # batch_size=BATCH_SIZE, + # learning_rate=learning_rate, + # epochs=10, + # encode_spike_trains=ENCODE_SPIKE_TRAINS, + # dt=dt, + # percentage_inhibitory=percentage_inhibitory, + # exc_to_inhib_conn_c=exc_to_inhib_conn_c, + # exc_to_inhib_conn_sigma_squared=exc_to_inhib_conn_sigma_squared, + # layer_sparsity=layer_sparsity, + # decay_beta=decay_beta, + # tau_mean=tau_mean, + # tau_var=tau_var, + # tau_stdp=tau_stdp, + # tau_rise_alpha=tau_rise_alpha, + # tau_fall_alpha=tau_fall_alpha, + # tau_rise_epsilon=tau_rise_epsilon, + # tau_fall_epsilon=tau_fall_epsilon, + # threshold_scale=threshold_scale, + # threshold_decay=threshold_decay, + # device=torch.device(DEVICE) + # ) + + # train_dataloader = DataLoader(dataset, batch_size=settings.batch_size, shuffle=False) + + net = RecurrentFFNet(settings).to(settings.device.device) + + train_loader, test_loader = MNIST_loaders( + settings.data_config.train_batch_size, settings.data_config.test_batch_size) + + train_accuracy = net.train_model(train_loader, test_loader) + + message = f"""--------------------------------- + train_accuracy: {train_accuracy} + --------------------------------- + """ + running_log.write(message) + running_log.flush() + logging.info(message) + + return train_accuracy + + +if __name__ == "__main__": + torch.autograd.set_detect_anomaly(True) + torch.set_printoptions(precision=10, sci_mode=False) + set_logging() + + running_log = open(RUNNING_LOG_FILENAME, "w") + message = f"Sweep logs. Current datetime: {time.ctime()}\n" + running_log.write(message) + running_log.close() + logging.debug(message) + + sweep_id = "and-rewsmith/Recurrent-FF/5gg1kvwr" + wandb.agent(sweep_id, function=objective) diff --git a/RecurrentFF/search/sweep_config.yaml b/RecurrentFF/search/sweep_config.yaml new file mode 100644 index 0000000..72433d8 --- /dev/null +++ b/RecurrentFF/search/sweep_config.yaml @@ -0,0 +1,33 @@ +program: new_search.py +method: bayes +metric: + goal: maximize + name: train_accuracy +parameters: + learning_rate: + min: 0.0000005 + max: 0.0005 + momentum: + min: 0.0 + max: 1.0 + prelabel_timesteps: + min: 3 + max: 10 + iterations: + min: 10 + max: 20 + loss_scale_ff: + min: 0.0 + max: 1.0 + loss_scale_predictive: + min: 0.0 + max: 1.0 + loss_scale_hebbian: + min: 0.0 + max: 1.0 + loss_scale_decorrelative: + min: 0.0 + max: 1.0 + damping_factor: + min: 0.1 + max: 0.9 \ No newline at end of file diff --git a/config.toml b/config.toml index 0215263..0104b0e 100644 --- a/config.toml +++ b/config.toml @@ -3,7 +3,7 @@ device = "mps" [model] hidden_sizes = [100, 100, 100, 100, 100] -epochs = 30000 +epochs = 50 prelabel_timesteps = 10 loss_threshold = 1.5 damping_factor = 0.7 @@ -42,3 +42,11 @@ learning_rate = 0.0001 [model.classifier_adadelta] learning_rate = 0.00001 + +[data_config] +data_size = 784 +num_classes = 10 +train_batch_size = 500 +test_batch_size = 500 +dataset = "MNIST" +iterations = 10 From 7e0e74ad45f229bcef2daa71c7a8ea1f43158ee3 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 20 Jun 2024 15:38:01 -0700 Subject: [PATCH 10/13] bash --- RecurrentFF/model/model.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/RecurrentFF/model/model.py b/RecurrentFF/model/model.py index 1020eb6..3966be1 100644 --- a/RecurrentFF/model/model.py +++ b/RecurrentFF/model/model.py @@ -171,9 +171,6 @@ def train_model(self, train_loader: torch.utils.data.DataLoader, test_loader: to self.train() for batch_num, (input_data, label_data) in enumerate(train_loader): - if batch_num == 1: - break - input_data.move_to_device_inplace(self.settings.device.device) label_data.move_to_device_inplace(self.settings.device.device) From 19d749326e27633a2a5d7bcb7be1e7dc49a1397b Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 20 Jun 2024 15:40:05 -0700 Subject: [PATCH 11/13] change --- RecurrentFF/search/new_search.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RecurrentFF/search/new_search.py b/RecurrentFF/search/new_search.py index cab91d6..44863be 100644 --- a/RecurrentFF/search/new_search.py +++ b/RecurrentFF/search/new_search.py @@ -184,5 +184,5 @@ def bench_specific_seed(running_log: TextIO, running_log.close() logging.debug(message) - sweep_id = "and-rewsmith/Recurrent-FF/5gg1kvwr" + sweep_id = "and-rewsmith/Recurrent-FF/zsvxrw5i" wandb.agent(sweep_id, function=objective) From d4bfbb172971694a4c1ec462d35bac3dc183940b Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 20 Jun 2024 17:05:43 -0700 Subject: [PATCH 12/13] fix --- .../model/data_scenario/static_single_class.py | 14 ++++++++++++++ RecurrentFF/model/model.py | 5 ++++- RecurrentFF/search/new_search.py | 2 +- config.toml | 2 +- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/RecurrentFF/model/data_scenario/static_single_class.py b/RecurrentFF/model/data_scenario/static_single_class.py index d1958a8..62834f4 100644 --- a/RecurrentFF/model/data_scenario/static_single_class.py +++ b/RecurrentFF/model/data_scenario/static_single_class.py @@ -1,3 +1,4 @@ +import copy import logging from typing import List, Optional, cast from pyparsing import Iterator @@ -384,6 +385,13 @@ class label, using a two-step process: # tuple: (correct, total) accuracy_contexts = [] + # save acts + activations_saved = [] + for layer in self.inner_layers: + layer_acts = copy.deepcopy(layer.pos_activations) + activations_saved.append(layer_acts) + torch.save(self.inner_layers.state_dict(), "./tmp_model.pt") + for batch, test_data in enumerate(loader): if limit_batches is not None and batch == limit_batches: break @@ -407,6 +415,12 @@ class label, using a two-step process: for label in range(self.settings.data_config.num_classes): # self.inner_layers.reset_activations(True) + # load acts + self.inner_layers.load_state_dict(torch.load( + "./tmp_model.pt", map_location=self.settings.device.device)) + for i, layer in enumerate(self.inner_layers): + layer.pos_activations = copy.deepcopy(activations_saved[i]) + upper_clamped_tensor = self.get_preinit_upper_clamped_tensor( (data.shape[1], self.settings.data_config.num_classes)) diff --git a/RecurrentFF/model/model.py b/RecurrentFF/model/model.py index 3966be1..f5ba22a 100644 --- a/RecurrentFF/model/model.py +++ b/RecurrentFF/model/model.py @@ -171,6 +171,9 @@ def train_model(self, train_loader: torch.utils.data.DataLoader, test_loader: to self.train() for batch_num, (input_data, label_data) in enumerate(train_loader): + # if batch_num == 1: + # break + input_data.move_to_device_inplace(self.settings.device.device) label_data.move_to_device_inplace(self.settings.device.device) @@ -197,7 +200,7 @@ def train_model(self, train_loader: torch.utils.data.DataLoader, test_loader: to # # TODO: Fix this hacky data loader bridge format train_accuracy = self.processor.brute_force_predict( - TrainTestBridgeFormatLoader(train_loader), 10, False) # type: ignore[arg-type] + TrainTestBridgeFormatLoader(train_loader), 1, False) # type: ignore[arg-type] test_accuracy = self.processor.brute_force_predict( test_loader, 1, True) diff --git a/RecurrentFF/search/new_search.py b/RecurrentFF/search/new_search.py index 44863be..f6ef5da 100644 --- a/RecurrentFF/search/new_search.py +++ b/RecurrentFF/search/new_search.py @@ -184,5 +184,5 @@ def bench_specific_seed(running_log: TextIO, running_log.close() logging.debug(message) - sweep_id = "and-rewsmith/Recurrent-FF/zsvxrw5i" + sweep_id = "and-rewsmith/Recurrent-FF/04e3a5rr" wandb.agent(sweep_id, function=objective) diff --git a/config.toml b/config.toml index 0104b0e..620bfad 100644 --- a/config.toml +++ b/config.toml @@ -3,7 +3,7 @@ device = "mps" [model] hidden_sizes = [100, 100, 100, 100, 100] -epochs = 50 +epochs = 25 prelabel_timesteps = 10 loss_threshold = 1.5 damping_factor = 0.7 From b38481757946009070ce7c013b08499553e158be Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 21 Jun 2024 08:53:51 -0700 Subject: [PATCH 13/13] remove old debug --- RecurrentFF/model/hidden_layer.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/RecurrentFF/model/hidden_layer.py b/RecurrentFF/model/hidden_layer.py index 7b22308..3857a13 100644 --- a/RecurrentFF/model/hidden_layer.py +++ b/RecurrentFF/model/hidden_layer.py @@ -469,16 +469,12 @@ def generate_loss(current_act: Tensor, previous_act: Tensor) -> Tensor: def generate_lpl_loss_hebbian(self, current_activations_with_grad: torch.Tensor) -> Tensor: def generate_loss(activations: Tensor) -> Tensor: mean_act = torch.mean(activations, dim=0) - # print("mean_act:", mean_act) mean_subtracted = activations - mean_act - # print("mean: ", mean_subtracted) sigma_squared = torch.sum( mean_subtracted ** 2, dim=0) / (activations.shape[0] - 1) - # print("sigma: ", sigma_squared) loss = -torch.log(sigma_squared + 0.00000001).sum() / sigma_squared.shape[0] - # print("loss: ", loss) return loss assert current_activations_with_grad.requires_grad == True @@ -489,28 +485,22 @@ def generate_lpl_loss_decorrelative(self, current_activations_with_grad: torch.T def generate_loss(activations: torch.Tensor) -> torch.Tensor: # Compute the mean across the batch dimension mean_act = torch.mean(activations, dim=0) - # print("mean_act", mean_act) # Subtract mean from activations and square the result deviations = (activations - mean_act) ** 2 - # print("deviations", deviations[0]) # Outer product along feature dimension for each batch # This computes the pairwise squared differences efficiently loss = torch.einsum('bi,bj->bij', deviations, deviations) - # print("loss", loss[0]) # Sum over all batches and features, exclude the diagonal elements # Diagonal elements correspond to the squared terms which we want to avoid batch_size, n_features = activations.shape loss = torch.sum(loss) - \ torch.sum(torch.einsum('bii->b', loss)) / 2 - # print("loss", loss) # Normalize the loss - # print("batch size * n_features * (n_features - 1)", batch_size * n_features * (n_features - 1)) loss = loss / (batch_size * n_features * (n_features - 1)) - # print("loss", loss) return loss