pytorch优化器详解:SGD | 您所在的位置:网站首页 › 打擂台法求最大最小值 › pytorch优化器详解:SGD |
目录 说明 SGD参数 params lr momentum dampening weight_decay nesterov 举例(nesterov为False) 第1轮迭代 第2轮迭代 说明模型每次反向传导都会给各个可学习参数p计算出一个偏导数,用于更新对应的参数p。通常偏导数不会直接作用到对应的可学习参数p上,而是通过优化器做一下处理,得到一个新的值,处理过程用函数F表示(不同的优化器对应的F的内容不同),即,然后和学习率lr一起用于更新可学习参数p,即。 SGD参数SGD是随机梯度下降(stochastic gradient descent)的首字母。 torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False) params模型里需要被更新的可学习参数。 lr学习率。 momentum动量值,通过上一次的v和当前的偏导数g,得到本次的v,即,这个就是上述的函数F。 动量是物理中的概念,它使v具有惯性,这样可以缓和v的抖动,有时候还可以帮助跳出局部盆地。比如上一次计算得到的v是10,参数更新后,本次的偏导数g是0,那么使用momentum=0.9后,最终用于更新可学习参数的v是10*0.9+0=9,而不是0,这样参数仍会得到较大的更新,就会增大离开当前局部盆地的可能性。 dampeningdampening是乘到偏导数g上的一个数,即:。注意:dampening在优化器第一次更新时,不起作用。 weight_decayweight_decay的作用是用当前可学习参数p的值修改偏导数,即:,这里待更新的可学习参数p的偏导数就是。然后再使用上述公式,计算得到。 nesterov对应的文献还没看,从pytorch源码来看,当nesterov为False时,使用上述公式和计算得到。 当nesterov为True时,在上述得到的的基础上,最终的,即又使用了一次momentum和。 举例(nesterov为False) def test_sgd(): #定义一个可学习参数w,初值是100 w = torch.tensor(data=[100], dtype=torch.float32, requires_grad=True) #定义SGD优化器,nesterov=False,其余参数都有效 optimizer = torch.optim.SGD(params=[w], lr=0.1, momentum=0.9, dampening=0.5, weight_decay=0.01, nesterov=False) #进行5次优化 for i in range(5): y = w ** 2 #优化的目标是让w的平方,即y尽可能小 optimizer.zero_grad() #让w的偏导数置零 y.backward() #反向传播,计算w的偏导数 optimizer.step() #根据上述两个公式,计算一个v,然后作用到w print('grad=%.2f, w=%.2f' % (w.grad, w.data)) #查看w的梯度和更新后的值 ''' 输入日志如下: grad=201.00000, w=79.90000 grad=160.59900, w=53.78005 grad=108.09791, w=24.86720 grad=49.98307, w=-3.65352 grad=-7.34357, w=-28.95499 ''' 第1轮更新的导数是,此时,因此。这里w就是可学习参数p。 首先使用weight_decay:。 然后使用momentum(第一次更新不使用dampening):。这里 最后更新w: 第2轮更新的导数是,此时,因此。这里w就是可学习参数p。 首先使用weight_decay:。 然后使用momentum和dampening:,即:,这里用到的是在SGD类中缓存的。 最后更新w:
|
CopyRight 2018-2019 实验室设备网 版权所有 |