It's definitely not needed for every kind of initialization. The issue with `fan_out` is that it's not something that can be calculated without knowledge of the layer following, thus the idea is that it be calculated by `MLP`'s initialization logic and passed in, to be used if needed. We also want this to be more general than just MLP layers.

I agree that the keyword argument approach here is not ideal but I don't think `get_fan_out` would work for this reason. Here's a middle ground I'll propose: let the caller of `initialize` pass in a dictionary of metadata, and `initialize` can check that it has the keys necessary to do its job and raise an informative error if not. For MLPs `MLP._initialize` can generate this metadata dictionary as it's initializing the layers sequentially.