From superposition to sparse codes: interpretable representations in neural networks