【问题标题】:Pytorch RNN with no nonlinearity没有非线性的 Pytorch RNN
【发布时间】:2021-03-20 22:13:48
【问题描述】:

是否可以在 Pytorch 中实现一个没有非线性的 RNN 层,就像在 Keras 中一样,可以将激活设置为线性?通过消除非线性,我想实现一个具有可微分参数的一阶无限脉冲响应 (IIR) 滤波器,并将其集成到我的模型中以进行端到端学习。我显然可以在 Pytorch 中实现过滤器,但我认为使用内置函数可能更有效。

【问题讨论】:

  • 如果你想移除激活并使 RNN 线性化,这与使用没有激活集的nn.linear 相同,因为时间分布的组件完全被移除。查看我的答案了解更多详情。
  • 您将没有非线性的 RNN 解释为线性变换在技术上是正确的,但并不实用。对我来说,展开 250 个递归以将它们变成一组 250 个具有不断增长的维度的线性变换是没有意义的。
  • python 中的“for”循环非常慢。 Pytorch的RNN模型的主序列循环在C:link中实现。
  • @Reza,我说的不是 250 个线性变换,而是输入向量序列上的 1 个线性变换。

标签: python pytorch filtering recurrent-neural-network


【解决方案1】:

我不这么认为,您可以在 tanh 和 relu 之间进行选择,但据我所知,在使用 nn.RNN 时成为其中之一(而且我认为没有解决方法)。但是您可以很容易地自己实现 RNN,而无需使用已实现的模块,然后使用您想要的任何激活。他们在this Pytorch 教程中展示了一个例子。

【讨论】:

    【解决方案2】:

    从 RNN 中去除非线性将其变成线性密集层,无需任何激活。

    如果这是您想要的,那么只需使用nn.linear 并将激活设置为None

    说明

    这就是发生这种情况的原因。从根本上说,时间步长的 RNN 的工作原理如下 -

    h(t) = tanh(U.x(t) + W.h(t−1) + b)
    
    h(0) = tanh(U0.x(0) + b0)
    h(1) = tanh(U1.x(1) + W1.h(0) + b1)
    h(2) = tanh(U2.x(2) + W2.h(1) + b2)
    
    #... and so on.
    

    如果您通过删除 tanh 来删除线性,会发生以下情况 -

    h(0) = U0.x(0) + b0
    h(1) = U1.x(1) + W1.h(0) + b1
         = U1.x(1) + W1.(U0.x(0) + b0) + b1 #expanding x(0)
         = U1.x(1) + W1.U0.x(0) + W1.b0 + b1
         = U1.x(1) + W1.U0.x(0) + W1.b0 + b1
         = V1.x(1) + V0.x(0) + C    #Can be rewritten with new weights
         = V . x + C    #General form
    

    因此,RNN 在 2 个时间步之后的最终状态形式就是 Wx+b,就像没有激活的线性层一样。

    换句话说,从 RNN 中去除非线性将其变成线性密集层,无需任何激活,完全去除了时间步长的概念。

    【讨论】:

      【解决方案3】:

      不,PyTorch nn.RNN 模块只需要 Tanh 或 RELU:

      nonlinearity – 要使用的非线性。可以是'tanh''relu'。默认值:'tanh'

      您可以 implement this yourself 但是通过在序列上编写自己的 for 循环,如 this example

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-28
        • 2018-12-10
        • 2018-12-24
        • 1970-01-01
        • 2020-10-27
        • 2020-11-01
        • 2020-12-28
        相关资源
        最近更新 更多