【问题标题】:Why should I call a BERT module instance rather than the forward method?为什么我应该调用 BERT 模块实例而不是 forward 方法?
【发布时间】:2020-06-27 20:08:18
【问题描述】:

我正在尝试使用转换器库中的 BERT 提取文本的矢量表示,并且偶然发现了“BERTModel”类的 documentation 的以下部分:

谁能更详细地解释一下?前向传递对我来说很直观(毕竟我试图获得最终的隐藏状态),我找不到任何关于“预处理和后处理”在这种情况下意味着什么的额外信息。

先谢谢了!

【问题讨论】:

    标签: bert-language-model huggingface-transformers


    【解决方案1】:

    我认为这只是关于使用 PyTorch Module 的一般建议。 transformers 模块是nn.Modules,它们需要forward 方法。但是,不应手动调用model.forward(),而应调用model()。原因是 PyTorch 在调用模块时会在后台做一些事情。你可以在the source code找到。

    def __call__(self, *input, **kwargs):
        for hook in self._forward_pre_hooks.values():
            result = hook(self, input)
            if result is not None:
                if not isinstance(result, tuple):
                    result = (result,)
                input = result
        if torch._C._get_tracing_state():
            result = self._slow_forward(*input, **kwargs)
        else:
            result = self.forward(*input, **kwargs)
        for hook in self._forward_hooks.values():
            hook_result = hook(self, input, result)
            if hook_result is not None:
                result = hook_result
        if len(self._backward_hooks) > 0:
            var = result
            while not isinstance(var, torch.Tensor):
                if isinstance(var, dict):
                    var = next((v for v in var.values() if isinstance(v, torch.Tensor)))
                else:
                    var = var[0]
            grad_fn = var.grad_fn
            if grad_fn is not None:
                for hook in self._backward_hooks.values():
                    wrapper = functools.partial(hook, self)
                    functools.update_wrapper(wrapper, hook)
                    grad_fn.register_hook(wrapper)
        return result
    

    您会看到forward 在必要时被调用。

    【讨论】:

    • 嗨,布拉姆 - 感谢您的快速回复。已经帮助一大群人对是否使用模块调用或转发调用有一个非常明确的答案。然而,我不得不承认,上面的代码对我来说大多是胡言乱语。您是否可以概括地概括一下“引擎盖下的东西”是什么?否则我会去打猎:-)
    • 在构建模型时,还可以注册(pre_)hooks和backward_hooks。他们在通过模型之前/之后或在反向传播之前/之后修改输入。我从来没有用过那些。该代码还占tracing。
    猜你喜欢
    • 2012-07-24
    • 2014-12-20
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多