나만의 한국어 AI 모델 만들기 #1 – SentencePiece와 GPT-2 토크나이저

오늘은 나만의 한국어 AI 모델 만들기의 첫 번째 이야기로 자연어 처리의 기본이 되는 토크나이저(tokenizer)에 대해 이야기해 보겠습니다. 영어를 기본으로 다루는 BPE와 보다 더 다양한 언어에 적합한 sentenepiece에 대해 정리해 보려 합니다.

한국어 AI 모델 만들기
한국어 AI 모델 만들기

나만의 한국어 AI 모델 만들기 #1

요즘 정부 주도로 인공지능 기술 확보에 주력하는 모양이에요. 늦어지만 너무나도 반가운 일입니다. 작년이었나요, SKT에서 perplexity와 제휴하면서 인공지능 서비스 분야로 간다고 했던가요. 원천 기술 확보보다는 응용 서비스로 이익을 취하는 것에 목표를 둔듯한 발언이었죠. ‘뭘 몰라도 한참 모르는 자들이 결정권을 가졌구나’ 생각됐었죠. 다행히 제 정신 있는 사람들이 정부에는 있는 듯 해요. 정말 다시 잘 시작했으면 합니다.

이런 말을 왜 시작부터 하냐면, 우리에게 이제는 많이 익숙한 생성형 AI, GPT나 Gemini 같은 서비스들 말이죠. 이들의 기본 언어는 영어예요. 뭐 자연어 처리가 뭐니, LLM 모델이 뭐니까지 말할 필요도 없이, 현재 서비스되고 있는 모든 생성형 AI 모델들이 한국어 보다는 영어에 더 좋은 반응을 하고 더 깊이 있고 완성도 높은 문장을 구성한다는 것을 아실거예요. 왜? 이들은 모두 영어가 근간으로, 영어에 대한 학습 능력이 높고, 영어에 대한 이해력이 더 높기 때문이죠.

단순하게 이러한 이유만으로도 한국어 AI 모델은 필요할 거예요. 그런데, 말이죠. 이 블로그에서 이미 여러번 다룬바 있는 토큰 관련해서도 영어보다 한글이 불리하다면 어떨까요? 때문에 한글로 작성된 문장은 토큰 수가 더 많이 발생하다면, 어떤 문제가 생길까요? 네! 당연하게도 비용이 더 발생합니다. OpenAI API나 구글 Gemini나 어떤 생성형 AI 서비스에서도 토큰(Token)수에 따라 비용이 발생하기 때문에 같은 내용을 어떤 언어로 작성하느냐에 따라 비용이 더 발생할 수 있다는 거예요. 현재 영어보다 한국어가 1.5배 이상 더 토큰이 많이 발생할 수 있거든요.

그러면 우리는 모두 영어를 사용해야겠지요? 이런 사람이 있다면 얼른 국적을 바꾸는게 좋을 거예요.

한국어 AI 모델을 위한 준비 단계

현존 최고의 자연어 모델은 GPT 라고 할 수 있어요. GPT-2는 OpenAI가 개발한 트랜스포머(Transformer) 기반의 언어 모델로, 다음 단어를 예측하는 방식으로 텍스트를 생성하죠. 더구나 오픈 모델이에요. 누구나 변경할 수 있고 마음대로 다뤄볼 수 있도록 공개된 모델이죠. 물론 챗GPT나 GPT-4o 같은 최신형 모델들과는 비교할 수 없을 정도로 단순한 구조이지만 그럼에도 GPT 구조의 공개 모델이라는 것에 의미가 있어요. 무슨 의미냐? 그냥 한가지만 말해도 될 듯 하군요. 우리나라엔 한국어 AI는 물론, 이런 공개 모델이 없으니까요! 관심있는 사람들이 마음대로 다뤄볼 수 있는 공개 모델이 우리에겐 전혀 없죠. 조만간, “아직까지는”이란 단어를 꼭 붙이고 싶네요.

하여간, GPT-2의 주요 특징은 다음과 같습니다.

  • BPE(Byte Pair Encoding) 방식의 토크나이저: 입력 텍스트를 BPE 알고리즘을 사용하여 서브워드(subword) 단위로 분할합니다.
  • 영어 웹 데이터 기반 사전 학습: 모델의 어휘 집합(Vocabulary)이 영어 웹 데이터인 WebText를 기반으로 구축되었습니다.
  • 바이트 레벨(Byte-level) 처리: 띄어쓰기나 특수 기호도 바이트 단위로 처리합니다.

예를 들어, 한국어 문장 “안녕하세요”는 바이트 레벨 BPE 토크나이저를 통해 [Ġ안, 여, 화, 세, 요]와 같이 분할될 수 있습니다. 이러한 구조는 알파벳 기반 언어에는 효율적일 수 있으나, 형태소 단위로 의미가 분리되고 어순이 중요한 한국어에는 여러 한계를 가집니다. 물론 GPT-2는 한국어 훈련을 완벽히 마치고 공개된 모델은 아니에요. 대충 한글을 구분하는 정도(?)라고 해야 할거예요.

한국어 적용 시 발생하는 문제점

GPT-2를 한국어에 직접 적용할 경우 발생하는 주요 문제점은 다음과 같습니다:

  1. 토큰 수 증가 및 비효율성: 한국어 문장이 불필요하게 서브워드로 과도하게 분할되어 토큰 수가 증가합니다. 이는 모델의 연산 효율성을 저하시키고, 긴 시퀀스 처리에 제약을 줄 수 있습니다. 예를 들어, “사랑합니다”와 같은 단어도 [사, 랑, 합, 니, 다] 또는 그 이상으로 분할될 수 있습니다.
  2. 의미 단위 분리 문제: 조사, 어미, 복합어 등 한국어의 핵심 의미 단위가 올바르게 처리되지 않습니다. 이는 자연스러운 문장 생성 실패로 이어지며, 모델의 한국어 이해도를 저하시킵니다.
  3. 어순 처리 불안정: 어절 단위 분해가 아닌 바이트 레벨 분해는 한국어의 복잡한 문법 구조와 어순 인식을 방해하여, 문장 구조에 대한 모델의 이해도를 떨어뜨립니다.

때문에 GPT-2를 이용하여 한국어 AI 모델을 만들기 위해서는 토크나이저 관련 문제를 해결해야만 하죠.

SentencePiece 토크나이저 도입

한국어 AI 모델에 있어서, 위에서 언급된 문제들을 해결하기 위한 효과적인 대안 중 하나는 SentencePiece 토크나이저를 적용하는 것입니다. BPE와 SentencePiece는 모두 서브워드 토크나이징 방식을 사용한다는 공통점을 가지지만, 다음과 같은 중요한 차이가 있습니다.

  • BPE: 주로 빈도 기반으로 가장 빈번한 바이트 쌍을 병합하여 새로운 서브워드를 생성합니다. 이는 일반적으로 토크나이징 규칙을 학습하는 과정에서 이루어집니다.
  • SentencePiece: 텍스트를 공백(whitespace) 문자를 포함한 원본 문자열 그대로 학습하여 토크나이징을 수행합니다. 즉, 입력 텍스트를 전처리하지 않고 바로 학습합니다. SentencePiece는 BPE 외에도 Unigram 언어 모델(ULM) 기반의 토크나이징 알고리즘을 지원하며, 이는 주어진 문장을 여러 서브워드 분할 조합으로 만들고 그중 가장 확률적으로 높은 조합을 선택하는 방식입니다. 한국어처럼 띄어쓰기가 없어도 의미를 가지는 단어가 많은 언어(예: “한국어AI만들기”)에 특히 효과적입니다.

따라서 SentencePiece는 단순히 BPE의 문제점을 해결하기 위해 고안된 대체 기술이라기보다는, BPE와 함께 널리 사용되는 서브워드 토크나이징 기법 중 하나이며, 특히 다양한 언어에 유연하게 적용될 수 있고 또 한국어 AI 모델에 필요한 도구라고 할 수 있겠죠. 너무 좋게 말하나요? 구글이 이 글 좀 봐줬으면 좋겠네요. 하여간, SentencePiece의 Unigram 모델은 BPE보다 의미 단위를 더 잘 유지하고 중복 토큰 문제를 줄이는 데 매우 유용합니다. 또, SentencePiece와 Unigram의 조합이 한국어 AI 모델에 가장 적합한 방식인 거죠.

GPT-2에 SentencePiece 적용 방법

한국어 AI 모델을 위해, SentencePiece 토크나이저를 GPT-2 모델에 적용하는 주요 방법은 세 가지가 있습니다.

  1. 기존 Vocab 확장 (add_tokens)
    • 기존 BPE 기반 Vocab에 SentencePiece로 학습한 한국어 토큰들을 추가하는 방식입니다.
    • 모델 구조 변경이 없어 안정성이 높고 구현이 비교적 간단합니다. 하지만, 데이터셋 구성이 복잡할 수 있어요.
    • BPE 토크나이저의 근본적인 한계(예: 비효율적인 한국어 분할)는 여전히 존재할 수 있습니다.
  2. 토크나이저 완전 교체
    • 기존 GPT-2의 토크나이저를 제거하고, SentencePieceProcessor를 직접 사용하여 토큰화를 수행하도록 변경하는 방식입니다.
    • 한국어 처리 성능을 극대화할 수 있습니다. 한국어 특성을 잘 반영한 토크나이징이 가능해집니다.
    • 모델 초기화, 재학습, 토크나이저와 모델 간의 동기화 등 관리해야 할 복잡성이 증가합니다.
    • 특히 방대한 한국어 데이터셋으로 기초부터 모든 학습을 다시 다 해야 합니다.
  3. 외부 전처리 방식
    • 모델 내부의 토크나이저를 변경하지 않고, 외부에서 SentencePiece 토크나이저를 사용하여 입력 input_ids를 생성한 후 모델에 전달하는 방식입니다.
    • 가장 간단하게 테스트를 수행할 수 있으며, 기존 모델 구조에 영향을 주지 않습니다.
    • 토크나이저와 모델 사이의 일관성이 불안정할 수 있으며, 프로덕션 환경에서의 통합 관리가 복잡할 수 있습니다.

Hugging Face와 SentencePiece 지원 현황

SentencePiece는 Google에서 개발한 토크나이저 라이브러리입니다. 현재 Hugging Face transformers 라이브러리는 BertTokenizerXLMRobertaTokenizer 등 일부 모델에서 SentencePiece 기반 토크나이저를 지원하고 있습니다. 그러나 GPT-2와 같은 특정 모델의 경우, Hugging Face transformers 라이브러리에서 SentencePiece 토크나이저로의 완벽한 직접 교체 및 통합이 아직 유연하게 지원되지 않을 수 있습니다.

이는 Hugging Face의 토크나이저 구현 방식과 GPT-2의 오리지널 토크나이저(BPE) 설계에 따른 제약 때문입니다. 따라서 GPT-2에 SentencePiece를 적용하려면 위에 설명된 ‘토크나이저 완전 교체’나 ‘외부 전처리 방식’을 직접 구현하거나, Hugging Face가 공식적으로 지원하는 특정 모델(예: ALBERT, ELECTRA 등)을 참고하여 우회적인 방법을 사용해야 할 수 있습니다. Google의 모델(예: T5, mT5)들은 자체적으로 SentencePiece를 완벽하게 지원하는 경향이 있습니다.

다음 포스팅에서는 실제로 SentencePiece를 학습시키고, 방대한 한국어 코퍼스를 활용하여 GPT-2 모델을 Pretraining하는 실질적인 과정을 다뤄 볼게요.


답글 남기기