모델이 가진 어휘 사전에 없는 단어를 말한다. 사전은 학습 데이터에 나온 단어로 만들어지므로, 신조어·오타·고유명사·다른 언어 표기처럼 학습 때 못 본 문자열이 들어오면 대응하는 항목이 없다.

단어 단위로 사전을 만들면 이 문제를 피할 수 없다. 사전을 아무리 키워도 새 단어는 계속 생기고, 사전 크기는 출력층의 파라미터 수에 직접 곱해지므로 무한정 늘릴 수도 없다.

가장 단순한 처리: UNK

사전에 없는 단어를 전부 [UNK] 라는 특수 토큰 하나로 바꾼다. 구현은 간단하지만 손실이 크다. “Fluoxetine” 과 “ㅋㅋㅋㅋ” 이 같은 토큰이 되어 서로 구분되지 않고, 문장에서 정보를 가장 많이 담은 단어가 하필 OOV 인 경우가 많다. 생성 모델에서는 출력에 [UNK] 가 나오면 그 자리를 복원할 방법도 없다.

단어보다 작은 단위로 쪼개기

지금 표준은 어휘를 subword 단위로 만드는 것이다. 자주 나오는 문자열은 통째로 하나의 토큰이 되고, 드문 단어는 여러 조각으로 쪼개진다.

BPE 는 문자 단위에서 시작해 가장 자주 붙어 나오는 쌍을 반복해서 하나로 합치며 어휘를 만든다. 사전에 없는 단어가 들어와도 알고 있는 조각들로 나눠 표현할 수 있으므로 OOV 가 원리적으로 사라진다. 바이트 단위에서 시작하면 어떤 문자열이든 표현 가능해진다.

FastText 는 다른 방향에서 같은 문제를 푼다. 단어 임베딩을 그 단어를 이루는 문자 n-gram 들의 임베딩 합으로 정의한다. 학습 때 못 본 단어라도 문자 n-gram 은 대부분 본 것이므로, 그 조합으로 임베딩을 만들어낼 수 있다. 형태 변화가 많은 언어에서 특히 유리하다.

tokenization 설정에서 unk_token 은 이런 방식을 쓰더라도 남는 예외를 위해 여전히 정의해 둔다.