Torch实现ReQU,和梯度验证

本文档详细介绍了如何使用Torch实现Rectified Quadratic Unit(ReQU)模块,包括重写`updateOutput`和`updateGradInput`方法,并构建简单神经网络进行测试。同时,通过对比精确和近似梯度以及计算Jacobian矩阵来验证ReQU的正确性。

重写函数

我们使用torch实现我们自己的ReQU模块。在实现一个新的layer之前,我们必须了解,我们并非重写forward和backward方法,而是重写里面调用的其他方法。
1)重新updataOutput方法,从而实现forward方法。
2)重写updataGradInput方法实现部分backward,计算loss函数相对于layer输入的导数,dloss/dx, 根据loss函数相对于layer输出的导数dloss:
这里写图片描述
3)重写accGradParameters方法实现backward其余部分,计算loss函数相对于权重的导数。

ReQU模块

Rectified Quadratic Unit(ReQU)与sigmoid和ReLU很相似,这个模块作用于每一个元素上:
这里写图片描述
用矩阵的方式来表达就是:
这里写图片描述
括号里如果是trues就返回1s,如果是falses就返回0s,中间的符号代表元素级别的乘积

重写updateOutput和updateGradInput模块

在重写模块之前,我们先推导公式,dloss/dx=dloss/dz.*dz/dx=dloss/dz.*2*(x>0).*x
我们首先重写updateOutput函数,这个函数主要计算输入为input时的输出:

function ReQU:updateOutput(input)
  self.output:resizeAs(input):copy(input)
  self.output:gt(input,0):cmul(input):cmul(input)
  return self.output
end

其中self.output:gt(input,0):cmul(input):cmul(input)这一步比较重要,self.output:gt(input,0)目的把input里面值与0比较,大于0设为1,否则设为0,然后通过两次cmul(input),计算得到正确的输出。
我们然后重写updateGradInput函数,这个函数的目的是计算loss函数相对于输入的导数:

function ReQU:updateGradInput(input, gradOutp
### 计算梯度在 PyTorch 中的方法 为了理解如何在 PyTorch 中计算梯度,重要的是要认识到 PyTorch 提供了一个称为 `autograd` 的包,该包能够自动计算张量操作的导数。当定义一个带有 `.requires_grad=True` 属性的张量时,PyTorch 将跟踪对该张量执行的所有操作,并允许通过调用 `.backward()` 方法来反向传播求得梯度。 下面是一个简单的例子展示如何设置计算两个随机矩阵之间的线性变换所产生的梯度: ```python import torch N, D_in, H, D_out = 64, 1000, 100, 10 x = torch.randn(N, D_in, dtype=torch.float32) y = torch.randn(N, D_out, dtype=torch.float32) # 随机初始化权重 W1 W2 并启用梯度追踪 w1 = torch.randn(D_in, H, device='cpu', dtype=torch.float32, requires_grad=True) w2 = torch.randn(H, D_out, device='cpu', dtype=torch.float32, requires_grad=True) learning_rate = 1e-6 for t in range(500): # 前向传递:计算预测值 y_pred h = x.mm(w1) h_relu = h.clamp(min=0) y_pred = h_relu.mm(w2) # 计算并打印损失 loss = (y_pred - y).pow(2).sum() if t % 100 == 99: print(t, loss.item()) # 使用 autograd 来计算 w1 w2 上的损失相对于它们自身的梯度 loss.backward() # 更新权值前手动将梯度置零 with torch.no_grad(): w1 -= learning_rate * w1.grad w2 -= learning_rate * w2.grad # 手动清空累积的梯度 w1.grad.zero_() w2.grad.zero_() ``` 上述代码展示了如何利用 PyTorch 自带的功能来进行基本的神经网络训练循环,其中包含了正向传播、损失函数评估以及使用`.backward()`方法进行反向传播以获取参数更新所需的梯度[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值