AI 공부 저장소
선형 회귀 (Linear Regression)에서의 역전파 (Back propagation) & 자동 미분(Autograd) 개념, 원리와 코드 구현 본문
선형 회귀 (Linear Regression)에서의 역전파 (Back propagation) & 자동 미분(Autograd) 개념, 원리와 코드 구현
aiclaudev 2022. 2. 5. 17:02
본 글은 Sung Kim 교수님의 PyTorchZeroToAll 강의를 토대로 저의 지식을 아주 조금 덧붙여 작성하였습니다.
글 작성에 대한 허락을 받아, 개인 공부용으로 작성합니다.
문제가 발생할 시 비공개로 전환함을 알립니다.
https://www.youtube.com/channel/UCML9R2ol-l0Ab9OXoNnr7Lw
① 개요
앞에서 다룬 Linear Regression의 Gradient와 같은 경우, 왼쪽 처럼 간단히 구할 수 있었습니다. 하지만, 우측 그림과 같이 Complicated network에 대해선 어떻게 Gradient를 구할 수 있을까요?
바로, Chain Rule을 사용합니다. 대학에서 공학수학 또는 미적분학을 배운 분들에겐 너무 익숙하실겁니다. 만약 Chain Rule을 모르신다면, 이에 대해 먼저 학습하실 것을 매우 권장드립니다.
② Back Propagation
위와 같은 Network에 대해 Back Propagation을 적용해봅시다. 단계는 아래와 같습니다.
예제)
Multiply Gate를 포함한 Network에 대해서 Back Propagation을 적용해봅시다.
Step 1)
Step 2) Backward Propagation : Local Gradient 구하고, 주어진 ∂L/∂z와 Chain Rule을 이용하여 ∂L/∂x, ∂L/∂y 구하기
③ Back Propagation을 이용하여 Linear Regression의 ∂Loss/∂w 구하기
위 그림은 선형회귀 모델의 기본 꼴에서 Loss를 구하기까지의 과정을 그린 것입니다. 지금까지 배웠던 Step를 따라봅시다.
Step 1)
Step 2) Backward Propagation : Local Gradient 구하고, 주어진 ∂L/∂z와 Chain Rule을 이용하여 ∂L/∂x, ∂L/∂y 구하기
Exercise 1)
Answer)
Exercise 2)
Answer)
④ 코드 구현
import torch
from torch.autograd import Variable
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
w = Variable(torch.Tensor([1.0]), requires_grad = True) # Any Random Value
# our model forward pass
def forward(x) :
return w * x
# Loss function
def loss(x, y) :
y_pred = forward(x)
return (y_pred - y) * (y_pred - y)
# Before Training
print('predict (before training)', 4, forward(4).data[0])
# Training : forward, backward, and update weight
# Training Loop
for epoch in range(10) :
for x_val, y_val in zip(x_data, y_data) :
l = loss(x_val, y_val)
l.backward()
print("\tgrad : ", x_val, y_val, w.grad.data[0])
w.data = w.data - 0.01 * w.grad.data
# Manually zero the gradients after updating weights
w.grad.data.zero_()
print("progress : ", epoch, l.data[0])
# After Training
print("predict (after training)", 4, forward(4).data[0])
predict (before training) 4 tensor(4.)
grad : 1.0 2.0 tensor(-2.)
grad : 2.0 4.0 tensor(-7.8400)
grad : 3.0 6.0 tensor(-16.2288)
progress : 0 tensor(7.3159)
grad : 1.0 2.0 tensor(-1.4786)
grad : 2.0 4.0 tensor(-5.7962)
grad : 3.0 6.0 tensor(-11.9981)
progress : 1 tensor(3.9988)
grad : 1.0 2.0 tensor(-1.0932)
grad : 2.0 4.0 tensor(-4.2852)
grad : 3.0 6.0 tensor(-8.8704)
progress : 2 tensor(2.1857)
grad : 1.0 2.0 tensor(-0.8082)
grad : 2.0 4.0 tensor(-3.1681)
grad : 3.0 6.0 tensor(-6.5580)
progress : 3 tensor(1.1946)
grad : 1.0 2.0 tensor(-0.5975)
grad : 2.0 4.0 tensor(-2.3422)
grad : 3.0 6.0 tensor(-4.8484)
progress : 4 tensor(0.6530)
grad : 1.0 2.0 tensor(-0.4417)
grad : 2.0 4.0 tensor(-1.7316)
grad : 3.0 6.0 tensor(-3.5845)
progress : 5 tensor(0.3569)
grad : 1.0 2.0 tensor(-0.3266)
grad : 2.0 4.0 tensor(-1.2802)
grad : 3.0 6.0 tensor(-2.6500)
progress : 6 tensor(0.1951)
grad : 1.0 2.0 tensor(-0.2414)
grad : 2.0 4.0 tensor(-0.9465)
grad : 3.0 6.0 tensor(-1.9592)
progress : 7 tensor(0.1066)
grad : 1.0 2.0 tensor(-0.1785)
grad : 2.0 4.0 tensor(-0.6997)
grad : 3.0 6.0 tensor(-1.4485)
progress : 8 tensor(0.0583)
grad : 1.0 2.0 tensor(-0.1320)
grad : 2.0 4.0 tensor(-0.5173)
grad : 3.0 6.0 tensor(-1.0709)
progress : 9 tensor(0.0319)
predict (after training) 4 tensor(7.8049)
직접 그래디언트를 계산하였을 때의 결과(https://aiclaudev.tistory.com/22)와, 위 코드처럼 역전파를 이용하여 계산한 결과가 같은 것을 알 수 있습니다.
⑤ 구현한 코드와 Back Propagation 과정 대응시키기
⑥ Exercise
본 글은 Sung Kim 교수님의 PyTorchZeroToAll 강의를 토대로 저의 지식을 아주 조금 덧붙여 작성하였습니다.
글 작성에 대한 허락을 받아, 개인 공부용으로 작성합니다.
문제가 발생할 시 비공개로 전환함을 알립니다.
https://www.youtube.com/channel/UCML9R2ol-l0Ab9OXoNnr7Lw
'Artificial Intelligence > ML&DL' 카테고리의 다른 글
로지스틱 회귀 (Logistic Regression) Wide & Deep (0) | 2022.02.09 |
---|---|
로지스틱 회귀 (Logistic Regression)의 개념과 코드 구현 (0) | 2022.02.09 |
파이토치를 사용한 선형 회귀 (Linear Regression) 모델링 (0) | 2022.02.08 |
Linear Regression (선형 회귀) - Gradient Descent (경사 하강법) 개념, 원리와 코드 구현 (0) | 2022.02.05 |
Linear Regression (선형 회귀)의 기본 개념(Loss, MSE)과 코드구현 (0) | 2022.02.03 |