CS231n 수강 후기
in AI on Studying AI
필자는 작년 여름 Stanford의 유명한 강의인 CS231n: Convolutional Neural Networks for Visual Recognition을 독학하며, (자유 주제로 진행되는 final project를 제외한) 모든 assignment를 풀어보았다. 이 글에서는, 그 과정에서 필자가 배운 것과 느낀 점들을 후기로 남겨보려 한다. 이 글이 CS231n을 수강할지 고민하는 분들께 조금이나마 도움이 될 수 있기를 바란다.
CS231n은 무엇이고, 어디에서 배울 수 있는가?
CS231n은 스탠포드 대학에서 학부 고학년생 및 대학원생을 대상으로(!) 개설된 인공 신경망 및 컴퓨터 비전 강의이다. 이 강의가 워낙 명강의로 잘 알려졌기 때문에, 이제는 한국에서도 AI를 공부하고자 할 때 추천하는 강의로 자주 등장하곤 한다. 하지만 강의의 대상이 대상인 만큼, 입문자에게 자주 추천되는 것에 비해 AI를 처음 시작해보려는 사람이 준비 없이 바로 듣기에는 살짝 난이도가 있는 편이다.
물론 스탠포드 재학생이 아니라면, 해당 강의를 정식으로 수강하며 여러 지원(채점, 질의응답, 프로젝트를 위한 하드웨어 지원 등)을 받는 것이 불가능하다. 하지만 감사하게도 유튜브에 2017년도 강의 영상이 업로드되어 있어, 전 세계의 누구나 무료로 CS231n 강의를 들으며 공부할 수 있다! 필자는 위의 영상을 보며 공부했지만, 영어가 익숙하지 않은 경우 Kyoseok Song님의 한국어 해설 영상을 함께 본다면 큰 도움이 될 수 있을 것 같다. 또한, 강의를 듣다 보면 과제에 대한 이야기가 나오는데, 과제는 총 3개로 구성되어 있으며 이곳에서 다운로드해서 직접 풀어볼 수 있다.
어떤 선행지식이 필요할까?
필자가 강의를 수강하며 꼭 필요하다고 생각한 선행지식은 크게 세 가지로, 선형대수학, 다변수미적분, 파이썬 코딩이다. 관련 분야의 전공생이라면 학부 1~2학년 과정에서 자연스럽게 배우는 내용이지만, 다른 분야에서 넘어와 처음 인공지능을 하려고 한다면 꽤 막막하게 느껴질 것이다. 하지만 이들은 앞으로 어떤 목적으로 인공지능을 하게 되더라도 반드시 익숙해져야 할 내용들이다. 그렇기 때문에, 이들 중 하나라도 익숙하지 않은 부분이 있다면 먼저 해당 과목을 공부하고 오는 것을 강하게 추천한다. 다행히 이들 모두 인터넷에 좋은 강의나 자료가 많이 올라와 있기 때문에, 독학하는 것이 그렇게 어렵지는 않다. 예를 들어, 선형대수학의 경우 유명한 선형대수 교재의 저자인 Gilbert Strang의 MIT 강의가 있다.
강의에서 다루는 내용
유튜브에 공개된 2017년도 강의를 기준으로, CS231n에서는 image classification을 위한 간단한 머신러닝 알고리즘(KNN, SVM 등)부터 출발해, CNN(Convolutional Neural Network)의 구조를 배운다. 이후 backpropagation과 gradient descent등 현재까지도 인공지능 모델을 학습시킬 때 가장 기본적으로 사용되는 방법들을 배운다. 강의 후반부에서는 더 나아가 RNN, RL, GAN등 다양한 딥러닝 아키텍쳐를 간단하게 배우게 된다. 또한, 매번 주어지는 과제를 통해 강의에서 배운 다양한 모델의 핵심 구성요소들을 실제로 구현하게 된다.
정리하면, 강의를 통해 인공지능에서 다루는 문제를 정의하고, 이를 해결하기 위해 모델을 만들고 학습시키는 전반적인 과정을 학습하게 된다.
CS231n을 공부하며 느낀 점
우선, 이 강의를 AI의 기초를 다지고자 하는 모든 분들께 적극 추천한다. 이제부터 필자가 이 강의를 들으며 왜 이렇게 생각하게 되었는지 간단하게 적어보고자 한다. 먼저, 강의는 설명도 깔끔하고 체계적이기 때문에, 특정 분야(RL, GAN 등)를 한 강좌에 빠르게 소개하는 후반부를 제외하고는 흐름을 따라가는 데 큰 어려움이 없었다(RL의 경우 당시 필자의 선행지식이 부족해 이해가 어려웠다). 그래서 강의를 통해 인공지능을 사용해 과제를 해결하는 전반적인 workflow를 잘 이해할 수 있었다. 또한, 약 2016년까지 학계에서 다뤄진 여러 아키텍쳐를 소개해주었기 때문에, 해당 시기까지의 연구들을 follow-up하는 데에도 큰 도움이 되었다.
하지만, 이 강좌를 통해 필자가 많이 배우고 성장할 수 있었던 이유는 사실 수업보다는 과제에 있다. 강의에서는 이론적인 내용을 가르칠 뿐이기 때문에, 실제로 이를 구현하기 위한 코딩 방법은 거의 다루지 않는다. 그렇기 때문에 AI를 공부하기로 결심한 뒤 CS231n 강의만 듣고 끝내버린다면, 본인이 알고 있는 개념을 실제로 코드로 구현할 수 있는 방법을 알 수 없게 된다. 결국 AI 모델 또한 프로그래밍을 통해 직접 코드로 구현해야 하는 것이기 때문에, 이론과 구현 사이를 연결할 수 없으면 앞으로 공부를 하는 도중 반드시 막히게 된다. 따라서, CS231n을 수강한다면, 반드시 주어진 모든 과제를 풀어보기를 권장한다. 하지만, 배울 점이 많은 만큼 과제가 어렵고 양도 생각보다 많기 때문에, 모든 과제를 해결하는 데 최소 100시간 이상을 투자한다는 마음의 준비를 해야 한다. 꽤 힘든 과정이지만, 과제를 모두 풀고 났을 때 투자한 시간을 후회하지 않을 것이라고 장담할 수 있다.
과제는 각각의 주제마다 Colab 문서 및 관련된 여러 파이썬 모듈로 구성되어 있으며, 제공된 스켈레톤 코드의 TODO라고 명시된 부분들을 작성하여 목적을 달성하면 된다. 과제에서는 주로 NumPy 라이브러리를 사용하여 KNN이나 SVM과 같은 간단한 모델부터 시작해, 점차 3-layer neural network, CNN, LSTM, Transformer 등 복잡한 모델들을 각각의 layer 수준에서 차근차근 구성하게 된다. 예를 들어, dropout, batch normalization, convolution과 같이 모델에 사용되는 연산들을 직접 행렬 연산 수준에서 구현하고, backpropagation을 위해 이 과정의 gradient를 구하도록 요구한다. 사실 딥러닝 관련 실무에서 NumPy는 직접 사용되는 일이 적은 라이브러리인데다가, 이러한 기초적인 연산을 직접 구현할 일은 사실상 없기 때문에 처음 과제를 하다 보면 약간의 회의감이 들 수 있다. 하지만 PyTorch나 TensorFlow와 같이 가장 많이 사용되는 딥러닝 라이브러리가 NumPy와 유사한 부분이 많아 나중에 도움이 될 뿐더러, 과제를 통해 이런 강력한 라이브러리에 속한 함수들이 실제로 하는 일들을 가장 낮은 단계에서부터 직접 구현해보며 기본기를 탄탄하게 다질 수 있기 때문에, 한 번쯤은 꼭 필요한 경험이다.
그리고, 대부분의 경우 CS231n의 정식 수강생이 아니기 때문에 채점 결과를 받아볼 수는 없지만, 과제를 구현하는 각 단계마다 모델이 제대로 작동하는지 테스트하고, 성능을 평가하는 코드가 미리 짜여져 있기 때문에, 본인이 작성한 답안이 올바른지 어렵지 않게 확인할 수 있다. 이 과정을 통해 본인이 한 땀 한 땀 짜낸 모델이 숫자 모양의 사진을 생성한다거나, 주어진 사진이 무엇에 대한 것인지 설명해내는 등의 재밌는 결과를 만들어내는 것을 확인하게 되면 정말로 짜릿하다!
과제를 하면서 가장 어려웠던 부분은, 필자가 해결한 과제가 2021 Spring 강좌에 출제된 문제들이기 때문에, 과제 후반부에 수업에서 다뤄지지 않은 (2017년 이후에 등장한) 모델들이 등장했다는 점이었다. 그래서 마지막 과제의 Transformer 구현과 같은 경우는 직접 논문을 읽고 구조를 공부해가면서 구현을 해야만 했다. 스탠포드에서 더 최근의 강의 영상을 업로드하지 않는 한 해결되기 어려운 문제이지만, 요즘은 유튜브에 AI 연구들을 설명하는 좋은 영상들이 많이 있으니, 참고하면서 코드를 작성한다면 충분히 풀 수 있을 것이다!
마치며
앞서 다루었듯, 이제 AI를 공부하려고 하는 입장에서 CS231n의 모든 강좌를 수강하고 과제까지 전부 해결한다는 것은 결코 쉬운 과정이 아니다. 필자도 지난 여름에 해당 수업을 듣고 과제를 모두 해결하는 데 한달 정도의 시간을 썼다. 하지만, 과정이 어려운 만큼 많은 것을 직접 해결해가며 빠르게 성장할 수 있다는 것은 분명하다! 강좌 수강을 망설이고 있는 분들이 꼭 포기하지 않고 끝까지 해내서 많은 것을 얻어갈 수 있기를 바란다.
필자의 과제 답안은 이곳에서 확인할 수 있다.