PyTorch自定义梯度

本文介绍了如何在PyTorch中定义一个自定义的激活函数——Htanh,该函数结合了sign函数的正向特性与tanh的平滑导数。Htanh在x接近0时导数为1,其他情况下导数为0,适用于某些特定的神经网络结构。代码示例展示了Htanh函数的前向传播和反向传播实现,并给出了使用示例。此外,还提到了Binarized Neural Networks的相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[3] 的一个简例。正向 sign: y = sign ( x ) = { − 1 x < 0 0 x = 0 1 x > 0 y=\text{sign}(x)=\begin{cases} & -1 & x < 0 \\ & 0 & x = 0 \\ & 1 & x > 0 \end{cases} y=sign(x)=101x<0x=0x>0 反向 Htanh: ∂ y ∂ x = { 1 − ϵ ≤ x ≤ ϵ 0 e l s e \frac{\partial y}{\partial x}=\begin{cases} & 1 & -\epsilon\le x\le \epsilon \\ & 0 & else \end{cases} xy={10ϵxϵelse

Code

import torch

class Htanh(torch.autograd.Function):
    @staticmethod
    def forward(ctx, x, epsilon=1):
        ctx.save_for_backward(x.data, torch.tensor(epsilon))
        return x.sign()

    @staticmethod
    def backward(ctx, dy):
        x, epsilon = ctx.saved_tensors
        dx = torch.where((x < - epsilon) | (x > epsilon), torch.zeros_like(dy), dy)
        return dx, None
  • 用例
htanh = Htanh()
x = torch.tensor([-2.5, -1.6, 0, 3.6, 4.7])
y = htanh.apply(x)

References

  1. PyTorch: Defining New autograd Functions
  2. tensorflow自定义梯度
  3. Binarized Neural Networks
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值