损失函数loss和优化器optimizer

损失函数与优化器的关联_criterion(outputs, labels)_写代码_不错哦的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/shenjianhua005/article/details/123971915?ops_request_misc=&request_id=6583569ecbdc4daf89dbf2d43eac9242&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2~all~koosearch~default-2-123971915-null-null.142^v93^koosearch_v1&utm_term=%E6%80%8E%E4%B9%88%E6%A0%B9%E6%8D%AE%E6%8D%9F%E5%A4%B1%E5%BA%A6%E4%BC%98%E5%8C%96&spm=1018.2226.3001.4187

loss与optimizer没有任何关联(直观上),其实它们并不需要直接联系,它们是通过 Tensor 这个类来达到间接联系的。

首先,net网络中的参数都是tensor,一个 tensor 里面有两个地址,一个是存放的这个tensor当前实实在在的值,比如赋值为10,还有一个存放的是10求导后的值(  .grad  ),就是导数。当然,如果没求导,另一个存放的是None。

当我们进行计算loss.backward()的时候,其实就是进行反向链式求导,这个求导是对net中的参数进行求导的,这里面的参数就是tensor,其有两个地址,分别存放当前值和反向求导的值,loss.backward()后,这个时候就每个参数里面都有导数,然后optimizer其实就是根据net每个参数的导数进行优化(在最开始定义的时候就已经绑定optimizer与net的参数了),这也就关联了loss与optimizer了。

optimizer.step()是更新参数

刚刚写完这个,突然想到,loss是怎么跟net中参数联系起来的,其实可以这么来看:

y=w1X1+w2X2+w3X3

我们在计算 loss = criterion(out, input)时,这里的out就等于y就等于w1X1+w2X2+w3X3,(虽然y是一些具体的值,但是这些值是由w1X1+w2X2+w3X3构成的),所以 losss.backward()的时候就是更新w1,w2,w3,所以这就关联了。


loss = softmax_entropy(outputs).mean(0)
loss.backward()
optimizer.step()
optimizer.zero_grad()
  1. loss = softmax_entropy(outputs).mean(0): 这一行代码计算了模型输出的损失。首先,对输出进行softmax操作,将其转换为概率分布。接下来,使用交叉熵损失函数计算每个样本的损失。最后,通过mean(0)对样本的损失进行平均,得到一个标量的损失值。

  2. loss.backward(): 这行代码触发了反向传播过程。它根据计算图以及链式法则,计算了损失相对于模型参数的梯度。这个过程通过自动微分(autograd)机制来完成,梯度信息会被累积在每个参数的.grad属性中。

  3. optimizer.step(): 这一步用来更新模型的参数。优化器根据计算得到的梯度信息,根据所选的优化算法(如随机梯度下降法SGD、Adam等),更新模型中的可学习参数。这个过程会更新模型中的权重和偏置等参数,使其朝着减小损失的方向调整。

  4. optimizer.zero_grad(): 这一行代码将模型参数的梯度清零。在进行下一轮迭代之前,需要将之前一轮迭代中计算的梯度进行清除。它是必要的,因为PyTorch默认会在反向传播过程中累积梯度,如果不清零,梯度将会累积在后续迭代中,导致结果不正确的参数更新。

你可能感兴趣的:(机器学习,人工智能,深度学习)