본문 바로가기

활동/SK네트웍스 Family AI 캠프 2기

SK네트웍스 Family AI 캠프 2기 : 9th week (7월 2주차)

이번 주부터 새로운 강사님께 수업을 배우기 시작했습니다!

새롭게 부임하신 강사님은 Linux, C, Python, 딥러닝 등의 기술에 능한 분이신데요.

강사님의 기술 스택 및 강의 이력을 보자마자... 이 분에게서 장인의 아우라를 느꼈답니다....!

CS 근본을 다 챙기는 동시에, 오픈 소스를 통해 트렌드를 지속적으로 받아들이고 계신 분이라는 게 보였어요.

기본기 및 원리에 초점을 맞추고 강의를 진행하시는 모습이 인상적이었어요.

그동안 제가 꿈꿔왔던 시니어 개발자 모습과 흡사하셔서 깜짝 놀랐답니다!

 

이런 분을 만나 뵐 수 있도록 자리를 조성해 주신... 엔코아 회사, 플레이 데이터 매니저님들, sk 관계자분들께 감사함을 표현하고 싶습니다...!

열심히 공부해서 강사님의 노하우를 제 것으로 만들어야겠어요 ^_^

저 역시 근본 있는 개발자가 되기 위해 노력하겠습니다!!

 

● 성취

월요일에 미니 프로젝트 1개를 마무리 지었어요!

머신러닝 모델을 사용해서 이탈 고객을 예측하는 것이 프로젝트의 주제였는데요.

이전에 호흡을 맞췄던 팀원들 위주로 배정된 덕분에 초반 탐색 시간을 아낄 수 있었습니다.

 

크롤링이 주제였던 이전 팀플에서는 코딩 경험자 위주로 활약을 한 덕분에 비전공자들이 나설 수 있는 기회가 적었어요.

따라서 이번에는 비전공자인 팀원들도 코드 작업에 참여할 수 있도록 역할 배치에 신경을 썼습니다.

프로젝트 결과보다 모두가 과정 속에 녹아드는 게 더 중요하다고 생각했습니다.

실수를 실패라고 낙인 찍지 않고 도전에 의의를 두는 분위기를 형성하기 위해 노력했어요.

 

그 결과로 모든 팀원들이 데이터 전처리, EDA, 머신러닝 모델 학습에 균등하게 참여할 수 있었습니다.

비전공자들도 포함해서요!

 

사실 이번 프로젝트는 1차 미니 플젝에 비해 점수를 살짝 낮게 받았어요.

그렇지만 이번 프로젝트를 계기로 '팀 내부 동기 부여 방식'에 대해 생각해 볼 수 있었습니다.

점수보다는 머신러닝 과정에 모든 이들을 참여시킴으로써 자신감을 부여하고 싶었습니다.

특히 다른 분들이 편하게 참여할 수 있도록 심리적 안정감을 위한 판을 깔아주고 싶었어요.

이 자료에 나오는 내용처럼요! 어차피 저는 머신러닝 경험이 사전에 있었기도 했구요...^^

 

무엇이 1등 팀을 만드는가?

지식 공유와 심리적 안전 | 구글의 ‘아리스토텔레스 프로젝트’가 “무엇이 1등 팀을 만드는가?”를 연구해 내린 결론은 심리적 안전감이었습니다. 하버드대학교 경영대학원 에이미 에드먼슨

brunch.co.kr

 

점수는 일시적이지만, 머신러닝을 대하는 태도야말로 장기적으로 가져가야 하는 가치이니까요!

 

마지막으로... 저를 믿고 PM 역할을 부여해 준 팀원들(재민, 재원 오빠, 준영 오빠)에게 감사함을 표현하고 싶습니다!

다들 포기하지 않고 열심히 참여하느라 고생 많았어!

따봉따봉~~

 

 

● 학습

새로 오신 강사님과 함께 '밑바닥부터 시작하는 딥러닝 1(축약어 : 밑시딥)'을 공부했습니다.

matplotlib, numpy 라이브러리만을 사용하여 딥러닝의 근간 원리를 구현하는 책인데요.

이 책 자체로도 상당히 유익하지만, 강사님의 풍부한 배경 설명 덕분에 더 풍성하게 즐길 수 있었습니다!

 

이번 주차에는 수업이 끝난 후에 다시 읽었던 '밑바닥부터 시작하는 딥러닝 1' 내용의 일부를 정리하려 합니다.

참고로 저는 1장(헬로 파이썬)과 2장(퍼셉트론)까지 다시 읽었습니다.

 

# 파이썬 버전

파이썬은 버전 2, 버전 3으로 크게 나눌 수 있습니다.

이 둘은 명령어가 100% 호환되지 않으므로 조심해야 하는데요.

이는 '하위 호환성'이 없기 때문입니다.

JavaScript와 반대 상황이라고 생각하시면 좋을 것 같아요!

참고로 '밑시딥'이라고 불리는 해당 책에서는 버전 3를 사용했습니다.

 

# 파이썬 속도 보완

파이썬과 같은 '동적 언어'는 정적 언어(C, C++ 등)에 비해 속도가 느려요.

그래서 빠른 연산 속도가 필요한 핵심 부분은 C/C++ 로 구현하기도 해요.

C/C++로 구현한 부분을 다시 파이썬으로 감싸면, 느린 파이썬 속도를 어느 정도 보완할 수 있어요.

 

그래서 numpy 라이브러리가 파이썬에 속하는 것 치고는 속도가 빠른 것이랍니다!

단, numpy 라이브러리는 알고리즘 테스트에서 import 하는 것이 불가능하므로 실무나 과제 테스트에서만 사용 가능하답니다...!

 

# 벡터, 행렬, 텐서

1차원 배열을 '벡터(vector)'로 칭하고, 2차원 배열을 '행렬(matrix)'라 불러요.

더 나아가 3차원 이상의 배열을 '다차원 배열'이라 부릅니다.

벡터, 행렬, 다차원 배열을 합쳐서 '텐서(tensor)'라 해요.

 

구글의 딥러닝 프레임워크인 'TensorFlow' 이름도 여기서 유래했어요.

텐서가 신경망을 타고 흐르는 모습이 연상되네요!

 

# 퍼셉트론(Perceptron)

'퍼셉트론'은 프랑크 로젠블라트(Frank Rosenblatt)가 1957년에 고안한 알고리즘입니다.

딥러닝 이론 자체가 퍼셉트론에서 유래했기 때문에 중요한 개념에 속한답니다!

퍼셉트론을 사용하면 다수의 신호를 입력으로 받아서 하나의 신호를 출력할 수 있어요.

 

멋있죠? 하지만 이러한 퍼셉트론 개념이 만능은 아닙니다!

단층 퍼셉트론(single-layer perceptron) 만으로는 XOR 문제를 해결할 수가 없어요.

이 XOR 문제를 해결하기 위해서는 퍼셉트론을 2층 이상 쌓아야 합니다.

이러한 퍼셉트론을 다층 퍼셉트론(multi-layer perceptron)이라고 합니다.

 

+) 참고로 1층에 NAND 게이트와 OR 게이트를, 2층에 AND 게이트를 지정함으로써 XOR 문제를 해결할 수 있습니다!

 

제 어린 시절에 자주 듣던 노래 중에서 '나인뮤지스-와일드'라는 곡이 있는데요.

그 곡에서 '하나보단 둘이 더 강하잖아'라는 가사가 나옵니다.

저는 이게 꼭 다층 퍼셉트론처럼 느껴지더라구요ㅋㅋㅋ

 

# 가중치(weight)와 편향(bias)

'가중치'를 통해 각 입력 신호가 결과에 미치는 영향력을 조절할 수 있어요.

즉, 가중치 값이 작으면 영향력을 적게 행사할 수 있고요.

이 값을 키우게 되면 큰 영향력을 행사하는 것이 가능해집니다.

 

'편향'은 뉴런을 얼마나 쉽게 활성화시킬 것인지 결정하는 요소입니다.

편향 값이 작을수록, 활성화 시에 필요로 하는 값(입력 신호에 가중치를 곱한 값들의 합)이 커져요.

 

 

● 개선

최근 저는 '정보처리기사' 자격증을 준비하고 있습니다.

+) 이것도 나름 포트폴리오 개선을 위한 노력이라 생각합니다.

 

개발자들 사이에서 해당 자격증을 주제로 갑론을박이 오갔다는 것 역시 알고 있습니다.

'정보처리기사' 자격증 취득이 불필요하다고 말하는 입장은 프로젝트 이력을 더 강조하고, 자격증이 필요하다고 주장하는 입장은 서류 전형에서의 베네핏과 IT 상식 습득에서 오는 장점을 더 강조하는 것으로 보였습니다.

 

두 입장 모두 일리가 있다고 생각해서 타협안을 선택했습니다.

'정보처리기사' 자격증은 단기로 준비하고, 프로젝트는 장기로 준비하기로 결정했습니다.

프로젝트는 캠프에서 진행하는 컨텐츠 말고도 개별적으로 추가 진행할 예정입니다.

 

일단 오늘은 간략하게 '정보처리기사' 자격증을 준비하면서 본 개념 몇 가지를 정리해보려 합니다.

헷갈렸던 개념들 위주로 뽑아 봤습니다.

 

# 트리의 운행법

  • Preorder : Root(먼저) ➡️ Left ➡️ Right
  • Inorder : Left ➡️ Root(중간) ➡️ Right
  • Postorder : Left ➡️ Right ➡️ Root(나중)

# 선택 정렬(Selection Sort)

'선택 정렬'은 n개의 레코드 중에서 최솟값을 찾아 0번째 인덱스에 놓고, 나머지 (n-1)개 중에서 다시 최소값을 찾아 1번째 인덱스에 놓는 방식을 반복합니다. 

이걸 (n-2) 인덱스에 놓을 때까지 하면 정렬이 어느 순간 완성됩니다.

 

# 버블 정렬(Bubble Sort)

'버블 정렬'은 인접한 두 값을 서로 비교하여, 크기에 따라 값을 교환하는 방식입니다.

이 과정을 정렬이 완성될 때까지 하면 됩니다.

 

# 퀵 정렬(Quick Sort)

'퀵 정렬'은 분할&정복(Divide&Conquer) 방식을 사용하여 자료를 정렬하는 방식입니다.

정렬 시에 피봇(pivot)이라 불리는 기준점을 잡는다는 특징이 있습니다.

 

배운 내용 정리하다 보니까 어느새 시간이 이렇게 되었네요...!

뭐 했다고 이렇게 시간이 빨리 흐르는 건지;;;

그래도 재밌었으니까 된 거죠 뭐...^^

 

아 얼른 자고 일어나서 또 독산역 가야지~~~!!

새로운 강사님께 배울 내용 생각하니까 너무 두근거린다~~~!!!

 


+) 부족한 부분이 있으면 댓글로 말씀해 주세요! 겸허한 마음으로 더 공부하겠습니다.