本文主要是介绍optimizer.zero_grad(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
optimizer.zero_grad()意思是把梯度置零,也就是把loss关于weight的导数变成0.
在学习pytorch的时候注意到,对于每个batch大都执行了这样的操作:
# zero the parameter gradientsoptimizer.zero_grad()# forward + backward + optimizeoutputs = net(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()
对于这些操作我是把它理解成一种梯度下降法,贴一个自己之前手写的简单梯度下降法作为对照:
# gradient descentweights = [0] * nalpha = 0.0001max_Iter = 50000for i in range(max_Iter):loss = 0d_weights = [0] * nfor k in range(m):h = dot(input[k], weights)d_weights = [d_weights[j] + (label[k] - h) * input[k][j] for j in range(n)] loss += (label[k] - h) * (label[k] - h) / 2d_weights = [d_weights[k]/m for k in range(n)]weights = [weights[k] + alpha * d_weights[k] for k in range(n)]if i%10000 == 0:print "Iteration %d loss: %f"%(i, loss/m)print weights
可以发现它们实际上是一一对应的:
optimizer.zero_grad()对应d_weights = [0] * n
即将梯度初始化为零(因为一个batch的loss关于weight的导数是所有sample的loss关于weight的导数的累加和)
outputs = net(inputs)对应h = dot(input[k], weights)
即前向传播求出预测的值
loss = criterion(outputs, labels)对应loss += (label[k] - h) * (label[k] - h) / 2
这一步很明显,就是求loss(其实我觉得这一步不用也可以,反向传播时用不到loss值,只是为了让我们知道当前的loss是多少)
loss.backward()对应d_weights = [d_weights[j] + (label[k] - h) * input[k][j] for j in range(n)]
即反向传播求梯度
optimizer.step()对应weights = [weights[k] + alpha * d_weights[k] for k in range(n)]
即更新所有参数
这篇关于optimizer.zero_grad()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!