본문 바로가기

Deep Learning Study

Paper 구현하고 싶다. #1-2 Introduction to Pytorch

728x90

튜토리얼 원문

 

Tutorial 2: Introduction to PyTorch — UvA DL Notebooks v1.2 documentation

Tutorial 2: Introduction to PyTorch Welcome to our PyTorch tutorial for the Deep Learning course 2022 at the University of Amsterdam! The following notebook is meant to give a short introduction to PyTorch basics, and get you setup for writing your own neu

uvadlc-notebooks.readthedocs.io

 

 

이전 글에서는 Deep Learning 하면서 자주 사용하게 되는 PyTorch의 주요 기능들을 살펴보았다.

이제 Deep Learning을 위한 수학 개념들이 등장한다.

1. Dynamic Computation Graph and Backpropagation

이름부터 현기증이 나고 어지럽고 사이트를 닫고 싶다면 정상이긴 한데,

딱 하루 보는 거 그냥 그런갑 보다 지나가면서 공부 의지를 유지해 보는 건 어떨까 하는 생각이다.

 

대부분 이런 헛소리는 내가 느낀 감정들이다.

 

아무튼 원문에는 영어로 길게 설명이 돼 있는데 간단하게 요약하면

 

은 잘 못하겠으니 이쯤에서 내가 공부하는 방법을 공유해 보고자 한다.

(1) ChatGPT 활용

바로 마법의 소라고동님 ChatGPT를 활용하는 방법이다.

Fig1. 원문

그냥 보기만 해도 어지럽다.

 

솔직히 말하면 나는 무슨 말인지 얼추 알지만,

지식을 전달하는 입장에서 얼추는 좋지 못한 말 같다.

 

그러니 ChatGPT에게 책임을 전가하면

Fig2. 소라고동 요약문

그러니까 Deep Learning은 Gradient를 구하는 게 주목적이고, Pytorch는 이를 쉽게 도와주는 도구일 뿐이다.

라고 한다.

 

원문은 가중치, 기울기, 뭐 x W 여러 가지로 설명하는데, 소라고동님의 말과 크게 다르진 않다. (나름 만족)

 

위와 같은 방법으로 추후에는 예제까지 추가적으로 제공하면서,

코드의 전체 flow를 세세하게 설명하고자 한다.

 

간단하게 이런 진행이구나 하면 되겠다.

 

아무튼 우리의 궁극적 목표인 논문 구현을 위해

이를 수학적으로 이해하는 건 아래 예제를 풀면서 해당 문구를 다시 곱씹어 보면, 이해가 좀 편하다.

(2) 수식으로 표현해 보자

전체 식

이것도 보자마자 어지러우면 안 된다.

사실 우리가 손으로 구하는 것보다 코드로 푸는 게

23억 배 정도는 쉬운 게 사실이다.

 

단지 눈에 익지 않았을 뿐, 도전해 보자.

 

x는 우리가 임의로 넣는 Parameter 개념이다.

막말로 그냥 넣고 싶은 값, 통칭 input이다.

 

이번 문제에서는 x = [0, 1, 2] 3개로 정의해 보겠다. # x.size() -> (3,)의 tensor

 

Parameters, Math 눈에 익히기.

x를 수학적으로 표현한것

# Only float tensors can have gradients
x = torch.arange(3, dtype=torch.float32, requires_grad=True) 
print("X", x)

X tensor([0., 1., 2.], requires_grad=True)

 

파라미터라는 개념은 변수, 입력값, 구하고자 하는 데이터 등 다양한 형태로

해석이 가능하므로 거부감 없이 그냥 파라미터로 받아들이는 넓은 마음을 가져보는 걸 추천한다.

 

추후에 나오는 '하이퍼' 파라미터랑은 조금 다르니 그건 나중에 설명하겠다.

Fig3. optimization 하려는 function

optimization을 위해서는 우리가 사용하는 수식을 function으로 취급해서

이를 미분한 값이 무엇인가를 알아야 한다. 

 

말이 좀 대학원생 같은데,

모든 분석은 미분에서 시작한다고 생각하면 된다.

(물리적으로 표현하면, 시작과 결과 중간의 변화량을 이어 붙이면 결국 미래 예측이 가능하다란 말)

 

앉았다 일어섰다를 미분하면

무릎을 피는 과정이 미분이고, 두 시작과 결과에 대한 변화량이다.

 

즉, 무릎을 피는 중이야 라는 말을 들으면

아 저 사람이 일어서는 중이겠구나 하는 예측이 된다는 말이다.

 

나도 쉽게 설명하고 싶다.

아무튼 위의 식(Fig3. )을 간단하게 표현해 보면,

a = x + 2
b = a ** 2
c = b + 3
y = c.mean()	# sum하고 원소 갯수로 나누니까 사실상 평균값을 구한거다
print("Y", y)

Y tensor(12.6667, grad_fn=<MeanBackward0>)

 

위와 같이 표현된다.

 

이를 그림으로 표현해 보면 아래와 같이 표현되는데,

 

회색은 이제 딥러닝에서 흔히 말하는 '절편'의 개념이 된다. 영어로는 bias(b)라고 불리고 얘네는 '+'로 연산된 걸 뜻한다.

그리고 'a''b'사이에는 '절편'이 없는 걸 확인할 수 있는데, 이는 'a''b'의 관계가 제곱(act_fn 역할)으로 이뤄졌기 때문이다.

이런 프로세스를 추후에 activation_function으로 나타내곤 하는데, 굳이 이걸 꼭 지금 이해할 필욘 없다.

한 번쯤은 봐두면 좋은 이유는 많은 논문에서 저런 구조로 act_fn을 설명한다.

 

어쨌든 위에서 만든 식을 'backpropagation(역전파)' 과정을 통해 각 구간별의 변화량(미분값)을 파악한다.

 

(왜 backpropagation을 쓰는가에 대한 설명은, 이미 정해진 모델에서 미분하게 되면 그 값들이 전부 정해져 있기 때문에, 이와 같은 방법을 채택한다, 이에 대한 자세한 설명은 마법의 소라고동(ChatGPT)에게 물어보는 걸 추천한다.)

 

y.backward()

이러면 벌써 각 구간별(a, b, c) 미분값을 다 구했다.

print(x.grad)

tensor([1.3333, 2.0000, 2.6667])

이와 같은 미분 방식은 손으로도 구하고 검산해 보면서, 우와 신기하다를 느끼는 게 제맛이긴 하지만,

 

그냥 원문으로 대체하겠다. chain rule이 주된 포인트이다.

Fig4. 우와~

 

끊어 가기

이렇게 간략하게 PyTorch Tutorial을 마쳤다. 

 

이후 부분부터는 모델을 밑바닥부터 끝까지 손수 제작하는 과정인데,

솔직히 이 부분이 필요할까? 하는 생각이 든다.

 

필자는 전부 수기로 써가며 도전해보긴 했지만, 그다음에 오는 Tutorial에서 박탈감을 심하게 느낄 정도로

PyTorch에서 잘 만들어 놨다.

 

근데 쓰면서 생각하는 건데, 그냥 해보는 게 좋겠다.

 

다음 글에서 이어 적어보도록 하겠다.