SKN_13th

[플레이데이터 SK네트웍스 Family AI 캠프 13기] 7주차 후기

8000gam 2025. 5. 11. 15:03

길고 긴 연휴가 끝나고 수요일부터 다시 분주한 하루가 시작되었다. 연휴라는 게 참 무섭다. 야행성 생활을 하던 나로써는 주말이 되면 평소보다 늦게 자고 늦게 일어나게 된다. 이런 생활을 주말부터 화요일까지 4일을 보내니, 수요일 아침이 유독 힘들게 느껴졌다. 조금이라도 붐비는 시간을 피하기 위해 평소에도 조금 일찍 나오는 나는 그 날도 여덟시 반에 도착했다. 항상 준비해놓고 전날 배웠던 내용을 잠깐 돌아보거나 그 날 배울 내용을 살짝 훑어보는 시간을 가지는데, 유독 그날은 아무것도 못하겠어서 수업이 시작할 때까지 엎드려서 잠을 청했던 기억이 있다. 이러기 싫어서 쉬는 날에도 일찍 자고 일찍 일어나자고 매번 다짐하지만, 내 몸이 주말의 단잠 만큼은 양보하기 싫은 모양이다.

💻 What?

  • Introductory Deep Learning

딥러닝에 대해 계속 열심히 배우고 있다. pytorch로 딥러닝의 근간이자 가장 기초적인 모델인 MLP(Multi-Layer Perceptron) 를 구현해보고, 모델이 실제로 연산하는 과정을 배웠다. 주요 키워드로는 Loss Function, Backpropagation, Activation Function(모델에 Nonlinearity를 더해준다), Optimizer(Gradient Descent에 디테일을 더해준다)가 있겠다. 그리고 raw data를 메모리에 불러오고 데이터 전처리 및 배치 단위 재구성을 해주는 pytorch 내부 클래스인 DatasetDataLoader에 대해 자세히 배웠다. 돌아오는 주에 두번째 미니 프로젝트를 실시한다는 예고와 함께 금요일 수업이 끝났다. 대주제는 이탈 예측이다. 강사님께서 팀 구성도 미리 알려주셔서, 메신저 채팅 채널을 만든 뒤 팀원분들을 초대했다.

  • 코딩테스트 스터디 그룹 재편성

지난 주 코딩테스트가 끝난 뒤, 코딩테스트 스터디 그룹을 재편성했다. 놀랍게도 이번 그룹의 팀장은 내가 맡게 되었다. 다른 팀원분들의 알고리즘 역량을 정확히 파악하고 있는 상태는 아니지만, 내가 팀원 모두를 가르칠 레벨은 아닐 것이다. 지금은 멤버들 개개인이 역량을 키울 수 있도록 내비게이터 역할을 완수한다는 생각으로 진행하다가, 차근차근 공부해서 튜터의 역할도 해내고 싶다.

😮 So What?

  • 꽉찬 3일

이번 주는 수업을 3일 밖에 하지 않았지만, 3일 간 배운 내용들을 돌이켜 보면 정말 꽉찬 3일이었다. 확실히 배우는 내용들이 쉽지 않음을 느낀다. 얼마 전 배운 머신러닝(whitebox) 관련 내용은 기존에 한 번씩 배운 적이 있는 부분이라 따라갈 만했는데, 딥러닝은 그렇지 않다. Activation FunctionOptimizer도 나에겐 어색한 친구들이다. tensorflow를 통해 혼자서 딥러닝을 찍먹했던 시절이 있었지만, 지금은 pytorch를 사용하다 보니 더욱 어색한 느낌이 들기도 한다.

  1. Backpropagation

앞서 배운 머신러닝과 마찬가지로, 딥러닝 모델도 기본적으로 Gradient Descent를 통해 Loss Function을 최소화하는 방향으로 parameter들을 반복적으로 업데이트한다. 그러나 딥러닝에서는 수많은 뉴런들이 여러 층(Layer)으로 얽힌 복잡한 네트워크 구조를 이루고 있어, 단순한 Gradient Descent만으로는 각 parameter의 gradient를 직접 계산하기 어렵다. 이러한 문제를 해결하기 위해 도입된 것이 바로 Backpropagation(오차 역전파) 이다.

 

Backpropagation은 Output Layer에서 계산된 Loss를 기준으로 Chain Rule(다변수함수의 미분: 연쇄법칙)을 사용하여 각 층의 parameter에 대한 gradient를 Input Layer 방향으로 한 층 한 층 차례대로 계산한다.

 

 

$y = (x_1 + x_2) \cdot z$

 

위와 같은 Computational Graph가 있다고 가정하자. $x_1$에 대한 $y$의 도함수를 구하고자 할 때 곱셈 분배법칙으로 괄호 안 두 항에 $z$를 곱해준 뒤에 $x_1$에 대해 미분해도 된다. 그러나 $x_1 + x_2$를 $f$라는 함수로 치환하여, $y$를 $f$에 대해 미분한 도함수와 $f$를 $x_1$에 대해 미분한 도함수를 구한 뒤 둘을 곱해주어도 전자와 똑같은 결과가 나온다. 이렇게 여러 변수들이 합성함수의 관계로 복잡하게 얽혀있는 경우, 각 변수에 대한 도함수를 직접 구하기보다는, 중간에 등장하는 연산 결과를 하나의 함수로 치환하고, 이를 이용해 Chain Rule을 적용하는 것이 훨씬 효율적이고 일반적인 방법이다.

 

딥러닝에서의 Backpropagation은 이 Chain Rule을 반복적으로 적용하여, 최종 출력값의 Loss에 대한 각 parameter의 gradient를 효율적으로 계산하는 알고리즘이다. 이를 통해 모델은 각 parameter가 Loss에 얼마나 영향을 주는지를 정량적으로 파악하고, 이를 기반으로 Gradient Descent를 수행하게 된다.

  1. torch.utils.data.Dataset & torch.utils.data.DataLoader

Dataset은 raw data를 메모리 상에 올려주고, 개발 환경으로 불러오는 방법을 정의하는 클래스이다. 총 관측치 수 조회, 인덱싱, 전처리 방식들을 해당 클래스에서 유연하게 정의할 수 있다. DataLoaderDataset이 불러온 데이터를 batch 단위로 쪼개주는 클래스로, 필요에 따라 쪼개기 전에 데이터를 전체적으로 섞을지에 대한 여부를 shuffle: bool 파라미터를 통해 지정할 수 있다. 간단히 말하면 두 클래스는 데이터 로딩 및 전처리 파이프라인이라고 볼 수 있겠다. DatasetDataLoader라는 개별 클래스들이 담당하는 업무를 tensorflow에서는 tensorflow.data.Dataset라는 클래스 하나가 메소드 호출 방식으로 통합 수행한다는 차이가 있는 것 같다(pytorch의 두 클래스는 클래스를 호출할 때 업무 관련 parameter를 지정함으로써 업무 수행 방식을 정의한다).

 

 

🎈 Now What?

일단 딥러닝 모델의 기본적인 연산 과정은 머릿속에 잘 넣어둔 것 같다. 지금은 다음 주에 있을 프로젝트를 대비해서 머신러닝을 다시 되짚어봐야겠다. 아직 주제를 구체화하진 않았지만, 대주제만 봤을 때는 정형 데이터를 다뤄야 할 것 같아 딥러닝보다는 머신러닝의 의존도가 높을 것 같다(모델링해보기 전까지는 모르겠지만). 이전 기수 학우님들의 사례와 Kaggle 경진대회에서 유사한 주제의 프로젝트들이 있었는지 살펴보면서 인사이트를 얻어야겠다. 다음 주에는 평일에 운동을 할 수 있으려나...? 다시 열심히 달려보자🔥🔥🔥