강의 복습 내용은 아래의 링크(PDF 파일에는 후첨)로 첨부합니다. 기초적인 Python 문법은 생략하고, 딥러닝 수학 관련해서 헷갈릴 만하거나 새롭게 알게 된 내용을 첨부합니다.
과제는 필수과제 5개, 선택과제 3개가 주어졌습니다. 필수과제 5개는 Python의 기초 문법이나 자료형을 활용하고, 혹은 Regular expression을 사용하여 문제를 해결하도록 구성되었습니다. 필수과제 4번의 경우는 문제의 설명이나 테스트 케이스를 맞추는 것이 명확하지 않아 해결에 이틀이 걸렸습니다. 다만 나머지 과제의 경우에는 쉽게 해결할 수 있었습니다.
필수과제1은 numpy를 이용해 min, max, mean, median 등을 구하는 문제였습니다. Python 내장 함수로도 충분히 구현 가능하지만, numpy는 다양한 통계 함수를 지원합니다.
필수과제2는 텍스트를 전처리(pre-processing)하는 함수를 작성하는 것입니다. 문자열을 정규화(normalize)하는 일은 NLP에서 매우 흔한 일입니다. 많은 API들이 손쉬운 정규화 방법들을 제공하지만, 이를 적용하기 전에 전처리를 진행해야 하는 경우가 많습니다. 예를 들어, stop words라고 불리는 의미 없는 단어들을 제거하거나, 대소문자를 소문자로 변환하여 Cat
과 cat
이 같은 단어로 인식되도록 합니다.
필수과제3은 텍스트 전처리나 파일명 변환에서 일반적으로 사용될 수 있는 기법을 가볍게 연습합니다. 숫자를 영어단어로 바꾸거나, underscore _
로 구분된 단어들을 camel case로 변환하는 것입니다. 만약 서비스를 구현하거나, 복수의 데이터 파일들의 명명 규칙이 다르다면, 일관적으로 통일하는 것이 중요하겠죠?
필수과제4는 숫자 야구 게임, 필수과제5는 모스 부호와 알파벳을 상호 변환하는 문제였습니다. 앞서 말했듯이, 필수과제4는 description이 모호했고, 이를 해결하는 것이 쉽지는 않았습니다. 필수과제5는 과제를 수행하면서 정해진 틀을 활용하되, 효율성 역시도 고려했습니다. 다른 팀원들은 for
loop를 돌려서 원하는 entry를 찾는 방식으로 구현했습니다. 하지만 Python의 가장 큰 장점은 dictionary
로 hash table이 구현되어 쉽게 사용할 수 있다는 것입니다.
주어진 코드에서 모스 코드는 key는 알파벳 대문자, value는 모스 부호인 dictionary
로 구현되어 있습니다. 따라서 알파벳에서 모스 부호로 변환하는 것은 $O(1)$의 시간 복잡도를 갖게 되는데, 모스 부호에서 알파벳으로 변환하는 것은 $O(T)$의 시간 복잡도를 갖습니다. 왜냐하면 for
loop를 돌려 value를 비교해서, 해당하는 key 값을 찾아야 하기 때문입니다. 여기서 $T$는 전체 알파벳의 개수를 의미합니다.
그런데 이러한 문제는 key와 value가 서로 뒤집어진, 즉, 기존 dictionary $D$의 key가 새로운 dictionary $D'$의 value로, $D$의 value가 $D'$의 key가 되는 것입니다. 해당 코드는 Python의 list comprehension 형태의 문법을 사용하면 간단해집니다. 이를 보통 reversed dictionary라고 불립니다.
reversed_dict = {val: key for key, val in morse_code_dict.items()}
해당 내용을 사용한다면, Python의 핵심 기능을 이용해 효율성도 고려하면서 코드를 작성할 수 있습니다.
피어세션은 첫 40분은 서로의 학습 내용을 확인하고, 코드를 리뷰하는 시간을 가졌습니다. 이때, 저는 Likelihood와 MLE의 수식적, 직관적 의미를 설명했고, 과제4, 5번에 대해 다른 팀원들에게 질문하였습니다. 이를 바탕으로 과제 4번을 바로 해결할 수 있었습니다. 또한, 선택과제 1번에 대한 해설을 진행하여, 코드를 깔끔하게 작성했다는 팀원들의 칭찬도 받을 수 있었습니다. 이전에 gradient descent 알고리즘을 numpy, PyTorch 각각을 이용해 직접 구현해본 경험이 해당 과제를 진행하는데 많은 도움이 되었습니다.
노션 페이지 관리는 제가 맡아서, 템플릿을 만들고 꾸미는 역할을 하고 있습니다. 생각보다 Slack을 이용한 커뮤니케이션이나 내용을 follow-up하는 과정이 가시적이지 않아서, Notion을 이용해 정리하기로 결정했습니다.
노션 페이지 주소는 https://team21.nannullna.dev 입니다.