本篇文章介绍深度学习中的其他一些小技巧(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 十分有效的手段,它的假设是:
- 不学习全部参数,只学习有效的参数
- 每层神经元都有一定的概率失活,每层链接都有一定的概率丢失
它具体的工作过程是,在前向传播的过程中,不同层神经元之间连接的权重 $w$,有一定概率会被暂时认为是 0(注意它并不是给 $w$ 赋值为 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} $$