brunch

2. 서브워드의 필요성과 토크나이징

1장 AI는 데이터를 어떻게 이해할까: 특징량화의 원리

by AI개발자
gaebalai.com (44).png

1편은 등록을 미리 해놔서 변경이 안되서 링크를 남깁니다.

1. 임베딩과 분포가설 쉽게 이해하기


생성형 AI가 텍스트를 다룰 때의 최소 단위인 토큰(token)에 대해 구체적으로 정리하지 않았습니다. 이번에는 토큰 단위가 될 수 있는 여러 형태와 그 차이점을 소개하고 비교합니다. 텍스트를 토큰으로 분할하는 단위와 방법을 아래 표처럼 정리합니다.

genai-016.jpg 텍스트 분할 단위와 분할 방법 정리 (예시 "I love reproducibility"문장을 기준으로 하며 길어지는 부분은 일부만 표시함, 바이트는 Python의 encode())

단어 혹은 서브워드 단위 분할은 알고리즘에 따라 달라지므로, 일반적으로 하나의 정답(유일한 분할 결과)이 존재하지 않습니다. 여기서는 예시 중 하나를 제시한 것입니다. 또한 일부 서브워드 알고리즘은 먼저 단어 분할을 수행한 뒤 적용하기도 하므로, 경계가 완전히 명확하다고 보기는 어렵습니다. 비교를 쉽게 하기 위해 단순화된 형태로 표기했습니다.


연습문제5: 단어 분할은 일반적으로 유일하게 정해지지 않습니다. 이 점을 구체적으로 이해하기 위해 한국어 문장에서 단어 경계가 애매한 예시를 들어봅시다.

(예: "오늘도 공부한다" → "오늘/도/공부한다" 또는 "오늘도/공부/한다"등)



바이트 단위 분할

바이트 단위 분할은 복잡한 알고리즘이 필요없고 결과에 임의성도 없습니다. UTF-8기준으로는 256개의 바이트만 있으면 그 조합으로 모든 문자열을 표현할 수 있으므로 어휘(vocabulary)크기를 매우 작게 유지할 수 있습니다.


하지만 단위가 너무 작아서, 분할 후 토큰 시퀀스가 매우 길어지는 문제가 생깁니다. 즉, 입력 길이가 늘어나 모델 계산량이 커지고 훈련 및 추론 비용이 올라갑니다. 또한, 바이트 단위는 문자 의미와 무관하게 분리되므로 모델이 의미를 학습하기 어렵습니다. 예를 들어, 한글이나 일본어, 중국어처럼 멀티바이트 문자 하나가 여러 바이트로 구성되어 있을 때, 모델은 바이트단위 조합만 보고 그 의미를 직접 유추해야 합니다. (비효율적임) 게다가 바이트 시퀀스는 사람이 보기엔 거의 해독 불가능하다는 단점도 있습니다.


문자단위 분할

문자 단위 분할도 간단한 규칙으로 가능하지만, 그만큼 어휘 크기가 급격히 커집니다. 모든 유니코드 문자를 어휘를 포함한다면 약 15만개의 토큰이 필요합니다. 물론 실무에서는 자주 쓰이지 않는 문자를 제외해 어휘 크기를 줄이긴 하지만, 여전히 바이트보다 훨씬 큽니다.


문자 단위는 바이트 단위보다 사람이 보다 쉬운 수준의 해석 가능성을 갖지만, 여전히 자연어의 문법적 및 의미적 구조를 반영하지 못합니다.

예를 들어, "일반"이라는 단어는 독립된 의미를 가지지만, 문자 단위로 "일"과 "반"으로 나누면 모델은 이 두 문자가 함께 등장했을 때 특별한 의미를 갖는다는 사실을 처음부터 다시 학습해야 합니다.


단어 단위 분할

단위 단위는 사람의 언어감각과 가장 잘 맞아 떨어집니다. 의미단위가 뚜렷하고, 분할 후 토큰 시퀀스도 짧아 모델이 처리하기 쉽습니다. 하지만 언어별 처리 차이(language dependency)가 큽니다.


영어처럼 단어 사이가 공백으로 구분되는 언어는 비교적 단순히 분할 가능합니다. (아포스트로피와 같은 특수 처리만 추가하면 충분합니다)

반면 한국어나 일본어처럼 단어 경계가 불분명한 언어는 형태소 분석기를 이용한 분리작업(분절)이 필요합니다. 이는 단순한 규칙으로 처리하기 어렵고, 별도의 모델이 필요합니다.


또한 단어 단위 분할은 모든 단어를 어휘에 포함하기 어렵습니다. 신조어나 드물게 쓰이는 단어, 시대에 따라 바뀌는 표현까지 모두 커버하기는 현실적으로 불가능합니다.


서브워드(subword) 단위 분할

다른 방법들의 장단점을 절충한 방식이 서브워드 분할입니다.

서브워드 분할은,

언어 비의존적이며 단순한 알고리즘으로 구성할 수 있고,

자연어의 의미단위를 어느 정도 반영하며,

토큰 시퀀스 길이도 자나치게 길지 않습니다.

그래서 실제로 가낭 널리 쓰입니다.


대표적인 서브워드 알고리즘에는 BPE(Byte Pair Encoding), Unigram Language Model등이 있습니다.


서브워드의 유용성을 더 깊이 이해하기 위해, 다음 논문에서 제시된 기계번역 적용 사례를 살펴봅시다.

Neural Machine Translation of Rare Words with Subword Units (2025/08/31)

논문에서 핵심적으로 제시한 가설은 다음과 같습니다.

Our hypothesis is that a segmentation of rare words into appropriate subword units is sufficient to allow for the neural translation network to learn transparent translations, and to generalize this knowledge to translate and produce unseen words.
(우리의 가설은, 희귀 단어(드물게 등장하는 단어)를 적절한 서브워드 단위로 분할함으로써, 신경망 기반 기계번역 모델이 단어의 구성과 의미 대응 관계를 명확히 학습하고, 이를 일반화하여 보지 못한 단어도 번역하고 생성할 수 있다는 것이다.)

'희귀단어'란 등장 빈도가 낮은 단어를 뜻하며, 이런 단어들은 학습 데이터에서 자주 보이지 않기 때문에, 일반화가 어렵고 모델 성능이 급격히 저하되는 문제가 있었습니다.

과거에는 단어가 어휘에 없는 경우,

무시하거나,

번역 원문을 그대로 복사하는 등 보완적 처리를 했습니다.

하지만 서브워드 분할은 어휘에 존재하지 않는 단어가 등장하더라도 이미 알고 있는 하위단위(서브워드)로 분해해서 처리할 수 있게 합니다.

논문에서 든 예시는 독일어 단어 Abwasserbehandlungsanlage로 이는 폐수처리시설을 의미합니다. 이 단어는,

Abwasser → 폐수

Behandlungs → 처리

Anlage → 시설

로 구성된 복합어입니다.


서브워드 분할을 적용하면 이처럼 구성요소 단위로 나누어 의미 대응 관계가 명확한 번역을 학습할 수 있습니다. 결과적으로 희귀 단어 처리 능력이 향상됩니다. 물론 모든 경우에 이런 명확한 분할이 가능한 것은 아니지만, 논문에서는 조금 과하게 분할하더라도 성능이 떨어지지 않고 모델이 충분히 견고(robust)하게 작동한다고 보고했습니다.


또한, 논문에서는 서브워드 단위로 쓸 수 있는 예시로 형태소(morpheme), 음소(phoneme)등 복합어, 고유명사, 외래어와 같은 낮은 빈도의 단어들을 주요대상으로 설정했습니다. 이러한 단어들이 실제로 희귀 단어의 대부분을 차지함을 확인했습니다. 이 아이디어를 기반으로 서브워드 분할을 적용한 기계번역 모델을 구축해 실험한 결과, 기존보다 더 높은 성능을 달성했습니다.


이후 서브워드 분할은 자연어 처리 전반에 걸쳐 폭넓게 채택되었고, 사용 편의성과 성능의 균형 덕분에 2025년 4월 기준으로 생성형 AI에서 텍스트 토크나이징의 사실상 표준(de facto standard)이 되었습니다.


연습문제6: 서브워드 분할은 일반적으로 긴 단어를 더 작은 구성요소로 나눌 수 있을 때 효과적입니다. 그러나 한국어 서브워드 분할이 잘 작동하지 않는 경우의 예를 들어봅시다.

(예: "사랑스럽다" → "사랑/스럽/다"처럼 형태소가 불명확하게 분리되는 경우 등)



©2024-2025 MDRULES.dev, Hand-crafted & made with Jaewoo Kim.


AI 에이전트 개발, 컨텍스트 엔지니어링 교육 컨설팅, 바이브코딩 강의 문의: https://bit.ly/4kjk5OB


keyword