本篇文章介绍深度学习中的其他一些小技巧(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也非常简单
代码语言:javascript复制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} $$