** 글을 쓰기 전에 적어두지만, 저는 딥러닝이라는 분야를 알게 되고 공부하려고 시도한 지 1년을 조금 넘긴 공대 학부생입니다. 저도 아직 뉴비지만 그래도 완전 맨 처음 이 분야를 접한 사람들에게 조금이라도 도움이 되고자 글을 씁니다! 혹시 더 좋은 정보가 있거나 틀린 내용이 있다면 지적 부탁드립니다!
** GPU 없어서 찡찡거림 주의
오늘 글의 주제는 "내가 딥러닝을 공부했던 방법"이다. 딥러닝 공부해야지, 직접 구현해봐야지라고 입으로만 노래를 부르면서 공부하던 시절이 있었고, 그렇게 하다가는 죽도 밥도 안될 것 같아서 방학 동안 회사 인턴으로 들어와서 좀 굴러보고 있다. 어찌저찌 삽질해서 나온 현 상태는 "CNN 기반의 Segmentation 분야 논문과 최신 코드를 읽고 내 프로젝트에 적용해볼 수 있고, 간단한 CNN 모델은 정도는 바닥부터 혼자 구현 가능한 상태"이다. 여전히 나도 뉴비지만 이젠 그래도 혼자서 디버깅은 할 수 있는 상황이니까 1년 동안 공부를 시도한 후기를 적어보고, 진짜 이 분야를 처음 접한 사람에게 나같이 삽질하지는 말라고(+ 이렇게 삽질한 사람도 있다고) 알리는 측면에서 글을 써본다.
나는 작년에 휴학을 하면서 인공지능을 공부해보고 싶었다. 요즘 하도 핫하다니까.. 그 중에서도 Neural Network 기반의 딥러닝이 제일 핫하단 걸 알게 된 후엔 딥러닝을 공부해야겠다!라고 결심했다. 아날로그 인간인 내가 딥러닝을 처음 공부하려 시도했던 건 동네 도서관에서 딥러닝 입문용 책 몇 권을 빌려서 공부하는 것이었다. 얇고 작은 책에 깔끔한 겉표지, 그리고 내용도 쉽게 썼다고 강조되어 있어서 별 생각 없이 빌려왔는데 역전파를 설명하는 부분부터 너무 재미가 없었다. 한 2~3시간 정도 읽은 후 포기. 그 뒤 한 페이지도 안 펼쳐 보고 2주 뒤에 반납했다. 수학도 좋아하고 코딩도 좋아하는데 이렇게 재미없을수가.. 그 이후로도 도서관에서 쉽다고 강조하는 책을 몇 권 빌려보았지만 재미는 여전히 없었고 뚝심있게 공부한 책은 하나도 없다. 최근에 학교 도서관을 가보니 더 최신 책들이 많아서 동네 도서관보단 사정이 낫다고 생각하지만 일단 입문용으로 책은 재미가 없어서 추천하지 않는다. 그래도 책을 읽고 싶다면 "일단 수학은 모르겠고 코딩부터 하자!"며 Tensorflow나 Pytorch 코딩을 시키는 책을 추천한다. 관련해서 예전에 괜찮게 읽었던 책은 "골빈해커의 3분 딥러닝"이라는 책이다.
그래도 공부를 바로 포기한 건 아니고.. 그 뒤에 딥러닝을 공부하려다 찾은 건 Coursera에서 무료로 제공하는 Andrew Nig의 Introduction to Machine Learning 이라는 인터넷 강의였다.
https://www.coursera.org/learn/machine-learning
"딥러닝 공부해야지! 근데 딥러닝은 머신러닝의 세부분야구나! 아 일단 머신러닝 강의를 들어서 기본을 탄탄히 하면 되겠다!"라는 흐름으로 수강을 시작했다. 영어 강의이지만 강사분이 쉽게 잘 설명해주셔서 딱히 부담감을 느끼지 않았고 매주마다 어디까지 공부해라는 push가 있어서인지 나중엔 수료증까지 받으며 잘 마무리했다. 수업을 듣고 나서 간단한 퀴즈와 코딩과제가 나오는데 진짜 강의 하나를 수강하는 느낌. 딱 대학교에서 기계학습개론 정도로 한 학기 동안 가르칠 분량의 쉬운 버전이었다. 강의를 통해 머신러닝의 기본 개념을 가볍게 배우기 좋았다. 사람에 따라 난이도 체감이 다르겠지만 행렬 차원을 고려해서 코딩하는 숙제가 좀 귀찮은 부분이 있었던 것 빼곤 공대생 입장에선 무난했다. 하지만 논문에 나오는 최신 모델을 돌려야 할 만큼 당장 딥러닝으로 해야할 목표가 있다면 이걸 먼저 배우는 걸 추천하지 않는다. 진짜 전반적인 머신러닝 개념을 overall하게 설명하기 때문..
그 다음에 아 이제 머신러닝 개념은 이해했으니, 딥러닝 공부를 해야지! 하고 처음 시도한 건 같은 사이트에서 같은 강사가 진행하는 Deep Learning 이라는 강의였다.
https://www.coursera.org/specializations/deep-learning?
이건 유료다. 한 달에 5만원($49) 정도를 내면서(월 단위로 구독하는 개념) 공부를 했는데 그 당시에 연구실 인턴으로 일과 중에 시간내서 공부할 수 없음 + 주말 탈진 + 강의 내용 중 머신러닝과 겹치는 내용이 많아서 재미가 반감됨 이라는 이유로 수료하기가 벅차서 전체 5개 강좌 중 하나만 끝내고 두 달 동안 10만원을 날렸다. 이 상태면 인턴이 끝날 때까지 coursera 강의는 안 보는 게 나을 것 같단 생각이 들어 강의 보기는 중단했다. 내가 재미없다던 그 부분만 넘기면 그 뒤는 좀 재밌어보였는데 시간과 재정상태로 아쉽게도 마무리하지 못한 게 아쉽다. 그 상태에서 나의 상태는 기본적인 CNN 개념을 알고 있고 tensorflow를 만져보려다 만 상태였다. 그 상황에서 연구실 인턴 동안 찔끔찔끔 관심있는 분야에 딥러닝을 적용했다는 논문 구경을 하면서 GAN, Encoder-Decoder, RNN, LSTM 모델을 보니 내용도 이해가 되지 않고 너무 어려워 보였다. 직접 논문 코드를 돌려보면서 하나하나 공부하려고 했더니 코드도 이해하기 어려웠지만, GPU가 없다는 장벽도 있었다. 결국 아무것도 직접 해본 건 없는데 해보기도 전에 지레 겁을 먹어버렸다. 심지어 내가 보던 EEG 논문은 Theano라는 요즘은 잘 안쓰는 딥러닝 프레임워크를 사용하고 있어서 더 멘붕이었다.ㅋㅋㅋ 이 기간 동안 딥러닝에 대해 좀 더 깊게 알게 된 건 하나도 없는 데 진짜 겁만 잔뜩 먹었다.
이후, 나는 자대의 딥러닝 관련 연구실에 인턴을 하러 가서 아무것도 모르겠다고 한 뒤 같이 인턴하는 친구들이랑 cs231n 강의 스터디를 진행했다.
https://www.youtube.com/playlist?list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv
그리고 이 강의가 진정한 참된 명강의임을 깨달았다. 이런 명강의가 무료라니.. 하며 감탄하며 하루하루를 보내고 이전에 공부를 하면서 직관적으로 잘 이해가 안 되었던 부분(Backprop이나 모델이 학습한 것들 시각화하는 거랑 기타 등등)을 시원하게 설명해주니 너무 좋았다. 이 시기에 SRCNN, DNCNN 논문을 읽으며, 1인 1 GTX1080 GPU를 연구실에서 대여받으면서 쾌적하게 논문 모델을 돌려볼 수 있었다. 이 당시엔 아 이게 학습하는 부분이구나~ 아 이건 prediction하는 부분이구나~ 이런 식으로 두루뭉술하게 파이토치 문법을 이해했고, transform?이런 건 왜 하는 거지? 아! Augmentation하는 거구나! 이미지 데이터 차원은 너무 복잡하다 ㅠㅠ 이 정도의 얕은 수준으로 코드를 공부했고 거기에서 output image 바꿔보고 혼자서 learning rate, optimizer 바꿔보고 learning curve를 그려보면서 맛보기 수준으로 코드 공부를 하고 짧은 4주 인턴이 끝났다.
이후 나는 학교 수업으로 기계학습 강의를 수강하는데.. coursera 강의의 심화버전(cs229)같은 느낌이었다. 딥러닝이랑 일단 피부로 와닿을 만큼 관련 있는 내용은 많이 없었다. 프로젝트로 기존에 남이 짜둔 간단한 코드를 내가 만든 데이터셋으로 실행해보는 정도로 한 학기가 끝날 때쯤 현타가 왔다.
"아, 나 분명 뭔가 이 분야 공부하려고 나름대로 애써봤는데 왜 아직도 혼자서 할 줄 아는 게 하나도 없지?"
관련 이론적 지식이 조금은 있는데 이걸 코드로 직접 짜본 적은 없고, GPU는 없고 이런 답답한 상황에서 제대로 직접 내가 코드도 짜보고 이론으로 배운 게 실제로도 적용되는 지 보고 싶어서 방학 동안 회사 인턴을 지원했다. 좀 구르는 느낌도 있지만, 인턴 기간동안 굉장히 많은 것을 배우고 있다. 회사 인턴 후기는 길 것 같아서 다음에 적는 걸로 하고, 내가 지금까지 딥러닝을 공부하면서 느낀 점을 적어보면 다음과 같다.
1. 딥러닝을 시작하기 위해서는 좋은 컴퓨터가 필요하다. 일단 GPU가 있어야 한다. 그래서 누구나 딥러닝 할 수 있다!라는 말에 100% 동의할 수 없다. 기본 개념이야 지금은 워낙에 좋은 강의가 많아서 누구나 배울 수 있다. 그런데.. 모델을 돌려보려면 GPU가 필요하다.(cs231n을 수강하는 스탠포드 학생들은 수업 수강하는 동안 구글 클라우드 계정을 받던데 참 부럽다) 몇 개의 layer를 쌓은 Neural Network(NN)도 CPU로 돌리면 느린데 더 복잡해지면 CPU로 학습은 시간이 너무 오래걸려서 못한다고 보면 된다. 그냥 컴퓨터가 얼어붙는데 컴퓨터까지 강제종료될 것 같은 그런 느낌이 있다.(내 컴퓨터가 성능이 좀 안 좋긴 하지만..) 물론 간단하게 돌리는 것이라면 Google Colab을 이용하는 것도 방법이다. 이정도의 간단한 NN 코드까지는 CPU나 Google Colab에서 돌려도 된다. (2021년 새로 내용 추가 : 조금 복잡한 모델이어도 수업 실습용으로 돌리는 코드 정도는 Google Colab으로 돌려도 괜찮다.)
https://cyc1am3n.github.io/2018/11/10/classifying_korean_movie_review.html
하지만 데이터 수가 많은 경우(GB를 넘어가는 데이터), 로컬 데이터를 Colab에 올려서 돌리는 것도 일이고 복잡한 딥러닝 코드를 .ipynb 파일로 짜는 것도 고역이다. 본격적으로 뭔갈 학습시켜보고 결과 분석하는 정도도 GPU 사용량 제한이 있어서 애매하다.
1) 내가 돈이 없는 학생이다!면 관련 연구실 인턴을 해보던, 회사 인턴을 해보던지 해서 GPU가 있는 환경에 접근하자.(만약 대학생이 아닌 청소년이라면 2)번으로 넘어가 부모님 찬스를 써보는 것도..)
2) 어느정도의 예산이 있다면 딥러닝을 공부할 컴퓨터를 맞춰보는 것도 하나의 선택지이다. 사실 개인 공부할 때 GTX1080 정도의 100만원이 넘는 GPU가 필요한 지에 대해서는 잘 모르겠다. 그래서 어느 정도 가성비를 찾아가면서 딥러닝용 컴퓨터 견적을 조금 알아봤는데 2019년 기준으로 170만원정도의 예산이 있으면 되는 것 같다. 회사 인턴 끝나면 나올 월급으로 지를 각을 재고 있다. 관심있는 사람은 아래 링크 참조.
https://www.youtube.com/watch?v=9AgqC_NW3as
2. 딥러닝은 스스로 삽질하면서 배워야 한다. 우리가 일반적으로 아는 기초과학과 비교하면 fair한 비교는 아니겠지만 기본 개념 중 무엇을 배워야 하는 지 순서가 명확한 기초과목과 달리 공부 하는 방법에 아주 탄탄한 체계가 없다. 나만 해도 공부하는 방법 관련해서 이렇게 삽질을 했으니.. 혼자서 이것저것 찾아가면서 공부하는 것에 익숙하지 않거나, 누군가가 정리해서 쉽게 잘 설명해주는 자료(강의)에 익숙해져 있는 경우 특히나 이런 과정이 힘들 것이라고 생각한다. 모르는 정보는 직접 공부할 의지와 동시에 삽질을 할 수 있는? 정도의 코딩 실력이 필요한데 그런 게 없으면 막막함의 늪에 빠지게 된다. 물론 CS의 다른 분야도 혼자서 계속해서 배워나가야 하니까 크게 다르다고 생각하진 않지만 개발자가 아닌 일반인의 입장에서 딥러닝을 공부하는 것은 이런 점에서 특히 막막하지 않나 라는 생각이 든다. 그래도, 구글링 해보면서 느낀 것이지만 이런 상황에서도 스스로 잘 공부하시는 분들이 넘쳐난다는 건 신기한 일이다. 아마 이 분야에 종사하거나 관련 공부를 하는 사람들 중 매우 탄탄한 커리큘럼으로 딥러닝을 공부한 사람은 없을 거니까.. 그런데도 정말 매일매일 수많은 논문이 쏟아져 나오는 이 분야가 너무 신기하고 나는 아직도 배울 게 산더미라는 생각이 들면 정신이 아득해진다.
3. 직접 해보지 않으면 뜬구름 잡고 있는 느낌이다. 이론 공부를 하고 있으면 아~ 그렇구나 이런 거구나하고 전반적인 흐름과 concept 정도는 가져갈 수 있다. 하지만 세세한 디테일까지 내가 익혀서 남한테 설명해줄 수 있는 레벨이 되려면 "직접 코드를 보고 구현"해봐야 한다. "CNN은 인간이 시각 정보를 처리하는 과정을 모사했습니다. 각각의 convolutional layer에서는 유의한 feature를 잡기 위해 filter가 stride씩 움직이면서 input값과 convolution을 합니다" 정도로 이해하는 것과 "conv layer에서 stride 1, padding 1, filter size 3으로 하면 input feature map의 h와 w가 유지됩니다. 이 때 convolution에 필요한 filter 파라미터 갯수는 64개의 output channel이 필요하면 총 64*3*3개의 파라미터가 생기고 filter 값들의 초기화는 pytorch의 경우 default가 xavier initialization입니다."정도로 이해하는 건 디테일의 정도가 다르니까. 물론 내가 봤던 cs231n 강의에서 이 내용을 분명 다뤘다. 하지만 저 내용을 처음 배울 때 나는 저런 디테일을 한 번에 다 이해하고, 익혀서 체화시키지 못했다. 이런 게 있구나 정도로 넘어가버리면 안되고, 저 개념들을 다 내 것으로 소화시키기 위해서는 직접 해봐야 한다. 계속 말하지만 다른 분야도 마찬가지이다. 근데 유독 나는 이 분야를 공부할 때 직접 해보는 과정이 필요하다는 걸 많이 느꼈다. 직접 해본다는 의미는 정말 바닥부터 직접 해보는 것이지만, 하다 못해 그냥 레퍼런스 코드를 잡고 클론코딩(똑같이 타이핑 하는 것)이라도 해보면 많은 도움이 된다.
그래서 이런 상황에서 더 딥러닝을 빠르고 쉬운 루트로 배울 수 있는 방법을 생각해봤다. 물론 이 flow를 따라가기에 문제가 없으려면 행렬과 미분 개념, 그리고 파이썬 기본 문법 정도의 배경지식은 알고 있어야 한다. 그리고 GPU가 있는 환경이 필요하다.
1) cs231n 강의의 전반부를 공부하면서 딥러닝 관련 이론을 공부한다.(적어도 RNN 전까지는 다 보면 좋을 듯) 영어가 장벽이라면 해당 강의를 번역한 블로그를 찾아보는 것도 방법이다. 내가 보진 않았지만, cs231n의 한국어 버전이라고 볼 수 있는 "밑바닥부터 시작하는 딥러닝: 파이썬으로 익히는 딥러닝 이론과 구현" 이라는 책이 있다고 한다. 주변에서 보고 많이 도움된다고 추천해줬던 게 기억이 나는데 내가 보진 않아서 여기에 대한 코멘트는 생략.
2) 동시에 일단 Pytorch든 Tensorflow든 Sung Kim 이라는 분의 유튜브 강의를 보면서 Framework 사용법과 어떻게 코드가 돌아가는 지 감을 익힌다. 일단 12, 13강의 RNN은 건너 뛰어도 될 듯. 강의를 그냥 보면서 타이핑하면서 결과 값만 찍어보거나 아 이런 식으로 함수를 쓰는 구나 이 정도만 알아가도 충분하다. 만약 파이썬에 대한 기본지식이 없다면 파이썬 프로그래밍 공부를 간단하게라도 하고 와야 한다. (적어도 for, if 등의 조건문과 with 구문, 파이썬에서의 class 상속 개념, numpy array 다루는 법, 파이썬에서 모듈을 들고 오는 방법 정도는 알고 있어야 한다!)
https://www.youtube.com/watch?v=SKq-pmkekTk&list=PLlMkM4tgfjnJ3I-dbhO9JTw7gNty6o_2m
3) 그러면서 간단한 모델부터 구현해서 학습시켜보면서 framework에 익숙해져본다. 나는 linear classification -> NN -> CNN 순서로 간단한 이진 분류기(Binary Classifier)를 만들어보는 게 쉬워서 괜찮았다. 주변에서도 MNIST 데이터나 XOR 같은 쉬운 예제부터 직접 해보라고 많이 추천했다. 뭐가 됬든지 혼자서 배운 내용을 바탕으로 내 마음대로 데이터도 모아보고 작은 거라도 직접 해보는 게 중요하다. 앞에서 말한 유튜브 강의가 정말 친절해서 이 정도를 혼자서 하는 건 무난할 것이다. 그러고 나면 transfer learning을 통해 vggnet16이나 resnet18 같은 pre-trained model으로 학습을 시켜본다.
이런 식으로 전반적인 프레임워크나 코드 동작 원리에 대해서 이해하고 나면 딥러닝에 대한 대략적인 감이 올 것이라고 생각한다. 그 뒤부터는 RNN, LSTM을 써보든, GAN을 공부하든, 혼자서 논문과 코드를 읽을 레벨이 되는 것 같다. 딥러닝으로 하려고 하는 목표가 있었다면 이 시점부터 개인 프로젝트를 덜 삽질하면서 진행할 수 있다고 생각한다. 여기서 딥러닝을 좀 더 자세하게 이해해보고 싶다면 나도 주변에서 많이 추천받았던 cs231n HW를 해보는 것도 좋은 것 같다. 딥러닝 뿐만 아니라 전반적인 머신러닝 개념을 공부하고 싶다면 coursera나 cs229 lecture note를 이용하는 것도 좋다. 일단 cs229는 수학적인 내용이 많아서 일단 coursera에서 ML을 듣는게 쉬운 접근 flow일 것이다! (coursera는 수업하나를 듣는 느낌이라서 독학하기에 편안한 느낌이 있다. 그리고 코딩 과제 퀄리티도 괜찮았고. framework 없이 직접 loss를 구해보고, gradient descent 코드를 작성해보면서 내부에서 어떤 일이 일어나는 지 그런 걸 익힐 수 있어서 좋았다.)
~~ 후기 ~~
나도 배울 게 산더미이지만 이렇게 내가 공부하면서 느꼈던 점을 정리하면서 앞으로 어떻게 공부해야할 지 좀 더 디렉션이 잡혔다. 진짜 CS 쪽은 작은 것이라도 직접 해본다는 것이 정말 필요한 것 같다. 언어를 배우는 것과 비슷한 느낌이라고 해야하나. 이해했다는 것에서 그치지 않고 내 것이 될 때까지 소화시키자.
'컴퓨터 사이언스 > 딥러닝' 카테고리의 다른 글
[딥러닝 뉴비의 좌충우돌 일기] Tensorflow Object Detection API로 동물의 행동 분류하기 - 서론 : What and Why? (0) | 2020.06.03 |
---|---|
[딥러닝 뉴비의 좌충우돌 일기] 개발환경 셋팅하기(introduction) (0) | 2019.09.04 |
8주 동안의 회사 인턴 참가 후기 (0) | 2019.08.10 |
[딥러닝 뉴비의 좌충우돌 일기] 시작 (0) | 2019.07.24 |
[cs231n] Lecture 4. Back propagation을 하는 이유와 Neural network의 직관적인 해석 (0) | 2018.10.23 |
댓글