문자열 단위 Language Model

RNN으로 문자 하나씩을 예측하는 문자열 단위 Language Model을 hello 예제로 따라가며, 입력을 One-Hot으로 주는 이유와 학습/추론의 차이를 정리한다.

hello 예제#

Vocabulary를 [h, e, l, o]로 두고, 학습 문자열 hello를 학습한다고 하자. Language Task에는 항상 사전이 존재한다는 걸 잊지 말자.

문자열 단위 Language Model은 현재까지의 문자를 보고 다음 문자를 예측한다. 그래서 입력과 target이 한 칸씩 어긋난다.

  • 입력 문자: h, e, l, l
  • target 문자: e, l, l, o

한 타임스텝의 처리는 다음과 같다.

  1. 입력 문자를 One-Hot encoding으로 넣는다. 입력 차원은 (vocab_size,)다.
  2. 선형 변환을 통해 Hidden layer에 도착한다.
  3. Hidden state 값 중 하나는 다음 Hidden layer로 전달되고, 다른 하나는 현재 타임스텝의 출력을 위해 output layer로 선형 변환된다(). 이 값이 최종 logit이 된다.
  4. logit에 softmax를 적용한다.
  5. 예측 값과 target의 차이를 Loss로 반영해 역전파한다.

왜 입력을 One-Hot으로 주는가#

각 문자를 One-Hot encoding으로 표현하는 데에는 이유가 있다. 대안으로 각 문자를 스칼라로 1, 2, 3, ...으로 표현했다면, 각 문자 h, e, l, o에 continuous한 순서가 생긴다. 하지만 실제로는 문자들 사이에 수학적인 순서가 없고, 2와 3 사이의 2.5 같은 index도 없다.

그래서 각 문자를 One-Hot으로 표현한다. 이것은 일종의 Categorical variable이고, h, e, l, o는 서로 Independent하다.

학습과 추론의 차이#

문장의 시작은 <sos>(start of sentence) 토큰으로, 종료는 <eos>(end of sentence) 토큰으로 명시한다.

학습과 추론은 거의 동일하지만, 가장 중요한 차이는 추론에서는 현재 타임스텝의 출력이 다음 타임스텝의 입력으로 들어간다는 점이다. 자기 자신의 출력을 다음 예측에 다시 사용하는 이 특징을 Auto-Regressive라고 부른다(auto는 자기 자신, self를 의미한다). 학습 때 정답을 입력으로 넣는 것과의 차이는 Teacher Forcing과 Auto-regressive 생성에서 더 다룬다.

정리#

  • 문자열 단위 LM은 입력과 target을 한 칸 어긋나게 두고() 다음 문자를 예측한다.
  • 입력을 One-Hot으로 주는 이유는 문자들이 순서 없는 Categorical variable이고 서로 independent하기 때문이다. 스칼라로 주면 없는 순서가 생긴다.
  • <sos>로 시작해 <eos>로 끝내고, 추론에서는 자기 출력을 다음 입력으로 쓰는 Auto-Regressive 방식으로 생성한다.

댓글