You are training a deep neural network and notice that early layers learn very slowly as depth increases. You want to understand why optimization becomes difficult and which architectural choices make training stable.
Describe the vanishing gradient problem in deep neural networks. How do residual connections, batch normalization, and specific activation functions help resolve it?