핵심 요약

  • 직전 글자 하나만 보는 바이그램 모델은 문맥이 부족하다. 문맥을 늘려 빈도표를 만들면 가능한 조합의 수가 빠르게 커진다.
  • 카파시는 앞선 문자 세 개를 임베딩한 뒤 다층 퍼셉트론에 넣어 다음 문자를 예측하는 이름 생성 모델을 구현했다.
  • 학습 손실이 낮아졌다는 사실만으로 성능 향상을 판단할 수 없다. 학습에 쓰지 않은 이름을 따로 두고 평가해야 한다.
  • 실습에서 문자 임베딩을 확장한 뒤 얻은 최선의 검증 손실은 약 2.17이었다. 카파시는 학습 설정을 체계적으로 최적화한 결과는 아니라고 설명했다.

한 글자 문맥과 빈도표의 한계

앞선 강의의 바이그램 모델은 바로 이전 문자 하나로 다음 문자의 확률을 예측했다. 구현은 단순했지만 생성된 결과가 이름처럼 들리는 정도는 낮았다. 앞선 문자를 두 개로 늘리면 가능한 문맥은 27×27개가 되고, 세 개로 늘리면 약 2만 개가 된다. 문맥별 관측 횟수가 적어지는 문제도 생긴다.

카파시는 이를 해결할 모델로 다층 퍼셉트론을 택했다. 입력을 여러 층에서 계산해 다음 문자의 확률을 내는 신경망이다. 접근법은 Bengio 등의 2003년 논문을 따른다. 다만 논문은 약 1만 7천 개 단어를 다루는 단어 수준 모델이고, 이번 실습은 문자 수준 모델이다.

문자를 좌표로 바꾸는 임베딩

논문의 모델은 단어마다 학습 가능한 벡터를 부여한다. 임베딩은 단어나 문자를 여러 숫자로 표현한 벡터다. 비슷한 문맥에서 쓰이는 단어의 벡터가 가까워지면, 학습 때 보지 못한 정확한 문장에도 유사한 표현에서 얻은 정보를 적용할 수 있다는 설명이다.

실습에서는 문자 27개에 각각 2차원 벡터를 배정했다. 임베딩 표는 처음에 무작위로 만들고 학습 과정에서 함께 조정한다. 정수로 표시한 문자의 행을 표에서 가져오는 방식은 원핫 벡터와 임베딩 행렬을 곱하는 방식과 결과가 같다. 카파시는 계산이 더 빠른 행 조회를 사용했다.

세 문자로 다음 문자를 예측하는 과정

모델은 앞선 문자 세 개를 입력받는다. 이름의 시작 부분은 점 문자로 채우고, 한 글자씩 이동하는 문맥 창을 만들어 입력과 정답 문자를 짝지었다. 처음 다섯 이름에서 만든 32개 사례로 계산을 확인한 뒤 전체 데이터로 확장하자 약 22만 8천 개의 학습 사례가 만들어졌다.

처음 구성에서는 문자별 2차원 임베딩 세 개를 이어 붙여 여섯 숫자로 만들고, 은닉층의 뉴런 100개를 거쳐 다음 문자 27개에 대한 점수를 냈다. 점수를 확률로 바꾼 뒤 실제 다음 문자에 부여한 확률을 기준으로 손실을 계산한다. 카파시는 직접 확률을 계산하는 과정을 보여준 다음 PyTorch의 교차 엔트로피 함수를 사용했다. 이 함수는 중간 계산과 역전파를 더 효율적으로 처리하고, 큰 점수에서 지수 계산이 넘치는 문제도 피한다.

처음 32개 사례에 맞춰 손실을 낮추는 일은 쉬웠다. 그러나 입력 문맥이 같아도 실제 다음 문자가 다른 사례가 있어 손실을 정확히 0으로 만들 수는 없었다. 이 작은 묶음에 잘 맞는 결과만으로 전체 이름에 대한 성능을 판단할 수도 없다.

학습률과 검증 데이터가 바꾼 평가

전체 사례를 매번 계산하는 대신 카파시는 32개씩 무작위로 뽑는 미니배치로 학습했다. 한 번의 기울기 추정은 덜 정확해지지만 계산이 빨라져 더 많은 갱신을 할 수 있다. 학습률은 0.001부터 1까지 단계적으로 높여 손실 변화를 살핀 뒤 약 0.1을 선택했고, 학습 후반에는 이를 낮췄다. 이 단계의 손실은 약 2.3으로, 앞선 강의에서 얻은 바이그램 모델의 2.45보다 낮았다.

카파시는 이 비교만으로 더 나은 모델이라고 단정하지 않았다. 모델이 커지면 학습 데이터를 외우면서도 새 이름에는 잘 대응하지 못할 수 있기 때문이다. 데이터를 대략 80%의 학습용, 10%의 검증용, 10%의 테스트용으로 나눴다. 학습용은 가중치 갱신에, 검증용은 임베딩과 은닉층 크기 같은 설정 선택에 쓴다. 테스트용은 반복적으로 확인할수록 그 결과에 맞춰 모델을 고르게 되므로 마지막 평가에 드물게 사용한다.

더 큰 임베딩에서 얻은 결과

2차원 임베딩과 뉴런 100개를 쓴 모델은 학습 손실과 검증 손실이 비슷했다. 카파시는 모델이 아직 충분히 맞추지 못하는 상태로 해석하고 은닉층을 300개 뉴런으로 늘렸다. 손실이 곧바로 개선되지는 않았고, 학습률을 낮추며 훈련한 뒤 두 손실은 약 2.23과 2.24에 이르렀다. 2차원 좌표를 그려보니 모음들이 가까이 모이고 점 문자와 Q는 떨어져 있었다.

카파시는 임베딩의 두 차원이 병목일 가능성을 제기했다. 이를 10차원으로 늘리고 은닉층은 200개 뉴런으로 조정한 뒤, 학습 손실 약 2.16과 검증 손실 약 2.19를 관찰했다. 이후 제시한 최선의 검증 손실은 약 2.17이다. 두 손실 사이에 작은 차이가 생긴 점은 과적합이 시작될 가능성으로 설명했다. 학습률과 학습 횟수 등을 즉석에서 조정한 실습이어서, 특정 변경 하나가 개선의 원인이라고 확정하지는 않았다.

결론적으로 이 실습은 여러 문자에 대한 빈도표를 직접 늘리는 대신 학습 가능한 임베딩과 신경망으로 다음 문자를 예측한 과정이다. 카파시가 제시한 손실 개선은 검증 데이터로 확인한 결과이며, 모델 설정과 학습 방식에는 추가로 조정할 여지가 남아 있다.