You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch类中self()函数的作用?为何不直接调用forward?

PyTorch中self()调用forward方法的原理与原因

最近观看Andrej Kaparthy的GPT构建视频,自行重构代码时注意到generate函数中使用了self()作为函数调用,对此好奇其作用与原因。相关代码如下:

class BigramLanguageModel(nn.Module):

    def __init__(self, vocab_size):
        super().__init__()
        # each token directly reads off the logits for the next token from a lookup table
        self.token_embedding_table = nn.Embedding(vocab_size, vocab_size)

    def forward(self, idx, targets=None):

        # idx and targets are both (B,T) tensor of integers
        logits = self.token_embedding_table(idx) # (B,T,C)

        if targets is None:
            loss = None
        else:
            B, T, C = logits.shape
            logits = logits.view(B*T, C)
            targets = targets.view(B*T)
            loss = F.cross_entropy(logits, targets)

        return logits, loss

    def generate(self, idx, max_new_tokens):
        # idx is (B, T) array of indices in the current context
        for _ in range(max_new_tokens):
            # get the predictions
            logits, loss = self(idx)
            # focus only on the last time step
            logits = logits[:, -1, :] # becomes (B, C)
            # apply softmax to get probabilities
            probs = F.softmax(logits, dim=-1) # (B, C)
            # sample from the distribution
            idx_next = torch.multinomial(probs, num_samples=1) # (B, 1)
            # append sampled index to the running sequence
            idx = torch.cat((idx, idx_next), dim=1) # (B, T+1)
        return idx

你的猜测完全正确——self(idx)确实是在调用类内的forward方法,但这是通过PyTorch中nn.Module的特殊机制实现的:

  • PyTorch的nn.Module类重写了__call__方法,当你像调用函数一样使用实例(即self(idx))时,实际上是触发了__call__方法,而__call__内部会自动调用forward方法。
  • 直接调用forward(idx)虽然也能得到计算结果,但会跳过__call__中包含的关键逻辑:
    • 自动处理模型的设备迁移(比如把输入张量移到模型所在的GPU/CPU)
    • 执行注册的各种钩子(hooks),比如用于梯度监控、中间特征提取的钩子
    • 确保模型处于正确的模式(训练/评估模式下的行为一致性)

因此,使用self()而非直接调用forward是PyTorch中符合规范的用法,能保证模型的完整功能正常运行。

内容的提问来源于stack exchange,提问作者IloveR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:57:27