【PyTorch学习笔记】16:Early Stop,Dropout,Stochastic Gradient Descent

Early Stop

如果一直训练,训练集上的性能可以一直上升,但验证集上的性能在经过某个点之后就可能开始下降,这时就是模型出现了over-fitting,提前停止就是用来克服over-fitting的。

但是没训练完怎么知道哪个点是最大值点呢?可以用经验来判断,比如当连续多个epoch上的验证集Acc.在下降时就停止训练。

Dropout

简述

为每个连接设置一个probability的属性,以这个概率让其暂时输出0给后面的神经元。即每次forward时每个连接都有一定的概率断开,这样在训练时每次用到的有效的参数量会比不用Dropout时少一些。

使用

在PyTorch中直接在要加的有连接的相邻两层之间插入Dropout层:

		self.model = nn.Sequential(
			nn.Linear(784, 200),
			nn.Dropout(0.5),  # 以0.5的概率断开
			nn.LeakyReLU(inplace=True),
			nn.Linear(200, 200),
			nn.Dropout(0.5),  # 以0.5的概率断开
			nn.LeakyReLU(inplace=True),
			nn.Linear(200, 10),
			nn.LeakyReLU(inplace=True),
		)

在train时,模型使用前指明模式:

		# 指明使用"训练用"的网络模式,这里的目的是开启使用Dropout
		net.train()
		logits = net(data)
		loss = ......

在validation或者test时,模型使用前指明模式:

		# 在验证集上需要把Dropout去掉,只在训练的时候使用!这里是切换一下模式
		net.eval()
		logits = net(data)
		test_loss += ......

注意,如上面这样的定义方式是在logit和非线性激活的直连上做了Dropout,而不是在线性模型层内部做了Dropout。

如果不使用LR衰减,运行结果:
【PyTorch学习笔记】16:Early Stop,Dropout,Stochastic Gradient Descent_第1张图片

Test set: Average loss: 0.0008, Accuracy: 9509.0/10000 (95%)

效果变好啦。

注意

注意,PyTorch中torch.nn.Dropout()传入的参数是断开的概率,而TensorFlow中tf.nn.dropout()传入的参数是保持连接的概率,即1-断开的概率。

Stochastic Gradient Descent

随机梯度下降没有用Random这个词,因为它不是完全的随机,而是服从一定的分布的,只是具有随机性在里面。

其中的Stochastic的意思是从x到y的映射:
x → y x\to y xy
给定一个 x x x并不能确定地知道输出 y y y,而是服从一定的概率分布。

与之对应的是Deterministic这个词,它表示从 x x x y y y的映射是确定的:
y = f ( x ) y=f(x) y=f(x)
具体地,SGD是从训练集中随机选出一个比较小的batch(16/32/64/128…甚至可能只有一个样本)出来,在这个小的样本集上用梯度的均值做梯度下降更新参数。而传统的梯度下降则是每次都要考虑在整个训练集上所有样本的梯度。

使用SGD的原因是训练集样本可能非常多,一方面显存不够把所有样本读进来,另一方面对所有样本计算梯度速度可能太慢了。所以在实际用的时候都不用原始的GD,而是用SGD来做的:

from torch import optim

# ......

optimizer = optim.SGD(net.parameters(), lr=learning_rate, momentum=0.78)

你可能感兴趣的:(#,PyTorch)