本篇主要介绍一些pytorch的一些小技巧,包括动量,学习率衰减,early stopping,drop和随机梯度下降。

一、动量 momentum

图片描述
  第一幅图是没有动量影响的更新过程,第二幅图加了动量,可以看到不考虑历史因素,只考虑当前值会使得更新曲线很尖锐,不平滑,最终也只到达了局部极小值而没有到达最优解的位置
图片描述
图片描述
  设置动量的写法如下,只需要在优化器中加上动量参数
图片描述

二、学习率衰减

图片描述
  图中可以看出学习率过大过小都会导致问题,比较好的办法是一开始大,然后逐渐变小,这就是学习率衰减。

方法1

  在loss的变化过程中,如果很长时间都不变,要么是已经到达了一个比较好的值,要么是此时的学习率已经不适用了,需要改变

optimizer = torch.optim.SGD(model.parameters(), lr=1e-3, momentum=0.5, weight_decay=0.2)
# 给参数min,表示在下面过程中是要对lr作减小的操作
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min')

for epoch in ...:
    ...
    # 会一直监听loss_val,到耐心值达到某个值的时候,会依照之前的设定改变(减小)学习率
    scheduler.step(loss_val)

方法2

  方法2是人为规定多少轮以内的学习率是多少

# 方法2
# 假设初始lr = 0.05
# lr = 0.05     if epoch < 30
# lr = 0.005     if 30 <= epoch < 60
# lr = 0.0005     if 60 <= epoch < 90
scheduler = torch.optim.StepLR(optimizer, step_size=30, gamma=0.1)
for epoch in range(100):
    scheduler.step()
    train(...)
    validate(...)

三、提前停止 early stopping

图片描述
  图中可以看出训练的准确率会一直上升,但是测试(validate)的准确率却不会一直上升,在这个临界点后会出现过拟合,我们可以在临界点提前停止训练,把此时的模型导出,作为best version

四、dropout

图片描述

# 在网络之间加上torch.nn.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),  # drop 50& of the neuron
    torch.nn.ReLU(),
    torch.nn.Linear(200, 10),

  约定了在训练过程中drop,但是在test时人为加上net_dropped.eval来取消dropout

五、随机梯度下降 Stochastic Gradient Descent

  • 并不是完全随机,是符合某种分布的随机
    图片描述
  • 本质是由于计算机性能和成本考虑,不可能把所有数据都用作梯度计算,只取一个发展到只取一个batch。