【问题标题】:Understanding PyTorch's Implementation of an RNN了解 PyTorch 的 RNN 实现
【发布时间】:2021-09-15 02:50:40
【问题描述】:

我想参考 Schmidt 的这篇论文,其中 RNN 通常被描述为:https://arxiv.org/pdf/1912.05911.pdf。所以,根据方程式。论文的(1)和(2)中,我们需要三个权重矩阵W_hh、W_xh和W_ho。但是,在打印简单RNN的参数个数时,没有看到矩阵W_ho,看不懂(打印输出中矩阵W_xh称为W_ih):

我们将不胜感激!

【问题讨论】:

    标签: deep-learning pytorch recurrent-neural-network implementation


    【解决方案1】:

    w_ho 将是从隐藏到输出的矩阵。在您的设置中,这很可能是fc.weightfc.bias。您也可以通过检查参数数量或尺寸来验证这一点。您应该检查矩阵的维度而不是参数的数量来验证这一点。

    更新:从 OP 的 cmets 中,我了解到 OP 在理解 PyTorch 的 RNN 模块的输出时遇到了问题。所以我在下面解释。

    RNN 更新可以写成(无偏差和非线性):

    h(t,l) = h(t-1,l)Whh(l) + h(t,l-1)Wxh(l)
    

    其中t 表示时间,l 表示层。 h(.,0)l=0h 与输入相同。

    现在,RNN 模块实现这一点并输出最后一层的隐藏状态,即所有 t 的 h(t,L) 和每一层的最后一个隐藏状态,即 h(N,1)h(N,L)(如 h_n )。它没有实现上面链接的论文中提到的全连接输出层。

    为什么只有这两个输出?

    • 许多使用 RNN 的问题要么输出与序列大小相同的输出(例如,POS 标记),要么输出单个输出(例如,分类)。对于前者,您可能每次都使用最后一个隐藏状态,而对于后者,您可能会使用最后一层(或所有层)的隐藏状态。
    • 仅使用这些输出,可以添加更多 RNN 层(使用输出)或继续处理序列(使用最后一个隐藏状态)。

    【讨论】:

    • 感谢 cmets。不幸的是,这是不正确的,因为fc 指的是全连接层,抱歉,我应该在问题中写出来。
    • 你能分享你想要实现的代码/目标吗?我怀疑您可能没有/不需要输出层。
    • 换句话说,pytorch 或 RNN 的任何其他实现都没有添加输出层。他们只添加来自输入和循环层的连接。
    • 这是一个简单的 MNIST 分类问题,没什么花哨的。但这很奇怪,因为根据 PyTorch 文档,RNN 返回的是隐藏状态和输出:pytorch.org/docs/stable/generated/torch.nn.RNN.html
    • 如果你仔细阅读输出是每一步的隐藏状态..注意输出描述中的containing the output features (h_t) from the last layer of the RNN...这句话。
    猜你喜欢
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多