한국어 형태소 분석 vs BPE

반응형

한국어를 뉴럴 네트워크로 학습시킬 때는 몇 가지 어려움이 존재합니다. 대표적인 예가 조사입니다. 한국어에는 ‘가’, ‘는’, ‘이’와 같은 조사가 존재하며, 이들은 명사와 결합하면서 문장에서의 역할이나 의미를 바꿀 수 있습니다. 예를 들어 같은 명사라도 어떤 조사가 붙느냐에 따라 주어가 되기도 하고, 목적어나 비교 대상처럼 해석될 수도 있습니다. 따라서 단순히 공백 기준으로 문장을 나누면 단어의 의미나 문법적 역할을 정확하게 파악하기 어렵습니다. 이러한 문제를 해결하기 위해 형태소 분석을 사용할 수 있습니다. 형태소 분석을 통해 명사와 조사를 분리하면, 모델이 단어 자체의 의미와 문장 내 역할을 더 명확하게 학습할 수 있습니다.

하지만, ChatGPT와 같은 현대적인 LLM은 형태소 분석을 사용하지 않습니다. 대신, BPE(Byte Pair Encoding) 기반의 토크나이징 방식을 사용합니다. 한국어에는 조사와 어미가 존재하기 때문에 과거에는 형태소 분석이 중요하게 여겨졌습니다. 그렇다면 현대의 LLM은 왜 형태소 분석 없이도 한국어를 이해할 수 있는 것일까요?

형태소 분석은 왜 해야 하는가? 

일단 한국어 문장을 신경에 넣으려면 잘게 쪼개야 합니다. 그럼 어떻게 쪼갤 수 있을까요?
방법은 크게 3가지입니다.

글자 단위로 쪼개는 방법, 공백 단위로 쪼개는 방법, 형태소 단위로 쪼개는 방법이 있습니다.
다음과 같은 문장이 있다고 가정해봅시다.

오늘 날씨가 화창합니다.

먼저 글자 단위로 쪼개는 방법에 대해 알아봅시다.

위 문장을 글자 단위로 쪼개면 다음과 같습니다.

오,늘,날,씨,가,화,창,합,니,다,

즉, 글자 하나 하나가 토큰이라고 할 수 있습니다. 이것을 뉴럴 네트워크에 접목을 시켜보겠습니다.

'오'라는 토큰만으로는 다음 글자를 예측하기 어렵습니다. 실제로 '오'로 시작하는 단어는 111개나 존재하기 때문에 어떤 글자가 뒤에 올지 판단할 수 없습니다. 또한 '오'만 보고는 사용자가 어떤 단어를 의도했는지 추론하는 것도 사실상 불가능합니다. 즉, 정보가 너무 부족하여 정확한 예측이 어려워지는 문제가 발생합니다.

그 다음은 공백 단위로 쪼개는 방법입니다.

위 방법이 글자 단위로 문장을 분리했다면, 이번에는 공백 단위로 분리하는 방법입니다. 여담으로 현대 LLM에서 사용하는 BPE도 이러한 아이디어에서 출발하여 발전한 방식입니다. (BPE에 대해서는 추후 자세히 설명하겠습니다.)

오늘, 날씨가, 화창합니다

얼핏 보기에는 큰 문제가 없어 보입니다. 하지만 토큰으로 분리된 단어를 살펴보면 문제가 발생합니다.
'오늘', '화창합니다'는 큰 문제가 없지만, '날씨가'라는 단어는 다릅니다.

실제로 우리가 생각하는 단어는 '날씨'이지만, 신경망은 '날씨가', '날씨는', '날씨도'를 모두 서로 다른 단어로 인식합니다. 즉, 하나의 명사에 조사와 어미가 결합하면서 수많은 변형이 생성되고, 이러한 변형들이 모두 별개의 어휘로 취급됩니다.

결과적으로 어휘 수가 급격하게 증가하게 되며, 이를 어휘 폭발(Vocabulary Explosion) 문제라고 합니다.

이를 해결 하기 위해 형태소 단위로 쪼개게 되었습니다.

형태소 단위로 쪼개면 어떤 장점이 있을까요?

오늘,날씨,가,화창,하,ㅂ니다

이렇게 분리하면 장점이 '날씨가'와 '날씨는' '날씨를' 등등 의미를 해치지 않고 토큰으로 구별할 수 있는 장점을 가지고 있습니다.

이렇게 분리하면 '날씨가', '날씨는', '날씨를'과 같은 단어들을 각각 별개의 단어로 학습할 필요가 없습니다. 공통된 의미를 가진 '날씨'는 그대로 유지하고, 조사만 별도로 구분하여 학습할 수 있기 때문입니다.

즉, 의미를 훼손하지 않으면서도 어휘 수를 줄일 수 있으며, 다양한 단어 변형에 보다 효율적으로 대응할 수 있다는 장점이 있습니다.

그렇다면, 어째서 현대 LLM은 형태소 분석을 하지 않을까요?

가장 큰 이유는 언어마다 가진 특성이 너무 다르기 때문입니다. 영어는 공백 단위로 분리해도 큰 문제가 없지만, 한국어는 조사와 어미 때문에 형태소 분석이 필요합니다.

하지만 이것은 한국어만의 문제가 아닙니다. 중국어나 태국어와 같은 언어는 한국어보다 상황이 더 복잡합니다. 이들 언어는 띄어쓰기가 없거나 형태소 경계가 명확하지 않아 형태소 분석 자체가 매우 어렵습니다. 경우에 따라서는 언어학자들 사이에서도 분리 기준이 달라질 수 있습니다.

예를 들어 다음과 같은 중국어 문장이 있다고 해봅시다.

我喜欢学习人工智能
(나는 인공지능 공부를 좋아한다.)

중국어는 띄어쓰기가 없기 때문에 다음과 같이 먼저 분절해야 합니다.

我 / 喜欢 / 学习 / 人工智能

태국어도 비슷합니다.

ฉันชอบเรียนปัญญาประดิษฐ์ -> ฉัน / ชอบ / เรียน / ปัญญาประดิษฐ์
(나는 인공지능 배우는 것을 좋아한다.)

즉, BPE가 없던 시절에는 언어마다 전용 전처리기를 만드는 방식이 일반적이었습니다.

문제는 이런 방식이 언어마다 구현해야 해서 유지보수 비용이 컸습니다.
또한 다국어 모델을 만들기가 어려웠으며 신조어 오타 새로운 단어 대응에 약하다는 단점이 있었습니다.

그래서 현대 LLM은 "언어학자가 규칙을 만들어주는 방식" 대신 "문자열 패턴을 모델이 스스로 학습하는 방식"을 선택했고, 그 결과가 BPE, WordPiece, SentencePiece 같은 서브워드 토크나이저입니다. 그래서 LLM 이전 시대의 NLP는 언어학(Language-driven) 에 가까웠고, 현대 LLM은 데이터 중심(Data-driven) 에 가깝다고 볼 수 있습니다.

그렇다면 BPE는 이러한 문제를 어떻게 해결할 수 있을까요?

 

13-01 바이트 페어 인코딩(Byte Pair Encoding, BPE)

기계에게 아무리 많은 단어를 학습시켜도 세상의 모든 단어를 알려줄 수는 없는 노릇입니다. 만약 기계가 모르는 단어가 등장하면 그 단어를 단어 집합에 없는 단어란 의미에서 해당 토…

wikidocs.net

형태소 분석은 한국어의 조사와 어미를 효과적으로 분리할 수 있지만, 언어마다 다른 분석기가 필요하다는 한계가 있습니다. 또한 신조어나 외래어, 잘 알려지지 않은 언어를 처리하는 데도 어려움이 존재합니다.

이러한 문제를 해결하기 위해 현대의 LLM은 BPE(Byte Pair Encoding)라는 방식을 사용합니다.

BPE의 핵심 아이디어는 매우 단순합니다.
"문법은 모르겠고, 자주 같이 등장하는 문자열은 하나로 합치자."
즉, 사전이나 문법 규칙을 사용하지 않고 오직 통계만을 이용하여 토큰을 생성합니다.

BPE의 동작 원리

BPE는 다음과 같은 과정을 반복합니다.

  1. 모든 단어를 글자 단위로 분리한다.
  2. 데이터에서 가장 자주 등장하는 글자 쌍을 찾는다.
  3. 해당 글자 쌍을 하나의 토큰으로 합친다.
  4. 원하는 어휘 크기가 될 때까지 반복한다.

예를 들어 다음과 같은 데이터가 있다고 가정해보겠습니다.

강아지가
강아지를
강아지는

초기 상태에서는 모두 글자 단위로 분리됩니다.

강 아 지 가
강 아 지 를
강 아 지 는

이후 가장 자주 등장하는 문자열 쌍을 반복적으로 병합합니다.

강아지 + 가
강아지 + 를
강아지 + 는

이 과정을 반복하면 다음과 같은 결과를 얻을 수 있습니다.

강아지가 → [강아지, 가]
강아지를 → [강아지, 를]
강아지는 → [강아지, 는]

흥미로운 점은 형태소 분석기를 사용하지 않았음에도 형태소 분석과 유사한 결과를 얻을 수 있다는 것입니다.

다만, BPE는 자주 등장하는 문자열을 기준으로 토큰을 생성하기 때문에 항상 의미 있는 패턴을 찾는다고 보장할 수는 없습니다.

하지만 이러한 문제는 GPT와 같은 대규모 LLM 환경에서는 크게 발생하지 않습니다. 방대한 데이터가 존재하기 때문에 재사용 가능한 단어와 패턴을 자연스럽게 학습할 수 있기 때문입니다.

반대로 데이터셋이 매우 작은 경우에는 문제가 될 수 있습니다.

예를 들어 학습 데이터에 "아버지가방에들어가신다" 라는 문장만 반복적으로 존재한다고 가정해보겠습니다. 이 경우 BPE는 해당 문자열을 매우 자주 등장하는 패턴으로 인식하여, 결국 문장 전체를 하나의 토큰으로 학습할 수 있습니다.

이렇게 되면 '아버지', '방', '들어가신다' 와 같은 재사용 가능한 패턴을 학습하지 못하게 되고, 새로운 문장에 대한 일반화 성능이 떨어질 수 있습니다. 즉, BPE는 충분히 크고 다양한 데이터셋이 주어질 때 가장 효과적으로 동작합니다.

이제 본견적으로 BPE로 학습을 진행해보겠습니다.

위키를 데이터를 통해 학습을 진행시켜보겠습니다.
테스트 결과 학습은 약 38.2초 만에 완료되었습니다. 이전에 수행했던 형태소 분석 방식이 약 36분이 소요되었던 것과 비교하면 약 56배 빠른 결과입니다.

그렇다면 어떻게 이러한 속도를 보여줄 수 있을까요?

이유는 단순합니다. BPE는 형태소 분석처럼 품사나 조사, 어미를 판별하지 않습니다. 단순히 데이터에서 자주 등장하는 문자열 패턴을 찾아 병합하는 과정을 반복할 뿐입니다.

즉, 언어학적 규칙을 해석하는 과정이 없기 때문에 형태소 분석보다 훨씬 빠르게 학습을 수행할 수 있습니다.
다만, 그렇다고 해서 BPE가 형태소 분석보다 우수하지는 않습니다.

제가 구현한 BPE는 한국어 데이터만을 학습한 상태이기 때문에, 영어 문장을 입력할 경우 토큰 수가 더 많이 증가하는 경향을 보였습니다. 이는 영어 단어가 충분히 병합되지 않아 작은 단위로 분리되기 때문입니다.

물론 GPT와 같은 상용 LLM은 영어를 포함한 다양한 언어를 함께 학습하기 때문에 이러한 문제가 크게 발생하지 않습니다. 따라서 해당 결과는 한국어 데이터만으로 학습한 BPE의 한계로 보는 것이 적절합니다.

영어뿐만 아니라 일부 문장에서는 형태소 분석 방식이 BPE보다 더 적은 토큰을 사용하는 경우도 확인할 수 있었습니다.

사실 이러한 결과는 어떤 데이터를 학습했는지에 따라 크게 달라질 수 있습니다. 특정 단어나 표현이 학습 데이터에 자주 등장했다면 BPE가 더 효율적일 수 있고, 반대로 그렇지 않다면 형태소 분석 방식이 더 적은 토큰을 사용할 수도 있습니다.

즉, 토큰 수는 단순히 알고리즘의 우열보다는 학습 데이터의 특성과 분포에 더 큰 영향을 받는다고 볼 수 있습니다.

그렇다면 학습을 계속 시킨다면 어떤 효과가 나타날까요?

실험 결과를 종합해보면, 어휘 크기 16K~32K 구간이 가장 균형 잡힌 선택으로 보였습니다.

이 구간에서는 토큰 효율이 충분히 높았으며(문장당 약 24~28개), 학습 시간도 약 40초 내외로 빠르게 유지되었습니다. 또한 어휘 수가 지나치게 크지 않아 모델 크기와 메모리 사용량 측면에서도 부담이 적었습니다.

반면 64K 이상의 어휘를 사용할 경우 토큰 효율은 일부 개선되지만, 그에 비해 메모리 사용량과 학습 비용이 증가하는 경향을 보였습니다. 한국어만을 대상으로 하는 모델이라면 64K 이상의 어휘는 다소 과한 선택일 수 있습니다.

참고로 GPT-2는 약 50K 규모의 어휘를 사용하였으며, GPT-4와 같은 최신 다국어 모델은 100K 이상의 어휘를 사용합니다. 반면, 이번 실험에서 구축한 형태소 기반 어휘는 약 16K 규모로, 한국어를 처리하는 데에는 충분히 실용적인 수준이라고 판단됩니다.

마무리

저번 글에서는 형태소 분석을 이용하여 뉴럴 네트워크를 학습시켜보았습니다. 그리고 이번에는 형태소 분석 대신 BPE를 적용하여 동일한 실험을 진행해보았습니다.

가장 인상적이었던 부분은 학습 속도였습니다. 형태소 분석 방식은 30분 이상이 소요되었던 반면, BPE는 약 30초 만에 학습을 완료할 수 있었습니다. 물론 토큰 구성 방식과 특성에는 차이가 존재하지만, 언어학적 규칙을 고려하지 않고 순수 통계 기반으로 동작한다는 점에서 상당한 속도상의 이점을 확인할 수 있었습니다.

또한 BPE가 단순히 토큰을 분리하는 기술이 아니라, 현대 LLM이 다양한 언어와 신조어를 처리할 수 있도록 만들어주는 핵심 기술 중 하나라는 점도 확인할 수 있었습니다.

다음 글에서는 임베딩 연산에 대해 살펴보겠습니다. 흔히 임베딩은 단순히 단어를 숫자로 변환한 벡터라고 생각하기 쉽습니다. 하지만 실제로는 벡터 간 덧셈과 뺄셈을 통해 의미적인 관계를 표현할 수 있습니다. 다음 글에서는 형태소 분석과 BPE로 생성된 토큰을 바탕으로, 임베딩이 어떻게 의미를 학습하고 연산하는지 알아보겠습니다.

반응형

'개발 > LLM' 카테고리의 다른 글

뉴럴 네트워크  (1) 2026.05.25
N-gram을 이용해서 새로운 데이터 만들기  (0) 2026.05.17
N-gram 이해해보기  (0) 2026.05.14
LLM이란 무엇일까?  (1) 2026.04.01

댓글

Designed by JB FACTORY