시험공부빅데이터분석
← 보드Autograd — 자동으로 기울기 구하기 · 4/8

.grad를 다룰 때 알아야 할 규칙 — leaf, 스칼라

교수님 슬라이드가 정리한 4가지 규칙 중 앞의 두 가지부터 볼게요.

규칙 1. 기울기는 leaf Tensor에만 저장돼요. leaf(잎)는 계산 그래프의 맨 끝에서 만나는 값이에요. 내가 직접 만든 requires_grad=True Tensor와 모델의 weight, bias가 leaf예요. 계산하는 중간에 생긴 값(예 prediction)은 leaf가 아니라서 .grad가 저장되지 않아요.

w = torch.tensor(2.0, requires_grad=True) # leaf x = torch.tensor(3.0) # leaf (추적은 안 함) target = torch.tensor(10.0) prediction = w * x # 중간 값 loss = (prediction - target) ** 2 loss.backward() print("[w.is_leaf]:", w.is_leaf, "[w.grad]:", w.grad) print("[x.is_leaf]:", x.is_leaf, "[x.grad]:", x.grad) print("[prediction.is_leaf]:", prediction.is_leaf, "[prediction.grad]:", prediction.grad)
[w.is_leaf]: True [w.grad]: tensor(-24.) [x.is_leaf]: True [x.grad]: None [prediction.is_leaf]: False [prediction.grad]: None
변수leaf?.grad
wTrue−24 (추적을 켰어요)
xTrueNone (추적을 안 켰어요. 필요 없는 계산을 줄이려고요)
predictionFalseNone (중간 값이에요. 경고 메시지가 같이 나와요)

실제 학습에서는 업데이트할 대상이 weight와 bias이니까 leaf의 .grad만 보면 충분해요.

규칙 2. backward()는 숫자 하나(스칼라)에서 호출해요. loss가 숫자 여러 개짜리 Tensor이면 .sum()이나 .mean()으로 하나로 합친 다음 호출해요. 보통 loss 함수는 원래부터 숫자 하나를 돌려줘요. 반면 기울기를 구하는 대상(파라미터)은 숫자 여러 개짜리여도 괜찮아요.

w = torch.tensor(1.0, requires_grad=True) x = torch.tensor(3.0) L1 = (w * x - 5) ** 2 L2 = (w * x - 7) ** 2 L = torch.stack([L1, L2]) # 숫자 2개짜리 Tensor로 묶음 print("L =", L) L.sum().backward() # 하나로 합쳐서 backward print("w.grad =", w.grad)
L = tensor([ 4., 16.], grad_fn=<StackBackward0>) w.grad = tensor(-36.)
코드 줄무슨 뜻
L1 = (w * x - 5) ** 2(3−5)² = 4
L2 = (w * x - 7) ** 2(3−7)² = 16
torch.stack([L1, L2])두 값을 [4, 16] 한 Tensor로 쌓아요.
L.sum().backward()4 + 16 = 20 하나로 만든 뒤 backward. 기울기는 L1의 −12와 L2의 −24를 더한 −36이에요.
L.backward() (바로)"grad can be implicitly created only for scalar outputs" 오류가 나요.

파라미터가 여러 개짜리일 때는 이렇게 돼요. W = [1, 2, 3], X = [2, 1, 4]이고 b = W @ X(곱해서 더하기), L = b²이면 b = 2+2+12 = 16, L = 256이에요. L.backward() 후 W.grad = [64, 32, 128]이에요. 원소마다 기울기가 따로 계산돼요. 손으로는 2 × b × X의 각 칸 = 32 × [2, 1, 4]로 구해요.

이렇게 고르세요 (풀이 요령)

".grad가 None인 이유"를 묻는 보기는 대개 ① backward를 아직 안 불렀다 ② requires_grad=False이다 ③ leaf가 아닌 중간 값이다 중 하나예요. 그리고 숫자 여러 개짜리 loss에는 .sum() 또는 .mean()을 먼저 쓰고 backward를 불러요.

잠깐 확인 — x = torch.tensor(3.0)처럼 requires_grad를 안 켠 값의 .grad는?

None이에요. 추적을 켜지 않았으니 기울기를 계산하지 않아요.

.grad 규칙 4가지
교수님 슬라이드 — .grad를 다룰 때 꼭 알아야 할 4가지 규칙
다음 카드 → 기울기는 쌓여요 — 누적과 zero_grad ★★★

자료: 6주차 · Week04_Autograd_Loss_Optimizer · 6주차 녹취(빅데이터06), 7주차 녹취(빅데이터07)