Early Stop && Dropout && Stochastic Gradient Descent
-
本篇文章介绍深度学习中的其他一些小技巧(tricks)
Early Stop
上图表明,随着训练epoch的增加,Training Set Accuracy也在持续上升,但到达某一点后,Test Set Accuracy开始下降,此时发生了OverFitting现象。我们一般用Validation Set来对该临界点进行检测,当取到最大值时便停止训练,将此时取得的参数保存起来用于最终的模型参数
Early Stop的引入会提前终止训练,即在Test Accuracy上升到临界值不发生改变后,就停止训练
由此我们总结how to early stop:
- Validation set to select paramters
- Monitor validation performance
- Stop at the highest val preformace
Dropout
Dropout是用来防止OverFitting十分有效的手段,它的假设是:- 不学习全部参数,只学习有效的参数
- 每层神经元都有一定的概率失活,每层链接都有一定的概率丢失
它具体的工作过程是,在前向传播的过程中,不同层神经元之间连接的权重www,有一定概率会被暂时认为是0(注意它并不是给www赋值为0)。通过Dropout,每次学习的过程中,都或多或少有一些参数是不被考虑的,有效的减少了运算量,而且使得模型的泛化能力更强
在pytorch中添加Dropout也非常简单
net_dropped = torch.nn.Sequential( torch.nn.Linear(784, 200), torch.nn.Dropout(0.5),# drop 50% of the neuron torch.nn.ReLU(), torch.nn.Linear(200, 200), torch.nn.Dropout(0.5), torch.nn.ReLU(), torch.nn.Linear(200, 10), )
要注意,在Validation的时候不要设置Dropout,Dropout仅在Training的时候用到
Stochastic Gradient Descent
在每一次迭代中,梯度下降使用整个训练数据集来计算梯度,因此有时它也被称为批量梯度下降(Batch Gradient Descent)。而随机梯度下降(Stochastic Gradient Descent)在每次迭代中只随机采样一个样本来计算梯度
比方说,原本计算loss时假设有60k的数据,那么梯度更新的公式为
$$
\frac{\nabla L}{\nabla W} = \sum_{i=0}^{i=60k}\frac{\nabla L}{\nabla W}
$$
这样计算的复杂度很大,但是若在这60K数据中取一个Batch大小的数据,假设Batch只有1K,这样就能极大的减小计算量
$$
\frac{\nabla J}{\nabla W} = \sum_{i=0}^{i=Batch}\frac{\nabla J}{\nabla W}
$$