从训练循环中,你注意到只能在train_loss上调用backward。因此,误差只会根据训练集来进行反向传播。验证集用于在未用于训练的数据上对模型输出的准确性进行独立的评估。
好奇的读者此时可能会有一个问题。我们对模型进行了两次评估(一次在train_t_u上,一次在val_t_u上),然后调用一次backward。这不会使autograd变得混乱吗?验证集评估过程中生成的值不会影响backward吗?
幸运的是,事实并非如此。训练循环中的第一行在train_t_u上对模型进行评估以产生train_t_p。然后用train_t_p计算train_loss,创建一个链接从train_t_u到train_t_p再到train_loss的计算图。当在val_t_u上再次评估模型然后生成val_t_p和val_loss时,将创建一个单独的计算图,该图链接从val_t_u到val_t_p再到val_loss。单独的张量通过相同的函数model和loss_fn运行,生成了单独的计算图,如下图所示。
本图显示了如果计算图有两个损失,对其中一个调用.backward
时梯度如何在计算图中传播
这两个图唯一的共同点是参数。当在train_