반응형

SentencePiece는 텍스트를 언어학적으로 이해해서 의미를 파악하는 것이 아닙니다. 대신, 어떤 언어든 상관없이 적용할 수 있는 매우 영리한 통계적 방법으로 텍스트를 '부품(subword)'으로 분해하여, 진짜 의미를 파악할 AI 모델이 이해하기 좋은 형태로 바꿔주는 역할을 합니다.

핵심 아이디어는 "공백(띄어쓰기)도 하나의 일반 글자로 취급하자" 입니다.


## SentencePiece의 작동 방식

기존 BPE나 WordPiece는 먼저 띄어쓰기로 단어를 나눈 뒤, 그 단어 안에서 서브워드를 학습했습니다. 이 방식은 한국어나 영어에서는 잘 통하지만, 띄어쓰기가 없는 일본어나 중국어에는 적용하기 어렵습니다.

SentencePiece는 이 문제를 해결하기 위해 다음과 같은 과정을 거칩니다.

1. 모든 것을 '날 것(Raw Text)'으로 취급

SentencePiece는 입력된 문장을 사전 처리 없이 그냥 하나의 긴 글자 시퀀스로 봅니다. 그리고 공백(space)을 ' ' (언더바)라는 특수 문자로 치환합니다.

  • 입력: 학생이 책을 읽었다
  • 변환: _학생이_책을_읽었다

이제 띄어쓰기는 사라지고, 단어의 시작을 알리는 _ 기호가 포함된 글자들의 나열이 되었습니다.


2. 공백 포함, 통계 기반으로 학습

이제 _학생이_책을_읽었다 라는 글자 덩어리에 BPE나 Unigram Language Model 같은 알고리즘을 적용합니다.

알고리즘은 데이터에서 가장 빈번하게 등장하거나, 확률적으로 가장 자연스러운 글자 쌍을 찾아 합치는 과정을 반복합니다. 이 과정에서 _ 기호도 다른 글자와 똑같이 취급되어 병합에 참여합니다.

  • (학, 생) → 학생
  • (읽, 었) → 읽었
  • (_책, 을) → _책을
  • (_학생, 이) → _학생이

이런 과정을 수없이 반복하면, 최종적으로 어휘집(Lexicon)에는 다음과 같은 다양한 종류의 토큰들이 저장됩니다.

  • 기본 글자: _, 학, 생, 이, 책, 을, ...
  • 의미 단위(형태소): 이, 을, 었, 는, 다
  • 공백이 포함된 단어/서브워드: _책, _학생, _읽었다, _대한민국

## 의미 파악의 진짜 주체

이렇게 만들어진 어휘집을 사용해 책을 읽는 학생이라는 새로운 문장을 토큰화하면, 다음과 같이 분해됩니다.

[' 책', '을', ' 읽', '는', ' 학생']

이 토큰들은 각각 고유한 숫자 ID로 변환되어 [312, 18, 540, 19, 481] 와 같은 형태로 AI 모델(BERT, GPT 등)에 전달됩니다.

결론적으로, 의미 파악은 SentencePiece가 하는 것이 아닙니다.

  • SentencePiece: 텍스트를 통계적으로 가장 효율적인 부품(토큰)으로 분해하는 **'재료 손질 전문가'**입니다.
  • AI 모델 (BERT, GPT): 손질된 재료(토큰 시-퀀스)를 수없이 많이 보고 학습하면서, ' 책'이라는 토큰 뒤에 '을'이라는 토큰이 오면 목적어일 확률이 높다는 식의 **문맥적 관계와 패턴을 익혀 진짜 '의미'를 파악하는 '메인 셰프'**입니다.

서브워드 토크나이저의 핵심 특징 세 가지를 누구나 이해할 수 있도록 쉽게 풀어서 설명해 드릴게요.

## 1. "서브워드 (통계 단위)" 란? 🤖

한마디로, 사람의 문법 지식이 아닌, 컴퓨터가 데이터만 보고 통계적으로 찾아낸 효율적인 글자 묶음이라는 뜻입니다.

  • 언어학적 단위 (형태소): 사람이 문법 규칙에 따라 의미를 기준으로 나눈 것입니다.
    • 🔬 예시: 학생이학생(명사) + (조사)
    • 사람이 "의미를 가진 가장 작은 단위"라는 기준을 세우고 나눈 것이죠.
  • 통계 단위 (서브워드): 컴퓨터가 수많은 텍스트 데이터에서 가장 자주 함께 등장하는 글자들을 통계적으로 계산해서 하나로 묶은 것입니다.
    • 🤖 예시: 학생이_학생 +
    • 컴퓨터는 '학생'이 명사인지 모릅니다. 단지 데이터 속에서 _ 다음에 학생이라는 글자 뭉치가, 그리고 그 뒤에 라는 글자가 오는 패턴이 수없이 많이 반복되는 것을 보고 "아, 이렇게 묶는 게 가장 효율적이겠구나"라고 판단한 결과입니다.

## 2. 왜 "속도가 빠름" 인가요? 🚀

복잡한 문법 분석 과정이 없기 때문입니다.

  • 형태소 분석기 (느림): '먹었다'라는 단어를 보면, "이게 '먹다'라는 동사의 과거형이 맞나?", "사전에 있는 단어인가?" 등 복잡한 문법 규칙과 사전을 일일이 대조하며 분석합니다. 마치 형사가 증거를 하나하나 따져보는 것과 같습니다.
  • 서브워드 토크나이저 (빠름): 학습 단계에서 이미 모든 계산을 끝내고 "병합 규칙"이라는 간단한 레시피 북을 만들어 둡니다. 토큰화할 때는 이 레시피 북에 따라 기계적으로 단어를 쪼개기만 하면 됩니다. 생각할 필요 없이 레시피대로 재료를 자르기만 하는 것과 같아서 속도가 매우 빠릅니다.

## 3. 어떻게 "OOV 문제를 해결" 하나요? 💡

어떤 단어가 들어와도 절대 "모른다(<UNK>)"고 하지 않기 때문입니다. 최악의 경우, 글자 단위로라도 쪼개서 표현합니다.

**OOV(Out-of-Vocabulary)**는 "어휘집에 없는 단어", 즉 처음 보는 신조어나 오타 등을 처리하지 못하는 문제입니다.

  • 기존 토크나이저: "어쩔티비"라는 신조어를 만나면, 자신의 사전에 없기 때문에 "이 단어는 모르겠어"라는 의미로 <UNK> (Unknown) 토큰으로 처리합니다. 이렇게 되면 '어쩔티비'가 가진 모든 의미 정보가 사라집니다.
  • 서브워드 토크나이저: "어쩔티비"를 만나면, 일단 어휘집에서 가장 긴 조각으로 나눠보려고 시도합니다.
    • 1순위: '어쩔티비' 통째로 있는지 확인 → 없음
    • 2순위: '어쩔''티비'로 쪼갤 수 있는지 확인 → 어휘집에 있다면 ['어쩔', '티비']로 분해 성공!
    • 최악의 경우: 만약 '어쩔'도 없다면, '어', '쩔' 과 같이 더 작은 단위로 쪼갭니다. 정말 최악의 경우라도 어휘집에는 모든 기본 글자(ㅇ, ㅓ, ㅉ, ㅓ, ㄹ, ...)가 포함되어 있으므로, 글자 단위로라도 분해해서 어떻게든 표현해냅니다.

결론적으로 서브워드 토크나이저는 모르는 단어가 나와도 포기하지 않고, 자신이 가진 레고 블록(서브워드)들을 조합해 어떻게든 그 단어를 만들어내는 방식으로 OOV 문제를 원천적으로 해결합니다.

 

SentencePiece가 _를 사용해 공백을 없앤다는 것은 '사전 준비' 단계이고, 그 다음에 어떤 방식을 사용해서 나누는지가 진짜 핵심입니다.

결론부터 말하면, SentencePiece는 자체적으로 완전히 새로운 분리 방식을 만든 것이 아니라, 기존의 강력한 알고리즘들을 자신의 프레임워크 안에서 돌리는 **'엔진'**으로 사용합니다. 그 대표적인 엔진이 바로 BPEUnigram Language Model입니다.

어떤 엔진을 선택하느냐에 따라 나누는 방식이 달라집니다.


## 자동차에 비유해볼게요 🚗

  • SentencePiece: 자동차의 **차체(프레임워크)**입니다. "띄어쓰기 없는 도로에서도 달릴 수 있다"(_ 처리)는 특징을 가진 차체죠.
  • BPE / Unigram: 이 자동차에 장착할 수 있는 두 가지 종류의 엔진입니다. 운전자는 둘 중 하나의 엔진을 선택해야 합니다.

이제 각 엔진이 _학생이_책을_읽었다 라는 도로를 어떻게 달리는지(나누는지) 살펴보겠습니다.


## 엔진 1: BPE (Byte Pair Encoding) 방식

BPE 엔진은 "가장 많이 나오는 짝꿍부터 합치자" 라는 단순하고 강력한 원리로 작동합니다.

  1. 초기 상태: 모든 것을 글자 단위로 봅니다. _, 학, 생, 이, _, 책, 을, _, 읽, 었, 다
  2. 짝꿍 찾기: 데이터에서 가장 자주 함께 나오는 글자 쌍을 찾습니다. 예를 들어 (학, 생) 이라는 쌍이 아주 많이 나온다면, 이 둘을 합쳐 학생이라는 새로운 부품(토큰)을 만듭니다.
  3. 계속 합치기: 이 과정을 계속 반복합니다.
    • (_, 책) 이라는 쌍이 자주 나오면 _책 이라는 부품을 만듭니다.
    • (_책, 을) 이라는 쌍이 자주 나오면 _책을 이라는 부품을 만듭니다.
    • (_, 학생) 이 자주 나오면 _학생 을, (읽, 었) 이 자주 나오면 읽었 을 만듭니다.
  4. 최종 결과: 이 과정을 정해진 횟수만큼 반복하면, 최종적으로 어휘집(Lexicon)에는 _학생, 이, _책을, _읽었, 다 와 같이 통계적으로 가장 자주 뭉쳐 다녔던 덩어리들이 저장됩니다.

BPE 방식의 특징: 한번 규칙이 정해지면 언제나 똑같은 결과로 나눕니다. **결정론적(Deterministic)**입니다.


## 엔진 2: Unigram Language Model 방식

Unigram 엔진은 BPE와는 정반대로, 훨씬 더 세련된 방식으로 작동합니다. "어떻게 나눠야 가장 자연스러울까?" 를 확률적으로 계산합니다.

  1. 초기 상태: 일단 가능한 모든 서브워드로 구성된 아주 큰 어휘집으로 시작합니다.
  2. 최적의 조합 찾기: _학생이_책을_읽었다 라는 문장을 받았을 때, 이 문장을 만들 수 있는 모든 토큰 조합의 확률을 계산합니다.
    • 조합 1: _학생이, _책을, _읽었다 → 이 조합이 나타날 확률은?
    • 조합 2: _학생, 이, _책, 을, _읽, 었다 → 이 조합이 나타날 확률은?
    • 조합 3: _, 학, 생, 이, _책을, _읽었다 → 이 조합이 나타날 확률은?
  3. 확률이 가장 높은 조합 선택: 수많은 조합 중에서, 전체 문장이 될 확률(Likelihood)을 가장 높이는 조합을 최종 분리 결과로 선택합니다.
  4. 어휘집 최적화: 학습 과정에서는, 전체 확률 손실을 줄이는 방향으로 어휘집에서 불필요한 토큰을 제거해 나가며 최종 어휘집을 만듭니다. (BPE가 더하는 방식이라면, Unigram은 빼는 방식입니다.)

Unigram 방식의 특징: 같은 단어라도 문맥에 따라 여러 가지 방식으로 나뉠 수 있습니다. 예를 들어, unhappy는 un, happy로 나뉠 수도 있고 u, nhappy로 나뉠 수도 있는데, 그중 가장 확률이 높은 것을 선택합니다. **확률적(Probabilistic)**입니다.


## 최종 요약

구분 BPE 엔진 Unigram 엔진
접근 방식 🧱 Bottom-up: 작은 글자에서 시작해 더해나감 🎲 Top-down: 큰 어휘집에서 시작해 빼나가며 최적화
분리 기준 빈도수: 가장 자주 나오는 쌍 확률: 가장 자연스러운 조합
결과 항상 동일한 결과 (Deterministic) 여러 후보 중 가장 확률 높은 결과 (Probabilistic)

wordpiec랑 unigram하고는 다릅니다.

둘 다 서브워드를 만든다는 목표는 같지만, **'어떻게 최적의 서브워드 조합을 찾을 것인가'**에 대한 철학과 접근법이 완전히 다릅니다.

간단히 비유하자면, WordPiece는 최고의 **'부품(토큰)'**을 만들어나가는 방식이고, Unigram은 최고의 **'완성품(문장 분할)'**을 만들기 위해 부품을 최적화하는 방식입니다.


## WordPiece: 최고의 부품을 만드는 '레고 빌더' 🧱

WordPiece는 "어떤 두 부품을 합쳐야 가장 그럴듯한 새 부품이 될까?" 에 집중합니다.

  • 접근 방식 (Bottom-up): 가장 작은 글자 단위에서 시작해서, 합쳤을 때 언어 모델의 확률(Likelihood)을 가장 많이 높여주는 쌍을 찾아 더해나갑니다(greedy merge).
  • 핵심 질문: "수많은 글자 쌍 중에서, 지금 당장 어떤 쌍을 합치는 것이 최선인가?"
  • 결과: 이 과정이 끝나면 하나의 단어는 항상 똑같은 방식으로만 쪼개집니다. **결정론적(Deterministic)**입니다.
    • unhappy → un + ##happy (결과가 항상 고정됨)

## Unigram: 최고의 완성품을 조각하는 '조각가' 🗿

Unigram은 "이 문장을 쪼개는 여러 방법 중, 전체적으로 가장 자연스러운 방법은 무엇일까?" 에 집중합니다.

  • 접근 방식 (Top-down): 일단 아주 큰 어휘집으로 시작합니다. 그 다음, 특정 토큰을 어휘집에서 제거했을 때 전체 문장들의 확률(Likelihood) 손실이 가장 적은 토큰부터 없애나갑니다. 최종적으로 최적의 어휘집을 남깁니다.
  • 핵심 질문: "주어진 문장을 통째로 봤을 때, 가장 확률 높은 토큰 조합은 무엇인가?"
  • 결과: 하나의 단어에 대해 여러 가지 분할 후보가 나올 수 있고, 각 후보는 확률값을 가집니다. **확률적(Probabilistic)**입니다.
    • unhappy → un + happy (확률 0.9), u + nhappy (확률 0.1)
    • 이 특징은 모델 학습 시 매번 다른 방식으로 토큰화를 적용해 **데이터를 증강(augmentation)**하고 모델을 더 강건하게 만드는 데 사용될 수 있습니다.

## 최종 비교 요약

구분 WordPiece (BERT에서 사용) Unigram (SentencePiece의 한 옵션)
접근 방식 Bottom-up (더하기): 글자에서 시작해 합쳐나감 Top-down (빼기): 큰 어휘집에서 시작해 제거해나감
결정 기준 가장 확률 증가량이 큰 쌍을 병합 문장 전체의 확률을 최대화하는 분할 방법
토큰화 결과 결정론적 (항상 1가지 결과) 확률적 (여러 결과와 확률값 도출 가능)
반응형

+ Recent posts