brunch

You can make anything
by writing

C.S.Lewis

by 최재철 Mar 28. 2024

LLM시대의 토큰 및 임베딩이란?

토큰과 임베딩의 중요성

ERROR : GPT4 Turbo의 컨텍스트 길이는 128K 토큰입니다.


간혹 ChatGPT 를 사용하다보면, 토큰이 넘었다는 에러메시지를 많이 보게됩니다. 

그래서, GPT 설명을 보면, 토큰이 얼마다 이렇게 나와 있는데. 


과연 토큰(token) 이란  무엇일까요?


"The cat sat on the mat" 문장을 예를 들어보겠습니다. 

["The" , "cat , "sat" , "on", "the", "mat"]


심플하게 각 배열 요소를 토큰이라고 말할 수 있습니다. 

좀 더 어렵게 접근하면, 학문적으로는 자연어 처리(NLP) 의 세계에서는 토큰을 가장 작은 분석 단위라고 정의합니다. 


그런데, 토큰이라는 것이 생각보다 간단하지 않습니다. 왜냐하면, 토큰이라고 부르는 이것이 토큰화 방법에 따라 많이 달라지기 때문입니다.  토큰화 방법이 많이 존재하기 때문입니다. 


방법이 많으면 한 방법만 쓰면 되는 게 아니냐고 반문 할 수 있는 데, 이유인즉 토큰 생성은 기본적으로 대부분의 NLP 작업을 수행하는 첫 번째 단계에 해당하는 것으로, 첫단추를 잘 끼워야 그 이후 작업의 성능에 많은 영향을 끼치기에 중요한 요소입니다. 


이제 몇가지 토큰화방법에 대해서 살펴보겠습니다. 


NLP의 토큰화 방법

문자열을 토큰화하는 몇 가지 널리 사용되는 방법을 살펴보겠습니다. 이해하기 돕기 위해 코드 샘플로 직접 해 보겠습니다.

방법1~3 까지 토큰화 방법

위의 소스는 총3개의 토큰화 방법을 살펴보았습니다.(영어기준)

1. 공백 기준으로 토큰화

2. 구두점으로 토큰화

3. Treebank 기준으로 토큰화


영어에서 가장 흔하고, 쉽게 토큰화하는 방법은 공백 기준으로 토큰화하는 방법입니다. 

위의 결과는 짧은 문장을 했고, 중간에 특이한 구두점이나 단어가 없어서 동일한 결과가 나왔습니다. 


Penn Treebank는 무엇입니까?

Penn Treebank는 자연어 처리 분야에서 널리 사용되는 말뭉치(언어 데이터베이스) 중 하나입니다. 1989년에서 1996년 사이에 펜실베니아 대학의 컴퓨터 언어학 센터에서 만들었습니다.Penn Treebank는 주로 영어 신문 기사로 구성되어 있으며 약 450만 단어를 포함합니다.이 말뭉치에는 품사 태그 지정, 구 구조 분석 및 공동 참조 분석이 포함되어 있습니다.이러한 주석은 자연어 처리 작업에서 중요한 전처리 단계로 사용됩니다.Penn Treebank는 자연어 처리 분야에서 잘 알려진 데이터 세트이며 많은 연구자들이 사용하고 있습니다. 이것은 자연어 처리 연구 및 개발의 발전에 매우 중요한 자원입니다. (출처 : 위키피디아)


토큰화가 성능에 많은 영향을 끼친다고 했는데, 구체적으로 문자열을 토큰화해야 하는 이유는 뭘까요? 

그 이유를 살펴보면 다음과 같이 정리할 수 있습니다.  

복잡한 텍스트를 관리 가능한 단위로 분해합니다. (관리의 편의성) 

분석하거나 작업을 수행하기 쉬운 형식으로 텍스트를 표시합니다. (작업의 용이성)

품사 태깅, 구문 분석, 명명된 엔터티 인식과 같은 특정 언어 작업에 유용합니다. (언어적인 특징추출)

NLP 애플리케이션에서 텍스트를 균일하게 전처리하고 구조화된 학습 데이터를 생성합니다. (데이터 구조화)


대부분의 자연어처리(NLP) 시스템은 특정 작업을 수행하기 위해 이러한 토큰에 대해 일부 작업을 수행합니다. 예를 들어, 일련의 토큰을 가져와 다음 토큰을 예측하는 시스템을 설계할 수 있습니다. 또한 텍스트 음성 변환 시스템의 일부로 토큰을 음성 표현으로 변환할 수도 있습니다. 키워드 추출, 번역 등과 같은 다른 많은 NLP 작업을 수행할 수 있습니다.


매우 간단하게 말하면 토큰화 작업이란 독립적인 단위의 텍스트 문자열을 컴퓨터가 이해할 수 있는 "숫자"로 변환하기위해서 하는 작업입니다. (벡터화)


벡터화 : 많은 NLP 작업에서 토큰은 BoW(Bag of Words), TF-IDF(Term Frequency-Inverse Document Frequency) 또는 단어 임베딩 (Word2Vec, GloVe 등)과 같은 기술을 사용하여 수치 벡터로 변환됩니다 . 이 프로세스는 텍스트 데이터를 기계 학습 모델이 이해하고 작업할 수 있는 숫자로 변환합니다.


ChatGPT 및 토큰

ChatGPT와 같은 LLM의 맥락에서 토큰은 어떤 모습입니까? LLM에 사용되는 토큰화 방법은 일반 NLP에 사용되는 토큰화 방법과는 조금 결이 다릅니다.

러프하게 말하자면, 토큰화작업은 반드시 첫번째 방법인 공백 토큰화처럼 완벽한 단어일 필요는 없습니다. 

이게 무슨말이냐면, 예를 들어서, "안녕하세요", "안녕하십니까?" 라고 해서 각 다른 단어이지만, 인간이 느끼기에 그 의미는 같듯이 토큰화를 했을 때 어미 생략하고 "안녕" 이라고 토큰을 정의할 수도 있습니다. 

이를 " 하위 단어 토큰화 " 라고 부를 수 있습니다 . 이것이 바로 한 단어가 하나의 토큰과 같지 않은 이유입니다.


GPT-4 Turbo의 컨텍스트 길이가 128K 토큰이라고 말하면 정확히 128K 단어는 아니지만 이에 가까운 숫자입니다.


LLM의 토큰화 방법

Byte-Pair-Encoding (BPE)

Meta의 LLAMA-2 및 이전 GPT 모델과 같은 많은 오픈 소스 모델은 이 방법의 버전을 사용합니다.

실제 상황에서 BPE는 일반적인 쌍을 결정하기 위해 많은 양의 텍스트를 분석합니다.

GPT-2 Tokenizer를 사용하여 간단한 예를 들어 살펴보겠습니다.


from transformers import GPT2Tokenizer 

# 토크나이저 초기화 토크
tokenizer = GPT2Tokenizer.from_pretrained( "gpt2" ) 
text = "The cat sat on the mat" 

# 텍스트를 토큰화
token_ids = tokenizer.encode(text, add_special_tokens= True ) 

# 토큰 ID 출력 
print ( "Token IDs:" , token_ids) 

# 토큰 ID를 다시 원시 토큰으로 변환하여 출력
raw_tokens = [tokenizer.decode([ token_id]) for token_id in token_ids] 
print ( "원시 토큰:" , raw_tokens)

결과 : 


결과에서 토큰 ID란 무엇입니까? 왜 숫자인가요?


이 프로세스가 어떻게 작동하는지 분석해 보겠습니다.


1. "어휘사전" 구축  

문자로 분리 : 처음에 어휘는 개별 문자로 나눕니다. 

공통 쌍 찾기 : 훈련 데이터(큰 텍스트 모음)를 스캔하여 가장 자주 발생하는 문자 쌍을 찾습니다. 예를 들어 'the'가 자주 등장하면 어휘에 추가될 후보가 됩니다.

새 토큰 병합 및 생성 : 이러한 공통 쌍은 병합되어 새 토큰을 형성합니다. 프로세스는 반복적으로 계속되며 매번 다음으로 가장 빈번한 쌍을 식별하고 병합합니다. 어휘는 개별 문자에서 공통된 쌍으로, 결국에는 공통 단어나 단어의 일부와 같은 더 큰 구조로 확장됩니다.

어휘 제한 : 어휘 크기에는 제한이 있습니다(예: GPT-2에서는 토큰 50,000개). 이 제한에 도달하면 프로세스가 중지되어 문자 공통 쌍 및 더 복잡한 토큰을 포함하는 고정 크기 어휘사전이 생성됩니다.


2. 토큰 ID 할당  

어휘 색인화 : 최종 어휘의 각 고유 토큰에는 고유한 숫자 색인 또는 ID가 할당됩니다. 이는 목록이나 배열의 인덱싱과 마찬가지로 간단하게 수행됩니다.

토큰 ID 표현 : GPT-2의 맥락에서 각 텍스트 조각(예: 단어 또는 단어의 일부)은 이 어휘에 있는 해당 토큰의 ID로 표시됩니다. 단어가 어휘에 없으면 어휘에 있는 더 작은 토큰으로 분해됩니다.

특수 토큰 : 특수 토큰(예: 텍스트 또는 알 수 없는 단어(!? 등)의 시작과 끝을 나타내는 토큰)에도 고유 ID가 할당됩니다.


핵심은 토큰 ID 할당이 임의적이지 않고 모델이 학습한 언어 데이터의 발생 빈도와 조합 패턴을 기반으로 한다는 점입니다. 이를 통해 GPT-2 및 유사한 모델은 관리 가능하고 대표적인 토큰 세트를 사용하여 인간 언어를 효율적으로 처리하고 생성할 수 있습니다.

여기서 "어휘"는 모델이 인식하고 작업할 수 있는 모든 고유 토큰을 의미합니다. 


임베딩이란 무엇입니까?

우리는 이미 이 단어를 접했습니다. 임베딩에 대해서 본격적으로 알아보면, 

토큰 ID는 토큰을 숫자로 간단하게 표현한 것입니다. 실제로 이는 벡터화의 기본 형태입니다. 

TF-IDF와 같은 표준 벡터화 기술에는 복잡한 수치 표현을 만드는 것이 포함됩니다.

임베딩은 토큰의 고급 벡터 표현 입니다 . 그들은 토큰 간의 가장 큰 뉘앙스, 연결 및 의미론적 의미를 포착하려고 노력합니다. 각 임베딩은 일반적으로 신경망에서 계산된 벡터 공간의 일련의 실수입니다.


즉, 텍스트가 토큰으로 변환됩니다. 토큰에는 토큰 ID가 할당됩니다. 이러한 토큰 ID는 보다 복작한 수치 표현을 위해서 임베딩, 곧 벡터화를 합니다. 벡터화를 하면, 다차원에서 분석이 가능하고, 벡터간의 의미를 찾을 수 있게 되기 때문입니다. 


한줄 정리 :  텍스트 -> 토큰화 -> 토큰ID할당 -> 임베딩(벡터화) -> 예측,번역,추론 등 작업에 활용


왜 토큰을 만들고, 숫자로 변환하고, 임베딩이라는 벡터화 작업을 왜 할까요? 그건 바로, 

컴퓨터는 숫자를 이해하고 작동하기 때문입니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari