[KeraTorch 개발일지] 1. 프로젝트 소개

yeho.dev·2023년 7월 18일
0

KeraTorch 개발일지

목록 보기
1/2
post-thumbnail

🔥 KeraTorch

KeraTorch는 이름에서 볼 수 있듯 Keras, PyTorch와 유사하게 작동하는 ML (Machine Learning) framework이다. Python으로 구현되었으며, 자동 미분 (auto-grad)을 지원하는 array인 GradArray뿐만 아니라 Linear, Conv2d와 같은 흔히 사용되는 신경망 layer의 구현을 포함한다.

또한. SigmoidReLU, Softmax 등의 activation function, SGD, Momentum, RMSProp, Adam과 같은 optimizer 또한 구현한다. MSE, CrossEntropy와 같은 loss function이 포함되어 원활한 신경망 학습과 backpropagation을 돕는다.

🎯 프로젝트의 목적

필자는 컴퓨터공학과에 재학중인 학생으로, 신경망을 학습과 평가를 위해 PyTorch와 Tensorflow를 사용하곤 했다. 그러던 중 YouTube 알고리즘을 통해 Convolutional Neural Network from Scratch 라는 동영상을 접했다. 논문 리뷰를 하고 코드 구현과 학습을 하며 어느 정도 수준의 expert가 되었다고 생각했지만, Convolutional Neural Network의 작동 원리를 넘어선 실제 구현과 backpropagation의 과정 또한 이해하고 있는 것이 맞는지 확신할 수 없었다.

Computer Vision 분야의 연구자로서는 논문을 읽고 쓰는 역량이 필수적이라고 생각했다. 이 과정에서 자연스럽게 실제 논문의 구현은 소홀히 했고, 논문에서 제시한 네트워크의 아키텍처를 이해하면 충분히 구현할 수 있다고 생각했다.

이에 따라, 신경망의 실질적인 구현을 이해하기 위해서 ML framework 없이 numpy 만을 이용하여 신경망의 feed forward와 backpropagation을 구현해보기로 했다. 시작은 단순히 fully-connected layer와 convolutional layer를 구현하는 것이었다.

두 근본적인 layer를 구현한 뒤 실제로 MNIST와 같은 dataset으로 demo를 진행하면 신경망에 대한 깊은 이해를 할 수 있을 것이라고 생각했기 때문이다. 이때 한 가지 생각이 들었다.

차라리 그냥 framework를 만들어볼까?

이렇게 KeraTorch를 개발해보기로 결심했다. 평소에 많이 사용했던 PyTorch와 유사하게 작동하지만, 그 작동 방식을 모방하기보단 스스로 상상하면서 구현하려고 노력했다. 스파게티 코드가 되지 않도록 클래스의 상속과 추상화를 고려했으며, 무엇보다 중간에 멈추지 않으리라 다짐했다.

⌨️ 포스팅을 하는 이유

  • 무엇보다 개발다운 개발을 하는 것이 오랜만이었기 때문에 그 과정을 글로 남기고 싶었다. 어렸을 때 필자는 개발자가 되고 싶었지만, 머신러닝 분야를 접한 뒤에는 나도 모르게 연구자의 삶을 살고 있다는 것을 느꼈다. 서버에서 깔짝깔짝 학습을 돌리면서도 무언가를 개발하고 싶다는 욕구를 솟아나곤 했다.

  • 잘 정돈된 코드를 짜고 싶어 개발 과정을 정리하기로 했다. 막무가내로 생각나는 기능을 추가하는 것이 아닌 프로젝트의 방향에 맞춰서 차근차근 순차적으로 개발하고자 한다. 코드가 늘어나는 과정을 정리함으로써 어쩌다보니 작동하는 코드가 아닌 정교하게 작동하는 코드를 작성하고자 한다.

  • 개발일지 포스팅을 통해 개발 후 성과에 대해 회고하는 기회를 얻고자 한다. 작성한 코드를 돌아보며 어떤 부분이 아쉬운지, 어떤 아이디어는 좋은지 정리한다. 알고리즘을 더 효율적으로 구현할 새로운 방법을 떠올릴 수 있을 것이다.

🛩️ 프로젝트 진행 방향

본 프로젝트를 진행하며 거쳐온 주요 마일스톤은 아래와 같다. 구현 순서가 아닌 프로젝트의 구성 단계에 따라 나열했다. 이후 포스트에서 하나씩 세부적으로 설명할 예정이다.

  1. GradArray class 및 Grad class 구현
    가장 먼저 gradient의 저장 및 backpropagation을 지원하는 array인 GradArray class와 GradArray가 생성되기 위해 사용된 함수 정보를 저장한 base class인 Grad class를 구현한다. GradArray는 멤버 변수로 Grad class의 객체를 가지는데, 이를 이용해 backpropagation을 수행한다.

  2. Layer base class 및 Linear (Layer) class 구현
    신경망을 구성하는 각 layer의 base class인 Layer를 구현한다. Layer class는 feed forward 연산과 학습 가능한 parameter를 지원한다.
    Layer class를 상속해 가장 기본적인 신경망 layer인 Linear class를 구현한다. 추가적으로, Linear의 parameter를 초기화하는 함수 또한 정의하여 사용한다.

  3. Activation base class 및 Sigmoid (Activation), Tanh (Activation), ReLU (Activation) class 구현
    신경망에서 활성화 함수 역할을 하도록 설계되어 Layer class를 상속 받은 Activation class를 구현한다. Layer class와 유사하지만 Activation class는 학습 가능한 parameter를 가지지 않는다.
    Activation class를 상속해 Sigmoid, Tanh, ReLU class를 구현한다. 이때 각각은 새로운 Grad class를 지닌다.

  4. Loss base class 및 MSE (Loss) class 구현
    예측과 실제 레이블을 통해 loss를 연산하는 Loss base class와 이를 상속 받는 MSE class를 구현한다. MSE는 Mean Squared Error를 연산한다.

  5. Optimizer base class 및 SGD (Optimizer) class 구현
    주어진 parameter를 backpropagation을 통해 optimize하는 Optimizer base class와 이를 상속 받은 SGD를 구현한다. backward()를 통해 연산된 gradient로 최적화를 진행한다.

  6. 연산 그래프 시각화를 위한 GraphNode class 구현
    Grad class를 통해 GradArray의 연산 과정은 그래프 형태로 표현된다. graphviz를 이용하여 어떤 GradArray가 연산 되는 과정을 연산 그래프로 표현하고 시각화 하는 GraphNode class를 구현한다.

  7. OR & XOR binary classifier demo
    지금까지 구현한 Linear, Sigmoid, Tanh, ReLU, MSE, SGD를 이용하여 OR 논리 연산과 XOR 논리 연산 classifier를 구현한 뒤 학습 및 평가한다.

❕ 세부적인 구현 목록은 아래 GitHub repo에서 찾을 수 있다.

👾 GitHub

KeraTorch는 오픈소스 프로젝트로, 모든 구현과 구현 과정은 repo에서 찾을 수 있다. main branch에 publish된 코드에 오류가 존재하는 경우 issue를, 소스 코드에 기여하고자 한다면 PR을 넣을 수 있다.

CONTRIBUTION.mdLICENSE.md는 추구 추가 예정이며, unittest를 위한 코드와 CI를 위한 GitHub actions 또한 추가될 예정이다.

본 프로젝트가 인상 깊다면 🌟 star를 통해 필자를 행복하게 만들어주자...!! 😊

2개의 댓글

comment-user-thumbnail
2023년 7월 19일

잘 읽었습니다. 좋은 정보 감사드립니다.

1개의 답글