In the dark times before PyTorch there was an idea called NEAT: "neuroevolution of augmenting topologies", which tried to use a genetic algorithm (i.e. testing a bunch of slightly modified solutions for loss) to discover both optimal weights and optimal network structure. I don't think this gets used all that often, if at all.
I hear stories every few years about how many models have unused neurons that can be pruned or how hyperparameter selection is a pain in the ass, but nothing about automating the pruning and parameter selection in such a way as to efficiently use the whole model. I'm not sure it's necessary anyway.
Transform from [X] to [X X+epsilon].
In that case I was trying to fuse two signals that had fairly similar characteristics.
Whoever figures out how to clearly and effectively do it consistently faster than a 'full network from the start' version will open up an entirely new subfield of neural network training efficiency. :'))))
There's a lot of nuance though. What has typically worked best are variants on iterative magnitude weight pruning rather than activation pruning.
This can often get rid of 90% of the weights with minimal impact on quality. Structured pruning lets you remove blocks of weights while retaining good SIMD utilization... and so on.
Not at training time. But after training you can evaluate which activations rarely fire and simply remove their columns from the weight matrix.
Or you could re-randomize them and continue training.
It should be noted that there are methods for training the network to encourage these prunable neurons, eg sparsity penalties.
https://en.wikipedia.org/wiki/Pruning_(artificial_neural_net...
and, yes the article also mentions that it happens in mammal brains.