본문 바로가기

패스트러너 기자단 4기

[패스트캠퍼스 Upstage AI Lab 2기 부트캠프] #03_2개월차 후기

#00_진짜진짜 솔직  2개월차 후기

 

EDA 조별 프로젝트 이후 어느새 또 한달이 훌쩍 흘러가버렸다.

 

그 사이 우리 부트캠프에서는 git 실시간 강의, 통계 실시간 강의, Machine Learning 실시간 강의, 그리고 자료구조 및 알고리즘 실시간 강의, chatgpt 현직자 특강을 진행하였다.

 

특히 이번 주 일정이 굉장히 벅찼는데, 수업 주제도 특히나 난이도가 높은 자료구조 및 알고리즘이었는데다가 화수목 3일 연속으로 풀 실시간 강의로 진행되었다. 목요일 쯤에는 진짜 이러다 죽지 않나 싶었다. 다른 사람들은 어떻게 버티는걸까... 9 to 6로 일하는 회사원도 보통 그 시간을 다 일하는데 쓰는 법이 없거늘!! 이런 강도 괜찮은건가... 첫날 휴식시간 넉넉히 달라는 한 수강생에게 장난삼아 '강인한 정신력으로 버티십셔'하고 말한 것을 후회했다. 박카스 젤리와 커피로 겨우 버텼다. 그리고 그 후유증으로 어제 하루 종일 잠만 잤다. 꼭 알고리즘 복습을 하려 했는데...

 

공부가 계속 계속 밀리고 있다.

아직 git 복습도 다 못 했고, ML 복습도 다 못 했고, ML 두번째 과제부터는 손도 못 댔고, 알고리즘도 이제 복습을 해야하는데.... 

ㅎㅎ 왜 공부할게 줄지를 않는지 모르겠다고 친한 수강생이랑 푸념을 주고 받곤 한다.

 

어쨌든 그럼에도 불구하고! git 강의도, ML 강의도, 알고리즘 강의도 너무너무너무 재미있었다! 강사님들과 고작 며칠 보고 헤어져야하는게 아쉬운 INFP..

 

before starting

일부 복습 게시글은 아직 정리가 덜 된 관계로 비공개 상태임에도 링크를 걸어둔 것들이 있습니다.

추후 잘 보완해서 모두 공개 게시글로 전환할 수 있도록 하겠습니다.

 

#01_git 실시간 강의 : 최우영 강사님

(복습 게시글
https://hyj89han.tistory.com/81
https://hyj89han.tistory.com/82)

(수업 전 참고자료

https://www.youtube.com/watch?v=1I3hMwQU6GU

https://gin-girin-grim.tistory.com/10)

 

git이 협업에 많이 사용된다는 것은 알고 있었으나, repo 접근을 위해 가입해둔 게 전부였을 뿐, 매번 공부하는 것을 미루고 있었던 터라 git 실강이 준비되어있어서 많이 기대하고 있었다. 그리고 매우 어려웠다......... 물론 재미는 있었지만!
후... 얼른 복습을 해야 TIL도 할텐데... 하하.......

 

이틀에 걸친 git 강의는 '혼자하는 git''함께하는 git'이라는 주제로 진행되었다.

 

수업은 Git Bash로 진행되었으며, git 실시간 강의를 진행해주신 최우영 강사님 본인 수업에서는 CLI(Command-Line Interface) 만 사용할 것이고, GUI 쓰다가 걸리면...... (이하생략)

 

bash 자체를 완전히 처음 써보는 상황이라 알려주시는 코드를 따라가는 것만으로도 벅찼다. bash setting 옵션을 몇가지 알려주셨는데 실행하는 과정에서 뭔가를 빠트리는 바람에 코드를 실행할때마다 이런게 100 줄이 넘게 생성되었지만 고칠 정신이 없어서 그냥 일단 넘어갔다. (물론 아직도 수정을 못 했다. ㅜㅜ)

line    1:
E481: No range allowed: 1 set nu
line    2:
E481: No range allowed: 2 set ts = 4

 

그래도 1일차가 끝나갈 무렵에는 제법 bash 내 directory 이동이나 파일 생성 및 .py 파일을 수정까지는 어느 정도 익숙해졌다. 난생 처음 github repository도 생성해보고, 프로필 README.md도 생성했다. 이 프로필 꾸미기가 진짜 해보고 싶었는데 강사님이 유용한 링크(https://rahuldkjain.github.io/gh-profile-readme-generator/)를 알려주셔서 손쉽게 만들 수 있었다. 엄청 대단한걸 해낸 것 같은 기분이었다.

 

 

 

2일차에는 본격적으로 협업 툴로써의 git 사용법을 알려주셨다. 

기본 틀은 

$ git add main.py

$ git commit

$ git push origin main

이고, 중간 중간 반드시 $ git status 로 수정사항을 체크할 것을 강조하셨다.

 

'함께하는 git' 부분은 1일차보다 조금 더 머리에 넣어야 할 내용들이 많아서 너무 빠르게 지나가서 당황스러웠지만, 강사님이 강의를 녹화해서 수강생들에게 공유해주셨고 짧게 팀플을 진행해보게 하셔서 어찌저찌 한번은 fork, clone, commit, push까지 해보긴 해봤다. 남은 연휴동안 이 영상을 포함하여 bash 사용부터 쭉 한번 더 훑고 TIL을 시작하는 것으로 git 복습을 진행할 계획이다.

 

내가 특히 수업을 재밌게 들었던 강사님들은 다들 기본을 중시하시는 경향이 있었는데 최우영 강사님도 이런 부분은 마찬가지였다. ls로 디렉토리 내 파일을 계속 체크하며 작업하시는 부분, Conventional Commits (https://www.conventionalcommits.org/ko/v1.0.0/) 의 중요성을 엄청 강조하시는 부분, $ git status를 지속적으로 체크할 것을 강조하시는 부분 등 이런 포인트들이 나랑 엄청 잘 맞았다. 회사에서 일해본 적 있는 사람이라면 기본과 약속이 얼마나 중요한지 아니까... 그래서 강사님이 계속 우스갯소리로 이렇게 하면 저랑 탕비실에서 면담을 갖게 된다며 하지 말아야 하는 행위들을 짚어주시곤 하였는데 그럴 때 마다 괜히 내가 아찔해지는 기분이었다. 팀원 중에 누군가 저런 코드를 쓴다? 상상만 해도 아찔했다. 어쨌든 나중에 나도 현업에 나가게 될 때, 이런 실수들 안하도록 잘 복기해야겠다.

 

그리고 특히 git 명령어 중 가장 충격적이고 마음에 들었던 명령어가 있는데, 바로 git blame이었다. 세상에, blame을 할 수 있다니, 최고다... 제발 우리 업계에도 blame 기능 좀 구현해주세요.... 할많하않...

진짜 이 업계는 참 신기한게 많구나.. 하는 생각을 많이 하게 했던 수업이었다.

 

 

#02_Machine Learning 실시간 강의 : 김용담 강사님

(복습 게시글

https://hyj89han.tistory.com/100

https://hyj89han.tistory.com/101

https://hyj89han.tistory.com/103

https://hyj89han.tistory.com/104

https://hyj89han.tistory.com/108

https://hyj89han.tistory.com/109

https://hyj89han.tistory.com/110)

아직은 강의 교안에 필기를 정리한 정도로밖에 작성하지 못 했지만 추후 조금 더 다듬어서 내용을 정리할 예정이다.

 

총 6일 (오전 실시간 강의 3일, 풀 실시간 강의 3일)에 걸쳐 앞서 EDA 강의를 진행해주신 김용담 강사님이 '데이터분석을 위한 선형대수학''Machine Learning Workflow'라는 주제로 머신러닝 강의를 진행해주셨다. 이 쯤 되니 강사님과의 내적 친밀감은 이미 맥스. ㅎㅎ

 

워낙 머신러닝을 위해 공부해야하는 내용이 방대하다보니 강사님이 제공해주신 Machine Learning Workflow 강의 교안만 129 페이지에 달했다. 처음에는 뒷 부분은 안 다루겠거니 하고 전달받은 강의 교안을 의심했을 정도였다.

 

용담강사님 또한 기본적인 정의를 잘 짚어주시며 강의를 진행하시는데, 이런 부분이 특히 듬성듬성 공부한 나에게는 큰 도움이 된다. 안다고 생각하고 넘어가면 결국 아무것도 모르는 상태가 되기 때문에..

 

이과였고, 물리를 수능 선택과목, 교양필수 과목으로 수강했었기 때문에 '데이터분석을 위한 선형대수학' 정도에서 다루는 벡터나 행렬의 개념은 익숙했다. 벡터의 내적 정의라든지, L1 norm, L2 norm, cosine similarity 라든지 다 아는 내용이었지만 그럼에도 나는 기초부터 정리하고 수업을 듣는 과정 자체를 즐거워하기 때문에 수업은 재밌게 들었다.

사실... 내가 시조새라서 고등학교 이과 수학 내에 행렬이 있었...지만 파장을 우려하여 이 얘기는 아껴두고 있다.... 그저 고등학교 때 행렬을 배워서 얼마나 다행인가 홀로 안도할 뿐... 이후 교과과정에서 없어진 걸로 알고 있다.... 

 

cos similarity를 설명하는 과정에서 한 수강생이 쏘아 올린 공 때문에 그 수강생, 나, 강사님 사이에 많은 대화가 오갔는데, 그의 질문은 이랬다. 'cosθ를 쓰면 직관적으로 두 벡터 사이에 벌어진 각을 알 수 없지 않는냐, 왜 θ를 쓰지 않고 cosθ를 쓰느냐'는 것이었다. 솔직히 벡터 내적을 주구장창 한 사람으로서는 cosθ의 유용성에 의심을 가질일이 없었는데, 문득 이 질문을 듣고 4차원 이상의 공간에서는 각을 어떻게 정의하지? 하는 의문이 들었고, '아마 4차원 이상에서는 각을 정의하는게 어려워서 cosθ를 쓰는게 아닐까요?'하고 댓글을 달았고, 그가 쏘아올린 공은 더 거대해져 강사님의 페이스북에까지 등재가 되었다. 어째서인지 강사님이 신나보이시는건 기분 탓이겠지.

어쨌든 요약하자면, 애초에 4차원 이상에서 각을 정의할 때는 내적과 cosθ를 이용해서 각을 정의 하기도 하고, 벡터간 cosine similarity에 한정해서 생각해보면, cosine similarity를 정의할 수 있으려면 애초에 두 벡터가 교차해야한다는 전제가 붙기 때문에 교차하는 지점과 벡터의 end point 두개가 생기고, 세 점을 지나는 평면은 한 개로 단일 정의가 가능하기 때문에 그 평면을 기준으로 θ를 잴 수 있다는 것이다.

모든 이과생들이 그럴거라고 생각하지만, 사실 나는 정의 자체에 의문을 가지지 않는 습관이 있기 때문에 이런 생각은 한번도 해본 적이 없어서 고민하는 과정이 조금 새로운 경험이기는 했다.

상쏘공의 시작 눈덩이 굴리듯 불려버린 나 그리고 이쯤부터 신나기 시작하신 듯한 강사님
 

 

 

다만 '데이터분석을 위한 선형대수학' 강의 중 새롭게 얻은 시각이 하나 있었는데, 주어진 데이터에 대해 무엇을 기준으로 거리를 정의할 것인가라는 강사님의 질문에 나는 당연히 개별 feature를 축으로 잡고 거리를 재는 방법만 생각하고 있었는데, 필요에 따라서는 주어진 데이터 내 몇 개의 샘플을 기준으로 거리를 정의해 새로운 축을 정의할 수 있는 방법이 있다는 것을 새롭게 배울 수 있었다. 

 

 

'Machine Learning Workflow'는 강사님이 온라인 강의에서도, 그리고 틈틈이 중요성을 강조했던 부분으로 다음의 5단계에 대해 세분화하여 설명하는 것을 목표로 하였다. 그리고 이러한 흐름을 굉장히 잘 설명한 Google Cloud Tech의 The 7 steps of machine learning (https://www.youtube.com/watch?v=nKW8Ndu7Mjw) 이라는 영상도 함께 추천해주셨다.

Module 1 Module 2 Module 3 Module 4 Module 5
데이터 분석 문제정의 데이터 수집 및 정체 탐색적 데이터 분석 피처 엔지니어링 예측 모델 개발 및 적용

 

Module 1을 설명하는데 대부분의 시간이 할애되었는데, 기본적인 문제 정의에 필요한 7가지 질문과 Machine Learning에 대한 정의부터 다양한 방법론들까지 설명해주셨다.

머신러닝 방법론의의 기초를 다지기 위해 머신러닝의 정의, Train-Validation-Test split에 대한 설명, 회귀(Regression)와 분류(Classification)의 차이점, Loss Function Optimization 방법론으로써의 Gradient Descent Algorithm 과 그것을 실제로 구현하는 과제까지! 개인적으로 이 과제가 은근히 재밌었다. 여전히 코딩을 잘 못하기도 하고, 수식 구현하는 부분 외에는 강사님이 설정해놓은 초기값을 건드리지 않고 결과물을 내고 싶었다. 결국 피드백을 받았지만 아직도 정확히 이해는 못하고 있지만, 어쨌든 한 80%쯤 구현에 성공했고, 무엇보다 신기했던건 진짜로 max_iter 값을 늘리니까 선형회귀 선이 제법 그럴싸하게 바뀌는걸 직접 보니까 제법 신기했다. 진짜 이게 되네? 하는 기분이었다.

max_iter=100 (초기값)

 

max_iter=1000

Linear Regression, Linear Classifier, CART(Classification and Regression Trees), Random Forest, K-Means Clustering, Hierarchical Agglomerative Clustering, Gradient Boosting Machine(GBM), XGBoost, LightGBM (LGBM), CatBoost 등 이 많은 머신러닝 모델들을 다 설명해주셨다.

 

특히 용담 강사님은 이 분야에 생소한 수강생들에게 어떻게 단계별로 잘 전달할 수 있을까를 고민하여 수업자료를 만들고 아마도 여러차례 고민하시고 수업을 진행하시는지 늘 순차적으로 빠트리는 것 없이 지식을 쌓아올리는 기분이 든다. 또한 실시강 강의 시간을 수강생들이 충분히 이해하고 있는지 피드백을 충분히 주고받을 수 있도록 진행하셔서 굉장히 알찬 시간들이 되곤 한다. 진짜 교육에 진심인 분이다. ㅎㅎ

 

 

#03_자료구조 및 알고리즘 실시간 강의 : 노정호 강사님

(복습 게시글

https://hyj89han.tistory.com/111

https://hyj89han.tistory.com/112

https://hyj89han.tistory.com/113)

 

자료구조 및 알고리즘은 노정호 강사님께서 진행해주셨다.
노씨데브(https://www.nossi.dev/)의 대표이시고 유투브(https://www.youtube.com/@nossi-dev)도 운영중이시다.

 

보통 이런 온라인 강의의 경우, 일부 강의를 맡게 될 때 가장 어려운 부분이 타겟 설정일 것이다. 분명 완전 초보부터 완전 능력자까지 섞여있으니, 강사님들이 타겟팅을 설정하기 참 어려우실거라 생각된다. 그렇기 때문에 오히려 완전 기초부터 차근차근 설명하는게 맞다고 생각하기 때문에 노정호 강사님의 수업 역시 너무나 만족스러웠다. 일단 강의자료의 퀄리티부터가.... 와우... 보니까 keynote를 쓰시는 것 같던데, 언젠가 한번 써봐야지 생각만 하고 있다. 아직 나는 맥북이 없으니까 ㅠㅠ

물론 내가 성격상 유투브로 공부하는걸 안 좋아해서 주로 교재를 이용해 공부를 했던 탓도 있겠지만 진짜 이렇게까지 친절하고 시각화가 잘 된 자료로 시간복잡도, 메모리구조 등을 설명해주시는 분을 처음 만난 것이다.

(강사님의 Time complexity 다이어그램이 진짜 기가 막히는데 저작권을 생각하여 위키 이미지와 강사님 유튜브 링크로 대체한다.)

(시간복잡도 https://www.youtube.com/watch?v=GHClo7yu_20&t=13s)

https://en.wikipedia.org/wiki/Time_complexity

 

그래도 그간의 엉성한 공부로 시간복잡도는 이해하고 있었는데 컴공 베이스가 전혀 없고 심지어 기계치라서 메모리구조에 대한 개념이 거의 제로였는데, List 자료형 중 array 자료형과 linkedlist 자료형을 시각화하여 왜 두 자료형에서 n번째 자료를 찾는데 시간복잡도가 다른지 설명해주시는데 진짜 유레카 모먼트였다.

(메모리 구조 : https://www.youtube.com/watch?v=JHxY08iENxs)

 

1일차 수업의 후반부는 재귀함수를 이해하기 위해 많은 시간을 할애하였는데, 개인적으로 재귀는 진짜 늘 너무 어려워서 이 시간이 엄청 알찼다. 특히 강사님이 보여주신 강의자료에서는 재귀가 구현되는 방식을 팝업창처럼 시각화해주셔서 재귀를 이해하는데 한결 수월했다. 이날 풀강을 듣고 이미 육체도 정신도 너덜너덜해졌지만 강사님이 리스트가 주어졌을 때 조합 함수 구현만이라도 복습해와라, 복습하는 자가 승자다 라는 말에 겨우겨우 마지막 남은 힘을 쥐어짜내서 복습을 했더니 진짜 마법처럼 그날 배운게 한시간만에 정리가 됐다!!! (물론 부분집합 생성 함수에서 약간의 문제가 있었는데 이건 일단 넘어가기로 하였다.... 헷..)

 

1일차 후반부의 재귀함수 구현부터는 이론과 코드 구현을 번갈아 가면서 진행되었다. 2일차는 queue / stack /  graph 자료구조와 BFS / DFS 알고리즘, 3일차는 Priority Queue / Heap 자료구조와  Dijkstra알고리즘에 대해 수업을 진행하면서 동시에 짧은 시간안에 많은 코딩테스트 문제도 같이 풀어보았다. 진짜 코딩테스트가 열받는 것이(어디까지나 비전공자의 시점에서 ㅠㅠ), 분명 이론은 이해한거 같은데 직접 코드를 구현하다 보면 꼭 문자 몇개 때문에, 혹은 return 위치를 잘못 잡아서 에러가 나는 것이다. 후... 열받아... 문제를 많이 풀어보는 수 밖에...

 

실제로 강사님이 본인의 코딩테스트 준비 시절에 대해 구체적으로 설명해주셨는데, 앞으로 공부하는데 좋은 기준으로 삼을 수 있을 것 같다.

 

3일차부터는 아예 강사님이 노션으로 공유해주신 강의자료 안에 문제풀이 페이지를 만드셔서 수강생들이 문제를 푼 현황을 체크하고 코드를 공유할 수 있도록 하셨다. (그리고 또 노션에서 실수함 헷.. 언제쯤 노션을 매끄럽게 쓸수 있을까..)

코드리뷰가 많은 공부가 된다는 것은 알고 있었지만 아직까지 실제로 코드리뷰를 할 일이 거의 없었고, 내 코드를 리뷰 받는 경우도 거의 없었는데, 강사님이 다른 분들의 코드도 짚어서 설명해주시고, 내 코드도 봐주신게 엄청 도움이 되었다. 강사님이 설명해주시는 동안 빠르게 따라서 코드를 구현하고, 코드 구현할 시간 주실 때 한번 더 구현해보고, 완료했다 말씀드리면 응용문제를 주셨는데 응용은..... 한번을 해결을 못했다... 하하하.....

 

어쨌든 진짜 말도 안되게 알찬 3일이었다. (물론 진짜로 죽을뻔 했지만...)

 

엄청 강도 높은 3일을 함께 해서였을까, 그새 강사님과 정이 들었는데 마지막이 다가오자 강사님이랑 헤어지는게 너무 아쉬웠다. 강사님의 마지막 인사말이 약간 내 맘을 동하게 했다. 언젠가 만날 수 있겠죠.. 라고 하셨는데, 진짜로 현업에서 뵐일이 있으면 좋겠다.

 

 

글을 마무리하며...

원래는 기자단 마감을 이렇게 코 앞에 두고 마지막 글을 쓰는 일은 없게 하고 싶었는데, 실강과 2.5년차 팔로업 검사로 인해 미뤄지고 미뤄져서 이제야 세번째 글을 쓸 수 있게 되었다. 리포터로서 작성하는 글들은 조금 더 드라이하고 팩트를 전달하는 것을 중심으로 하여 작성할 계획이었는데, 개인적으로도 커리큘럼 측면에서도 유난히 벅찬 한 달이었어서 푸념과 감정만 가득한 글이 되었다. 다음 글은 다시 팩트 전달 중심의 글을 작성할 수 있도록 컨디션을 잘 컨트롤해보려 노력해야겠다.

 

 

앞으로의 목표들

단기 목표

git 협업 복습하기

ML 복습 마무리 하기

자료구조 및 알고리즘 실강 복습하기

매일 자료구조 및 알고리즘 교재 필사 (TIL)

 

중기 목표

부트캠프 핸드북 만들기

 

장기 목표

numpy로 수식 구현해보기

ml 프로젝트 후 사이드프로젝트 구상해보기