AI VIDEO BRIEFING
카파시 makemore 2편 정리: 다층 퍼셉트론 언어 모델과 임베딩·학습률 튜닝
안드레이 카파시가 벤지오의 2003년 논문을 따라 다층 퍼셉트론 언어 모델을 직접 구현한다. 임베딩 테이블부터 미니배치, 학습률 탐색, 학습·검증·테스트 분할까지 딥러닝의 기본기를 코드로 하나씩 짚어간다.

핵심 메시지
쉽게 이해하기
이 강의는 이름 데이터로 새 이름을 만들어내는 makemore 시리즈의 두 번째 편이다. 앞 편에서 만든 바이그램 모델은 바로 앞 글자 하나만 보고 다음 글자를 예측했기 때문에 이름다운 결과를 내지 못했다. 그렇다고 문맥을 늘리자니 문제가 생긴다. 한 글자를 볼 때 27가지이던 경우의 수가 두 글자면 729가지, 세 글자면 약 2만 가지로 불어나 표의 칸마다 데이터가 거의 남지 않기 때문이다.
그래서 카파시는 벤지오 등이 2003년에 발표한 신경망 언어 모델 논문의 구조를 따라간다. 이 논문은 1만 7천 개 단어 각각에 30차원짜리 벡터를 붙이고, 학습이 진행되는 동안 이 벡터들이 공간 안에서 움직이게 한다. 의미가 비슷한 단어들이 가까운 자리에 모이면 "a dog was running in a"라는 문맥을 학습 중에 본 적이 없어도 "the dog was running in a"에서 배운 것을 끌어다 쓸 수 있다. 구조 자체는 문맥 세 단어를 30차원씩 90개 입력으로 펼치고, 은닉층과 tanh를 거쳐 소프트맥스로 다음 단어의 확률을 내놓는 형태다.
구현은 단어가 아니라 글자 단위로 한다. 글자는 27종, 문맥 길이는 3으로 잡고 3만 2천 개 이름에서 약 22만 8천 개의 학습 예시를 만든다. 여기서 카파시는 파이토치를 다루는 실전 감각을 함께 가르치는데, 임베딩을 이어 붙일 때 torch.cat은 새 메모리를 만드는 반면 view는 저장된 값을 그대로 두고 해석 방법만 바꾸기 때문에 훨씬 효율적이라는 점이 대표적이다. 손실 계산도 직접 지수화하고 정규화하는 대신 cross_entropy 한 줄로 대체하는데, 속도와 역전파 식의 단순함은 물론 로짓이 100처럼 커져도 최댓값을 빼주기 때문에 무한대가 나오지 않는다는 장점이 있다.
학습은 전체 데이터 대신 32개씩 뽑은 미니배치로 진행한다. 기울기가 정확하지는 않지만, 정확한 방향으로 적게 걷는 것보다 대략적인 방향으로 많이 걷는 편이 낫다는 설명이다. 학습률은 0.001부터 1까지를 지수 간격으로 늘려가며 손실을 기록한 뒤 곡선이 완만하게 내려가는 골짜기 부근인 0.1로 정하고, 후반부에는 10분의 1로 낮춘다. 이렇게 해서 앞 편 바이그램 모델의 2.45를 넘어 2.3까지 손실을 내린다.
다만 훈련 손실과 검증 손실이 거의 같다는 것은 과대적합이 아니라 모델이 너무 작다는 신호다. 은닉층을 300개로 키워도 2.23에서 멈추자 이번에는 임베딩 차원을 2에서 10으로 늘려 파라미터 약 1만 1천 개로 검증 손실 2.17을 얻는다. 임베딩이 2차원일 때 그림을 그려보면 모음 a, e, i, o, u가 한곳에 모여 있고 q와 문자열 끝을 나타내는 점은 멀리 떨어져 있어, 신경망이 바꿔 써도 되는 글자와 예외를 스스로 구분했음을 보여준다. 카파시는 은닉층 크기와 임베딩 차원, 문맥 길이, 배치 크기 같은 손잡이를 직접 돌려 2.17을 넘겨보라는 과제를 남긴다.
주요 인사이트
- 표를 키우는 대신 의미 공간을 만드는 것이 임베딩의 핵심이다. 문맥이 길어질수록 표는 지수적으로 커지지만, 벡터 공간에서는 비슷한 것끼리 지식을 나눠 쓸 수 있다.
- 같은 연산이라도 구현에 따라 비용이 다르다. 텐서를 이어 붙이면 새 메모리가 생기지만, view는 데이터를 그대로 두고 해석 규칙만 바꾼다.
- 손실이 낮다고 좋은 모델이 아니다. 훈련 손실과 검증 손실이 거의 같으면 오히려 모델이 작다는 뜻이므로 키워야 하고, 둘이 벌어지기 시작하면 그때부터 과대적합을 걱정한다.
- 테스트셋은 아주 드물게만 봐야 한다. 결과를 보고 무언가를 고칠 때마다 사실상 그 데이터로도 학습하는 셈이기 때문이다.
- 성능의 병목이 항상 층 크기인 것은 아니다. 은닉층을 세 배로 키워도 개선이 없던 모델이 임베딩 차원을 2에서 10으로 늘리자 비로소 손실이 내려갔다.
자주 묻는 질문
왜 세는 방식(표) 대신 신경망을 쓰나요?
문맥을 한 글자만 보면 27가지지만 두 글자면 729가지, 세 글자면 약 2만 가지로 경우의 수가 지수적으로 늘어납니다. 표의 칸은 폭발적으로 늘어나는데 각 칸에 들어갈 데이터는 너무 적어져 제대로 학습되지 않습니다.
학습률은 어떻게 정하나요?
0.001부터 1까지를 지수 간격으로 나눈 학습률을 순서대로 적용하며 손실을 기록한 뒤, 학습률 대비 손실 그래프를 그립니다. 너무 낮아 변화가 없는 구간과 값이 튀며 불안정해지는 구간 사이의 골짜기를 고르는데, 이 강의에서는 0.1 부근이었습니다.
최종 성능은 어느 정도였나요?
앞 편 바이그램 모델의 손실이 2.45였는데, 임베딩 10차원과 은닉 뉴런 200개, 파라미터 약 1만 1천 개로 구성한 모델이 20만 스텝 학습 후 검증 손실 2.17을 기록했습니다. 앞 10만 스텝은 학습률 0.1, 뒤 10만 스텝은 0.01을 썼습니다.
원문과 출처
이 글은 원본 영상의 자막을 바탕으로 한국어 독자를 위해 요약했습니다. 전체 맥락과 최신 정보는 원문에서 확인하세요.
YouTube 원본 영상 보기 ↗