pytorch实现straight-through estimator(STE)

现在深度学习中一般我们学习的参数都是连续的,因为这样在反向传播的时候才可以对梯度进行更新。但是有的时候我们也会遇到参数是离>散的情况,这样就没有办法进行反向传播了,比如二值神经网络。本文中讲解了如何用pytorch对二值化的参数进行梯度更新的straight-through estimator算法。
Question:
STE核心的思想就是我们的参数初始化的时候就是float这样的连续值,当我们forward的时候就将原来的连续的参数映射到{-1, 1}带入到网络进行计算,这样就可以计算网络的输出。然后backward的时候直接对原来float的参数进行更新,而不是对二值化的参数更新。这样可以完成对整个网络的更新了。
首先我们对上面问题进行一下数学的讲解。

 

Example:
首先我们验证一下使用torch.sign会是参数的梯度基本上都是0:

>>> input = torch.randn(4, requires_grad = True)
>>> output = torch.sign(input)
>>> loss = output.mean()
>>> loss.backward()
>>> input
tensor([-0.8673, -0.0299, -1.1434, -0.6172], requires_grad=True)
>>> input.grad
tensor([0., 0., 0., 0.])

 我们需要重写sign这个函数,就好像写一个激活函数一样。

import torch

class LBSign(torch.autograd.Function):

    @staticmethod
    def forward(ctx, input):
        return torch.sign(input)

    @staticmethod
    def backward(ctx, grad_output):
        return grad_output.clamp_(-1, 1)
import torch
from LBSign import LBSign

if __name__ == '__main__':

    sign = LBSign.apply
    params = torch.randn(4, requires_grad = True)                                                                           
    output = sign(params)
    loss = output.mean()
    loss.backward()

测试梯度:

>>> params
tensor([-0.9143,  0.8993, -1.1235, -0.7928], requires_grad=True)
>>> params.grad
tensor([0.2500, 0.2500, 0.2500, 0.2500])

 

 

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PyTorch是一个开源的深度学习框架,可以用来构建神经网络模型。TCN(Temporal Convolutional Network)是一种用于时间序列预测的神经网络结构,能够捕捉时间序列中的长期依赖关系。Transformer是另一种常用的神经网络结构,通常用于自然语言处理领域,但也适用于时间序列预测任务。 要使用PyTorch实现TCN-Transformer的时间序列预测,首先需要导入PyTorch库。然后可以定义一个包含TCN和Transformer层的神经网络模型。TCN可以用来提取时间序列中的特征,而Transformer可以捕捉序列数据之间的关系。 在构建神经网络模型之后,接下来需要准备时间序列数据集。可以使用PyTorch的Dataset和DataLoader类来加载和处理时间序列数据。通常需要将数据划分为训练集和测试集,以便在训练模型时进行验证和评估。 训练神经网络模型时,可以使用PyTorch的优化器和损失函数来最小化预测值与真实值之间的误差。可以选择适当的学习率和训练迭代次数,以确保模型收敛并取得良好的预测效果。 最后,可以使用训练好的TCN-Transformer模型进行时间序列预测。将待预测的时间序列输入到模型中,即可获得对未来趋势的预测结果。通过评估预测结果与实际观测值的差异,可以评估模型的性能和准确度。 总之,使用PyTorch实现TCN-Transformer的时间序列表预测需要构建神经网络模型、处理数据集、训练模型并进行预测,通过这些步骤可以实现对时间序列数据的准确预测。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值