首页 > 解决方案 > 我如何通过原始张量操作构建的 PyTorch LSTM 反向传播(例如,不是`nn.LSTM`)

问题描述

编辑:我的实现的问题是试图output直接从隐藏状态中提取我的 IE 单热向量。我在顶部添加了一个致密层,它工作正常。


我正在尝试从 PyTorch 中更原始的操作中创建 LSTM,并使用torch.autograd功能来反向传播错误。我希望它是“在线”的,h并且c随着时间的推移累积它们的状态,并且在每个时间步长都有 1 个字符输入和 1 个输出。

这是一个字符级的 rnn,所以:

TL;博士。我如何正确地反向传播这个 LSTM?

    def ff(inp, h, c):
        xh = torch.cat((inp, h), 0)
        f = (xh @ Wf + bf).sigmoid()
        i = (xh @ Wi + bi).sigmoid()
        g = (xh @ Wg + bg).tanh() # C-bar, in some literature
        c = f * c + i * g
        o = (xh @ Wo + bo).sigmoid()
        h = o * c.tanh()
        return h, c

    loss = torch.zeros(1)
    def bp(out, target, lr):
        global Wf, Wi, Wg, Wo
        global bf, bi, bg, bo
        global h, c
        global loss

        # Accumulate loss every step
        loss += (-target * out[:out_n].softmax(dim=0).log()).sum()

        # Every 10 chars, run backprop
        if i % 10 == 0:
            loss.backward()

            with torch.no_grad():
                for param in [Wf, Wi, Wg, Wo, bf, bi, bg, bo]:
                    param -= lr * param.grad
                    param.grad.zero_()

            h.detach_()
            c.detach_()
            loss.detach_()
            loss = torch.zeros(1)

        return loss

标签: pythonmachine-learninglstmpytorchrnn

解决方案


推荐阅读