深度学习基础知识(反向传播)

本文介绍了神经网络中的反向传播原理,通过一个简单的示例解释了损失函数对网络输出的偏导数计算,以及如何通过梯度下降更新参数。在PyTorch中,自动求导机制利用计算图记录每个操作,使得反向传播能在与前向传播相近的时间复杂度内完成。在训练过程中,`optimizer.zero_grad()`用于重置梯度,`loss.backward()`计算梯度,随后`optimizer.step()`更新参数。
摘要由CSDN通过智能技术生成

一、反向传播

Sigmoid写一半发现BackPropagation忘地差不多了,罪过罪过

1.关于梯度

  • 导数告诉了我们整个函数表达式对于某一个变量的敏感度
  • 梯度就是偏导组成的一个向量

2.结合反向传播理解pytorch如何自动求导

反向传播草图

自己画的反向传播示意草图:$x_i$表示输入,$w_{ij}$表示参数,f表示对a的激活函数,f(y)是输出,Loss是均方损失(有个失误损失函数里的y应该是f(y))
  • Loss对神经网络输出求偏导: ∂ L o s s ∂ f ( y ) = f ( y ) − y ∗ \frac{ \partial{Loss} }{\partial{f(y)}}=f(y)-y^* f(y)Loss=f(y)y(这里令偏导等于0得到 f ( y ) = y ∗ f(y)=y^* f(y)=y,也就得到了损失函数的极值点,也就解释了为啥有篇博客说神经网络输出的误差就是损失函数对输出的偏导。这里不禁有个想法,如果更新网络的时候令学习率等于1,那么更新之后所有参数岂不是就完全拟合了当前的这个输入样本了吗(在batch_size=1的前提下)。此刻我也理解了神经元的损失乘参数权重依次向后面的神经元传递。)
  • Loss对 w 3 , 1 w_{3,1} w3,1求偏导: ∂ L o s s ∂ w 3 , 1 = ∂ l o s s ∂ f ( y ) × ∂ f ( y ) ∂ y × ∂ y ∂ w 3 , 1 \frac{\partial{Loss}}{\partial{w_{3,1}}}=\frac{\partial{loss}}{\partial{f(y)}} \times \frac{\partial{f(y)}}{\partial{y}}\times \frac{\partial{y}}{\partial{w_{3,1}}} w3,1Loss=f(y)loss×yf(y)×w3,1y,第一个式子的值上边求出来过了,第二个式子就是一个sigmoid函数的求导是 f ( y ) ⋅ ( 1 − f ( y ) ) ∈ ( 0 , 1 4 ] f(y)\cdot (1-f(y)) \in (0,\frac{1}{4}] f(y)(1f(y))(0,41],第三个式子是 f ( b 1 ) f(b_1) f(b1)。这里要解释pytorch的自动求导是如何在O(n)时间(基本同前向传播一样的时间)来完成反向传播的梯度计算的,是因为对于计算图中的每一个非叶子结点,都会有一个grad_fn属性记录它是怎么计算出来的,对于f(y)它就是对y激活而来的,因此从loss开始根据loss的grad_fn回溯到与它相关计算的节点f(y),并根据loss的grad_fn计算loss对f(y)的偏导。接着从f(y)回溯到上一个节点y,根据f(y)的grad_fn计算f(y)对y的偏导,并乘上loss对f(y)的偏导得到,loss对y的偏导。同理计算y对w31的偏导,再乘上loss对y的偏导(即loss对y的梯度)得到loss对w31的偏导。不过有一点好像pytorch在backward()之后只会保存计算图中叶子节点的梯度,这点还没搞太明白。另外还有梯度累加机制,我也略懂了。所以有一个代码块之前有点不懂的,现在也明白为啥zero_grad能在backward之前了,因为它只是清零了grad属性而已。
for i,(images,target) in enumerate(train_loader):
    # 1. input output
    images = images.cuda(non_blocking=True)
    target = torch.from_numpy(np.array(target)).float().cuda(non_blocking=True)
    outputs = model(images)
    loss = criterion(outputs,target)

    # 2. backward
    optimizer.zero_grad()   # reset gradient
    loss.backward()
    optimizer.step()

pytorch梯度计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值