萌新求助:损失函数是怎么给到OPT的?
收藏
大家好!
最近在学习PADDLE 框架,在例子里面,我发现好像只要定义了损失函数,如
loss= F.square_error_cost(predicts, labels)
avg_loss = paddle.mean(loss)
和优化器
opt = paddle.optimizer.SGD(learning_rate=0.001, parameters=model.parameters())
然后调用
avg_loss.backward()
opt.step()
opt.clear_grad()
就可以实现 参数 的后向传播。
在优化器中,我能看MODEL的参数 是怎么和优化器连接在一起的。但我没有看这个损失函数是怎么和OPT连接在一起的。OPT会自动从AVG_LOSS中得到自己要的数据吗?
谢谢大家!
DeepGeGe
已解决
2#
回复于2021-12
这个问题很有意思,也牵扯到了深度学习框架的核心:自动微分机制。 神经网络前向传播是输入通过每一层节点计算后得到每层输出,上层输出又作为下一层的输入,最终达到输出层。然后通过损失函数计算得到loss值。反向传播是通过loss值来指导前向节点中的函数参数如何改变,并更新每层中每个节点的参数,来让整个神经网络达到更小的loss值。自动微分机制就是让你只关注组网中的前向传播过程,然后飞桨框架来自动完成反向传播过程。 在PaddlePaddle中所有数据均为Tensor,Tensor中包含神经网络参数Parameter,Parameter有个属性叫做梯度grad。在执行神经网络前向计算时候,飞桨的自动微分通过trace的方式,记录前向OP的执行,并自动创建反向var和添加相应的反向OP,然后来实现反向梯度计算。 换句话说,飞桨中定义的每一个前向计算的算子,在执行时候,除了正常的前向计算流程,还会创建反向的操作。当调用loss.backward()方法,会执行记录的反向计算操作,并将得到的梯度记录再Parameter的grad属性中。 优化器创建时候传入了参数,在这些参数的grad属性中记录了梯度,直到Parameter的当前值,还有梯度,不就很容易可以算出梯度下降之后的值了嘛。
0
收藏
请登录后评论
这个问题很有意思,也牵扯到了深度学习框架的核心:自动微分机制。
神经网络前向传播是输入通过每一层节点计算后得到每层输出,上层输出又作为下一层的输入,最终达到输出层。然后通过损失函数计算得到loss值。反向传播是通过loss值来指导前向节点中的函数参数如何改变,并更新每层中每个节点的参数,来让整个神经网络达到更小的loss值。自动微分机制就是让你只关注组网中的前向传播过程,然后飞桨框架来自动完成反向传播过程。
在PaddlePaddle中所有数据均为Tensor,Tensor中包含神经网络参数Parameter,Parameter有个属性叫做梯度grad。在执行神经网络前向计算时候,飞桨的自动微分通过trace的方式,记录前向OP的执行,并自动创建反向var和添加相应的反向OP,然后来实现反向梯度计算。
换句话说,飞桨中定义的每一个前向计算的算子,在执行时候,除了正常的前向计算流程,还会创建反向的操作。当调用loss.backward()方法,会执行记录的反向计算操作,并将得到的梯度记录再Parameter的grad属性中。
优化器创建时候传入了参数,在这些参数的grad属性中记录了梯度,直到Parameter的当前值,还有梯度,不就很容易可以算出梯度下降之后的值了嘛。
如果难以理解可以看看这个图:
这里可以看到执行前向计算算子Mul时候创建了对应的反向计算OP:MulBackward。
loss.back()方法会执行反向计算算子,将计算出来的梯度放在对应参数的grad属性里面。
然后opt.step()方法根据参数值,梯度值按照特定规则去进行梯度下降就好了。
非常感谢!让我了解了更多!谢谢了!
有一点不太理解,我看网上说,求出损失值之后,反向传播过程中要先对损失函数求导。如果这个说法正确,那么我自定义的损失函数如何进行自动求导?还是说“反向传播过程中要先对损失函数求导”这个说法就是不正确的?