1.Early Stop:
模型在一直训练时,发现training的accuracy会一直上升,但是在test上的accuracy在经过某个临界点之后就可能开始下降,这时就意味着模型出现了over-fitting,Early Stop提前停止就是用来克服over-fitting的。
但是没train完那怎么知道这个临界点?这时只能使用经验来判断,比如当连续多个epoch上的验证集accuracy在下降时就可以停止训练。
2.Dropout(随机失活):
Dropout是一种在深度学习中防止过拟合的手段。
即每次forward时每个连接都有一定的概率断开,这样在训练时每次用到的有效的参数量会比不用Dropout时少一些。
- 在PyTorch中加Dropout
可以在任何有需要的层之间插入Dropout层:
self.model = nn.Sequential(
nn.Linear(784, 200),
nn.Dropout(0.5), # drop 50% of the neuron
nn.LeakyReLU(inplace=True),
nn.Linear(200, 200),
nn.Dropout(0.5), # drop 50% of the neuron
nn.LeakyReLU(inplace=True),
nn.Linear(200, 10),
)
在train时,模型使用前指明模式(有可能是断掉的dropout),但是在validation或test时要将所有连接都用上,也就是说在test时,就不存在dropout:
for epoch in range(epochs):
# train
# 指明使用"训练用"的网络模式,即使用Dropout
net.train()
......
# test
# 在validation或test时需要把Dropout去掉
# 因此这里就需要人为的切换一下模式
net.eval()
......
另外需注意的是,pytorch和tensorflow中的不同之处,否则在做代码迁移的时候会出现问题:
torch.nn.Dropout(p=dropout_prob)
参数表示的是断开的概率(p)tf.nn.dropout(keep_prob)
参数表示的是保持连接的概率(1-p)
3.Stochastic Gradient Descent(随机梯度下降):
这里需要注意的是Stochastic
并不是真正的random
,而是符合一个分布的,只是具有随机性。
具体地,Stochastic Gradient Descent(SGD)是从训练集中随机选出一个比较小的batch出来,在这个小的样本集上用梯度的均值做梯度下降更新参数,而传统的梯度下降则是每次都要考虑在整个训练集上所有样本的梯度。
使用SGD的原因是训练集样本可能非常多,一方面显存不够把所有样本读进来,另一方面对所有样本计算梯度速度可能太慢了。所以在实际用的时候都不使用原始的GD,而是用SGD来做的。