I want to understand how overfitting can be prevented in deep learning. What are the most effective techniques used during training to improve generalization? Can someone also explain when to use methods like dropout, regularization, or data augmentation?