C.W.K.
Stream
Lesson 05 of 10 · published

Leaf vs Intermediate Tensor 와 .retain_grad()

~10 min · leaf, intermediate, retain_grad

Level 0Tensor 호기심
0 XP0/62 lessons0/13 achievements
0/120 XP to next level120 XP to go0% complete

default 로 leaf 만 .grad 받음

Autograd 가 두 종류 tensor 를 강하게 구분:

  • Leaf tensor — 너 (또는 nn.Parameter) 가 만든 것. graph 의 input, op 의 output 아님. .grad 가 그것에 대한 loss 의 gradient.
  • Intermediate tensor — op 의 output. PyTorch default 행동은 거기 gradient 안 저장 — intermediate 어디나 저장하면 메모리 폭발.

디버깅 중에 intermediate (예: layer 3 의 output) 의 gradient 보고 싶으면 두 옵션:

  1. x.retain_grad() — backward 전에 intermediate 에 호출하면 PyTorch 가 그 gradient 도 저장.
  2. x.register_hook(callback) — gradient 가 흐를 때 호출되는 함수 등록. 저장 안 함; log 또는 modify 가능.

정상 training loop 에선 둘 다 안 건드려. '어, 왜 이 layer 가 학습 안 되지' 모먼트에 진단 위해 잡는 거.

Code

intermediate 의 .grad 가 None 인 이유·python
import torch

a = torch.tensor(2.0, requires_grad=True)   # LEAF
b = a * 3                                    # INTERMEDIATE
c = b + 1                                    # INTERMEDIATE
c.backward()

print(a.is_leaf, a.grad)   # True tensor(3.)
print(b.is_leaf, b.grad)   # False None  (intermediate, .grad not stored)
print(c.is_leaf, c.grad)   # False None
retain_grad — 진단 전용·python
import torch

a = torch.tensor(2.0, requires_grad=True)
b = a * 3
b.retain_grad()                       # tell autograd to keep b's grad
c = b + 1
c.backward()

print(b.grad)                         # tensor(1.) — now available
register_hook — gradient 흐르는 중에 modify/log·python
import torch
import torch.nn as nn

model = nn.Sequential(
    nn.Linear(4, 8),
    nn.ReLU(),
    nn.Linear(8, 2),
)

stats = {}
def make_hook(name):
    def _hook(grad):
        stats[name] = (grad.abs().mean().item(), grad.std().item())
    return _hook

for name, p in model.named_parameters():
    p.register_hook(make_hook(name))

x = torch.randn(16, 4)
y = torch.randn(16, 2)
loss = nn.functional.mse_loss(model(x), y)
loss.backward()

for name, (mean, std) in stats.items():
    print(f"{name}: |grad|.mean={mean:.4f}  std={std:.4f}")

External links

Exercise

3-layer MLP 짓기. 각 parameter 에 register_hook 으로 gradient mean/std 기록. random data 에 한 batch train. 통계 print. 그 다음 activation 을 ReLU 에서 Sigmoid 로 바꾸고 다시 — 더 이른 layer 의 gradient 크기가 0 으로 줄어드는 거 관찰 (vanishing gradient).

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.