首页 Paddle框架 帖子详情
萌新求助:损失函数是怎么给到OPT的? 已解决
收藏
快速回复
Paddle框架 问答模型训练 635 5
萌新求助:损失函数是怎么给到OPT的? 已解决
收藏
快速回复
Paddle框架 问答模型训练 635 5

大家好!

最近在学习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
收藏
回复
全部评论(5)
时间顺序
DeepGeGe
#2 回复于2021-12

这个问题很有意思,也牵扯到了深度学习框架的核心:自动微分机制。

神经网络前向传播是输入通过每一层节点计算后得到每层输出,上层输出又作为下一层的输入,最终达到输出层。然后通过损失函数计算得到loss值。反向传播是通过loss值来指导前向节点中的函数参数如何改变,并更新每层中每个节点的参数,来让整个神经网络达到更小的loss值。自动微分机制就是让你只关注组网中的前向传播过程,然后飞桨框架来自动完成反向传播过程。

在PaddlePaddle中所有数据均为Tensor,Tensor中包含神经网络参数Parameter,Parameter有个属性叫做梯度grad。在执行神经网络前向计算时候,飞桨的自动微分通过trace的方式,记录前向OP的执行,并自动创建反向var和添加相应的反向OP,然后来实现反向梯度计算。

换句话说,飞桨中定义的每一个前向计算的算子,在执行时候,除了正常的前向计算流程,还会创建反向的操作。当调用loss.backward()方法,会执行记录的反向计算操作,并将得到的梯度记录再Parameter的grad属性中。

优化器创建时候传入了参数,在这些参数的grad属性中记录了梯度,直到Parameter的当前值,还有梯度,不就很容易可以算出梯度下降之后的值了嘛。

1
回复
DeepGeGe
#3 回复于2021-12

如果难以理解可以看看这个图:

这里可以看到执行前向计算算子Mul时候创建了对应的反向计算OP:MulBackward。

0
回复
DeepGeGe
#4 回复于2021-12

loss.back()方法会执行反向计算算子,将计算出来的梯度放在对应参数的grad属性里面。

然后opt.step()方法根据参数值,梯度值按照特定规则去进行梯度下降就好了。

1
回复
s
skygoodboy
#5 回复于2021-12

非常感谢!让我了解了更多!谢谢了!

1
回复
8
823807
#6 回复于2023-02
loss.back()方法会执行反向计算算子,将计算出来的梯度放在对应参数的grad属性里面。 然后opt.step()方法根据参数值,梯度值按照特定规则去进行梯度下降就好了。

有一点不太理解,我看网上说,求出损失值之后,反向传播过程中要先对损失函数求导。如果这个说法正确,那么我自定义的损失函数如何进行自动求导?还是说“反向传播过程中要先对损失函数求导”这个说法就是不正确的?

0
回复
需求/bug反馈?一键提issue告诉我们
发现bug?如果您知道修复办法,欢迎提pr直接参与建设飞桨~
在@后输入用户全名并按空格结束,可艾特全站任一用户