실질적인 조언들
이전 글: 21년 상반기
파이썬에 대한 기본기를 어느정도 쌓고난 뒤에 본격적으로 자연어처리 공부를 시작해보고자 했다. 여기서의 '기본기'란 내가 코드를 직접 짜지는 못하더라도, 코드를 봤을 때 오래걸리겠지만 이해는 할 수 있는 수준을 뜻하는 단어로 사용하였다. 물론 아직 부족하지만, 마음이 급하기도 했고 빨리 공부해보고 싶은 마음이 컸다. 아직 정확히 '자연어처리'가 무엇인지 감도 못잡고 있는 상황에 수단에 불과(물론 중요한 수단이다)한 파이썬 공부에만 매몰되어있기에는 지금 배움에 대해 가지고있는 흥미를 쉽게 잃어버릴 것 같았기 때문이다.
자연어처리 공부를 시작할 때, 일종의 교과서처럼 생각하고 보았던 사이트가 딥 러닝을 이용한 자연어처리 입문 wikidocs이다. 자연어처리에 관심이 있는 독자 분이라면 해당 wikidocs 페이지를 이미 알고있을 수도 있을 것이라고 생각한다. 사실 글을 쓰고 있는 지금도 종종 참고하게 될 정도로 한국어로 된 무료 자연어처리 자료 중 가장 좋다고 생각한다.
무엇보다도 교과서로 삼은 가장 큰 이유는, AI에 대한 이론/수학적인 내용과 실제 구현과 관련된 코딩적인 내용을 모두 다루며, 그 수준이 가장 기초부터 시작하기에 받아들이기 쉬웠기 때문이다.
보통 학습하기에 어렵게 느껴지는 자료들은, 다루는 내용이 그냥 어려워서라기 보다는 무엇이 어려운지조차도 모르겠기 때문에 그렇다. 물론, 위의 wikidocs에 있는 내용들이 처음에 받아들이기에는 어려운 내용들이 많다. 하지만 첫째로, 어떤 자료를 통해 공부를 하든, 어차피 여기 있는 내용들은 모르고 넘어갈 수는 없는 내용이기에 어렵지만 해야하는 내용이며, 둘째로, 적어도 내게는 어려웠지만 막연하지는 않게끔 설명하는 자료였기 때문에, 위 wikidocs를 교과서처럼 생각하고 공부해보는 것을 조심스럽게 추천한다. 물론, 이 wikidocs만 가지고 모든 것을 100% 이해하기는 힘들다. 그때마다 좌절하지 말고, 검색을 적극적으로 활용하길 바란다. 나 또한 어떤 개념에서 막혀서 넘어가지 않는지 확인하고, 해당 개념에 대한 공부를 충분히 한 뒤 돌아오는 식으로 학습을 했다.
지금은 밑으로 내려간 것 같은데, 원래는 앞에서 소개한 위키독스의 꽤 윗부분에, 흔히 선형대수의 중간 보스정도로 소개가 되는 SVD에 관한 내용이 나왔던 것으로 기억한다. 하지만, 설령 관련 내용이 초반부에 나오지 않게 되었다 하더라도 선형대수는 딥러닝을 이해하는 데에 정말정말 문자 그대로 필수인 분야이다. 당장에 선형대수에 대한 기초 지식이 없다면, 위의 wikidocs 2-7 챕터에서 'NLP에서는 하나의 토큰을 하나의 정수에 매칭시키는구나? 그래, 컴퓨터는 숫자로 생각하니깐 이렇게 해주는게 자연스럽네' 하고 생각하다가도, 2-8 챕터에서 원-핫 인코딩에 대해 배울 때 다음과 같은 질문이 떠오르며 무조건 막힐 수밖에 없을 것이다.
어? 갑자기 벡터가 왜 나오지? 그게 뭔데?
단어를 왜 벡터로 바꿔줘야 하지?
갑자기 유사도 얘기는 왜 나오지?
이 때가, '아, AI는 수학이라더니 이런 뜻이구나'를 느낀 첫 번째 순간이었다. 당연히 고비처럼 느껴졌지만, 여기서 당장에 포기하긴 이르다는 말을 해주고 싶다. 그 이유는, 우선 첫째로 (지극히 개인적인 생각이지만) '딥러닝 공부를 시작하는 데에 큰 무리가 없을 정도까지만' 선형대수를 공부하는 것에는, 그리 큰 다른 수학적 선수과목이나 배경지식이 필요하지는 않다는 것이다. '덧셈, 곱셈만 하면 된다'는 말에는 한 30%만 공감을 하는 입장이지만, '수학'이라고 굳이 겁먹을 필요는 없다는 것이다. 둘째로, 이 글을 읽고 있는 독자 여러분이 어떤 직무를 꿈꾸고 있는지는 모르겠지만, 꼭 AI가 아니더라도 데이터를 보게 된다면 이 정도는 상식으로 알고 있는게 도움이 될 것이라고 생각한다. 교육 과정이 바뀌어, 이제 필수 교육과정에서 행렬을 배우지 않게 된 것으로 알고 있는데, 그런 분들이면 더더욱 이런 Tabular 형식에 익숙해지는 것이 좋지 않을까 하는 생각이 드는 것이다.
어쨌든, 위와 같은 기초적인 고민에 더불어서 이른바 중간 보스인 SVD까지 가기 위해 유튜브 채널 '쑤튜브'의 선형대수 강의들을 쭉 다 보았고, 도움이 많이 되었다. 개인적으로는 SVD가 내려갔지만, 학습의 흥미를 심하게 떨어뜨리지 않는 한 해당 파트까지 다 보는 것을 추천한다. 약 85강 내외지만, 한 강이 보통 10분 이내이기 때문에 아주 오래 걸리지는 않을 것으로 생각한다.
필자는 위의 wikidocs와 쑤튜브 선형대수를 병행하는 식으로 공부를 하였었고, 특히 선형대수 강의는 한 한 달을 잡고 다 들었던 것으로 기억한다. 꼭 한 달은 아니어도 상관은 없지만, 이걸 너무 오래 잡고 있지는 않는 것을 추천한다. 이전 강의 내용에 근거하여 계속해서 확장되는 형태이기 때문에, 처지면 한도 끝도 없을 수 있다. 다시 말해, 9강을 듣고 한참 뒤에 10강을 들으면 기억이 안 나서 9강으로 넘어가고, 또 기억이 안 나서 8강으로 가고... 이러한 상황이 반복될 수 있다는 것이다. wikidocs는 꼼꼼하게 보되, 선형대수 강의는 완벽히 이해는 되지 않아도 다음 강의로 일단 진행하고 난 다음에 나중에 다시 한 번 더 보는 식으로 학습 하는 것을 개인적으로는 추천한다.
그렇게 wikidocs의 머신러닝 챕터즈음까지 공부를 했을 때, 문득 충동 구매를 해둔 패스트캠퍼스의 강의가 생각이 났다. 고등학생 때도 인강을 사본 적이 없는데, 내심 불안한 마음에 구매를 해뒀던 것으로 기억한다. 마침 이제 wikidocs의 딥러닝 파트를 들어갈 때도 되었겠다, 강의를 따라가는 데에 무리가 없을 것으로 판단되어 사두었던 강의를 듣기 시작했다. 이 때 들었던 강의는 패스트캠퍼스 김기현님의 딥러닝 유치원 강의이다. 다른 것들과 달리, 유료인 자료라 링크를 따로 달지는 않았다. 본인 판단 하에 추가로 듣는 것을 추천한다. 개인적으로는 처음 시작하는 사람 입장에서 친절하게 설명이 되어있어서 공부하는 데에 도움이 많이 되었었다. 여담으로, 그 때 당시에 패키치로 강의 몇 개를 묶어서 팔길래 낼름 사버렸는데, 요즘도 공부하는 주제가 그 강의에 있다면 찾아보기도 한다.
이렇게 보면 알겠지만, NLP 전반적인 기본기를 쌓는 데에 집중했던 반년을 보냈었다. 여기서의 기본기가 무엇을 뜻하는 것인지 모르겠다면, 위의 시작하는 글부분을 다시 읽기를 바란다! 이 공부는 다음 반년, 그러니까 22년 3월(4학년 1학기)까지 계속되었다. 겨울방학까지 쭉 이론을 공부한 셈인데, 그럼 그 사이에 실제 코딩은 연습을 쉬었던 것일까? 물론, 이론적인 공부보다는 덜하긴 했지만 개인적으로 끄적끄적 뭔갈 만들어 가며 실습을 했던 기억이 난다.
위의 이론 공부처럼 따로 공간을 만들어 소개하지는 않겠지만, 말하고 싶은 점은 처음 시작은 나와 관련된, 스케일이 작은 것이면 좋을 것 같다는 점이다. 설명을 위해, 뜬금없지만 이때쯤 인스타에서 유행했던 게임 하나를 소개하고자 한다.
'워들' 이라는 게임인데, 총 6번의 기회동안 단어를 맞추는 이른바 '영단어 여섯고개' 같은 것이다. 숫자야구와도 비슷해서, 만약 해당 글자가 이 단어에 들어있다면 노란색으로, 단어에 들어있는 데다가 위치까지 맞으면 초록색으로 표시를 해주는 것으로 힌트를 준다. 이 얘기를 왜 하느냐?
한 때 이 게임을 재밌게 즐기던 와중, 문득 '이 문제를 자동화해서 풀 수 있게 할 수는 없을까?' 하는 생각에 파이썬으로 워들을 자동화 하는 프로그램을 만들었던 기억이 난다. 물론 지금보면 흑역사일 정도로 좋지 않은 퀄리티이지만, 그만큼 구현이 어렵지는 않지만 나와 관련된 일이라 재미있게 했던 기억이 난다. 프로그램이라고 거창한 것이 아니라, input으로 현재 상태를 받아서, 최적의 다음 단어를 통계 기반으로 제시해주게끔 만드는 간단한 것이고, 통계기반이라고 거창한 것이 아니라 당시 유튜브에 '효율적으로 워들 푸는 법' 등이 많이 나왔기에, 그 알고리즘을 거의 그대로 가져다 쓴 것이다.
이제 막 시작하는 입장에서 나는 특히 퀄리티보다는 코딩하는 행위 그 자체에 익숙해지는 것이 중요하다고 생각한다. 그런 의미에서, 자신에게 친숙한 주제에 대해 직접 만들어보며 '단어는 어디에 저장하지? 아, 리스트에 단어들을 저장해두고, 하나씩 보면 되겠다', '어? 왜 오류가 나지? 에러메세지 엄청 복잡하네.. 근데 뭔가 type이 잘못되었다고 하네? 몇번째 줄에서 내가 뭘 넣었을 때 오류가 난거지?' 이런 식의 사고방식을 기르는 행위 자체를 경험해보고 직접 찾아다니는 것에 익숙해지는 연습을 할 수 있는 방법을 생각해보라는 것이다. 실제로, 다음 글에서 소개하겠지만, 이런 문제 해결 방법이 바로 직후에 들은 코딩 과목들을 듣는 데에 큰 도움이 되었다.
여튼, 이렇게 이래저래 공부를 하다보니 반 년이 지나갔었다. 다음 회차에서는 그 이후의 또 다른 반 년, 즉 컴과에서 열린 자연어처리 수업을 들으며 직접 프로젝트를 했었던, 4학년 1학기의 얘기를 할 예정이다.
댓글은 언제나 환영입니다!
후에 계속...