卷积层如何反向求导

通常我们在进行卷积的运算时,只考虑正向运算,似乎我们对卷积的正向运算非常了解。但是机器学习或者是深度学习的关键在于参数优化,而优化势必要反向运算,即损失函数对各个层级的参数进行求偏导。如果是如果是传统的机器学习,由于他的链路比较短,所以反向求导似乎很容易想象、很容易理解。而一旦切换到深度学习的阵营,我们对于反向求导似乎不怎么考虑,因为各种深度学习框架早已内置了各种反向求导机制,我们只管设计深度卷积框架就行,优化的事情交给TensorFlow或pytorch等就行。
今天就来思考一下针对卷积神经网络的的反向求导过程,他到底是怎么实现的?今天的思考只是一个粗浅的看法,不涉及关于反向求导的复杂庞大的理论体系。

第一件事情

所谓的误差反向传递或者是反向求导,理论上就是复合函数求偏导,这个复合函数层层嵌套,这是理解反向求导的内核。打个不太恰当的比方,就如同洋葱一样,剥很多层皮之后才可能看到那个洋葱心,反向求导就是这么个玩意,但是在这里,我们剥的每层皮都有价值,因为在每层皮上既可以求出损失函数对该层参数的偏导数,以方便优化,又能将损失误差通过该层的参数传递到该层的前向输入口(即上一层的输出口),以方便前面一层(里面一层)的求偏导工作。

第二件事情

在卷积神经网络中,误差是怎么一步一步往后传递的?如果该层有一个显示的表达式,我们很容易反向求导,可是他偏偏是以卷积模板通过滑窗的方式进行的前向计算,这个我们的求导增添了意思朦胧感。解铃还须系铃人,如果你认真思考正向的卷积到底是怎么做的,其实就很容易逆向求导。
这里我们假设该层的逆向输入偏导数是 z ′ z' z,他的维度和size与该层的正向输出 z z z完全一样。假设该层的正向输入为 x x x,其中的一个卷积模板filter为 y y y,整个网络的损失函数标记为 L \mathcal L L L \mathcal L L对该层的正向输入 x x x求偏导的结果记为 x ′ x'

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用`torch.autograd.grad`函数来实现计算指定卷积层的输出相对于输入张量的梯度。具体代码如下: ```python import torch # 构建CNN模型 model = torch.nn.Sequential( torch.nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1), torch.nn.ReLU(), torch.nn.MaxPool2d(kernel_size=2, stride=2), torch.nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1), torch.nn.ReLU(), torch.nn.MaxPool2d(kernel_size=2, stride=2), torch.nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1), torch.nn.ReLU(), torch.nn.MaxPool2d(kernel_size=2, stride=2), torch.nn.Flatten(), torch.nn.Linear(64 * 4 * 4, 10), ) # 定义输入张量 input_tensor = torch.randn(1, 3, 32, 32, requires_grad=True) # 定义卷积层的名称 conv_layer_name = '4' # 前向传播计算输出 output_tensor = model(input_tensor) # 选择指定的卷积层 conv_layer = model[int(conv_layer_name)] # 计算输出相对于输入张量的梯度 grad_tensor = torch.autograd.grad(outputs=output_tensor, inputs=input_tensor, grad_outputs=torch.ones_like(output_tensor), retain_graph=True)[0] # 计算输出相对于指定卷积层权重的梯度 weight_grad_tensor = torch.autograd.grad(outputs=output_tensor, inputs=conv_layer.weight, grad_outputs=torch.ones_like(output_tensor), retain_graph=True)[0] # 输出梯度值 print('Grad Tensor:', grad_tensor) print('Weight Grad Tensor:', weight_grad_tensor) ``` 需要注意的是,使用`torch.autograd.grad`函数时,需要指定`grad_outputs`参数为一个与输出张量大小相同的张量,且张量中每个元素的值都为1,表示对输出的每个元素求导。同时,由于要反向传播计算梯度,需要设置`retain_graph=True`,以避免反向传播时图被清空。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值