NLP의 토큰화 이해: 텍스트 처리를 위한 초보자 가이드
게시 됨: 2024-11-26토큰화는 자연어 처리(NLP)의 중요하지만 종종 간과되는 구성 요소입니다. 이 가이드에서는 토큰화, 사용 사례, 장단점, 거의 모든 LLM(대형 언어 모델)과 관련된 이유에 대해 설명합니다.
목차
- NLP의 토큰화란 무엇입니까?
- 토큰화 유형
- 토큰화 작동 방식
- 토큰화 애플리케이션
- 토큰화의 이점
- 토큰화의 과제
NLP의 토큰화란 무엇입니까?
토큰화는 텍스트를 기계 학습(ML) 모델이 사용할 수 있는 숫자 형식으로 변환하는 NLP 방법입니다. Anthropic의 Claude, Google의 Gemini 또는 OpenAI의 GPT 시리즈 구성원과 같은 LLM에 메시지를 보내면 모델이 텍스트를 직접 읽지 않습니다. 이러한 모델은 숫자만 입력할 수 있으므로 먼저 토크나이저를 사용하여 텍스트를 숫자 시퀀스로 변환해야 합니다.
토크나이저가 텍스트를 토큰화할 수 있는 한 가지 방법은 텍스트를 별도의 단어로 분할하고 각 고유 단어에 숫자를 할당하는 것입니다.
"Grammarly는 문법, ML 및 글쓰기를 좋아합니다"는 다음과 같습니다.
각 단어(및 관련 숫자)는 토큰입니다. ML 모델은 일련의 토큰([7,102], [37], [564], [2], [9,763], [2], [231])을 사용하여 작업을 실행하고 출력을 생성할 수 있습니다. 이 출력은 일반적으로 동일한 토큰화 프로세스의 역순을 사용하여 텍스트로 다시 변환되는 숫자입니다. 실제로 이러한 단어별 토큰화는 좋은 예이지만 나중에 살펴보게 될 이유로 업계에서는 거의 사용되지 않습니다.
마지막으로 주목해야 할 점은 토크나이저에는 처리할 수 있는 전체 토큰 세트인 어휘가 있다는 것입니다. 기본적인 영어 단어는 알지만 회사 이름은 모르는 토크나이저는 어휘에 "Grammarly"라는 토큰이 없어 토큰화에 실패할 수 있습니다.
토큰화 유형
일반적으로 토큰화는 텍스트 덩어리를 일련의 숫자로 바꾸는 것입니다. 단어 수준에서 토큰화를 생각하는 것이 당연하지만 다른 많은 토큰화 방법이 있으며 그 중 하나인 하위 단어 토큰화가 업계 표준입니다.
단어 토큰화
단어 토큰화는 이전에 본 예로서 텍스트가 각 단어와 구두점으로 분할됩니다.
단어 토큰화의 주요 이점은 이해하고 시각화하기 쉽다는 것입니다. 그러나 몇 가지 단점이 있습니다.
- 문장 부호가 있는 경우 "글쓰기"와 마찬가지로 단어에 첨부됩니다.
- 참신하거나 흔하지 않은 단어(예: "Grammarly")는 전체 토큰을 차지합니다.
결과적으로 단어 토큰화는 수십만 개의 토큰으로 어휘를 생성할 수 있습니다. 큰 어휘의 문제는 훈련과 추론의 효율성을 훨씬 떨어뜨린다는 것입니다. 즉, 텍스트와 숫자를 변환하는 데 필요한 행렬이 엄청나야 합니다.
또한 자주 사용되지 않는 단어가 많아 NLP 모델에는 이러한 자주 사용되지 않는 단어에 대한 정확한 응답을 반환할 만큼 관련 훈련 데이터가 충분하지 않습니다. 내일 새로운 단어가 만들어지면 단어 토큰화를 사용하는 LLM을 재교육하여 이 단어를 통합해야 합니다.
하위 단어 토큰화
하위 단어 토큰화는 텍스트를 단어보다 작거나 같은 단위로 분할합니다. 각 토큰에는 고정된 크기가 없습니다. 각 토큰(및 해당 길이)은 학습 프로세스에 따라 결정됩니다. 하위 단어 토큰화는 LLM의 업계 표준입니다. 다음은 GPT-4o 토크나이저로 토큰화가 수행된 예입니다.
여기서는 흔하지 않은 단어 "Grammarly"가 "Gr", "amm" 및 "arly"의 세 가지 토큰으로 구분됩니다. 한편, 다른 단어는 자체 토큰을 형성할 만큼 텍스트에서 충분히 일반적입니다.
하위 단어 토큰화는 더 작은 어휘를 허용하므로 더 효율적이고 저렴한 교육 및 추론을 의미합니다. 하위 단어 토크나이저는 희귀하거나 새로운 단어를 더 작은 기존 토큰의 조합으로 분해할 수도 있습니다. 이러한 이유로 많은 NLP 모델에서는 하위 단어 토큰화를 사용합니다.
캐릭터 토큰화
문자 토큰화는 텍스트를 개별 문자로 분할합니다. 예제는 다음과 같습니다.
모든고유한캐릭터는 고유한 토큰이 됩니다. 알파벳은 52자(대문자와 소문자는 다르게 간주됨)와 구두점 몇 개만 있기 때문에 실제로 가장 작은 어휘가 필요합니다. 모든 영어 단어는 이러한 문자로 구성되어야 하므로 문자 토큰화는 새로운 단어나 희귀한 단어에 대해서도 작동할 수 있습니다.
그러나 표준 LLM 벤치마크에 따르면 문자 토큰화는 실제로 하위 단어 토큰화만큼 성능이 좋지 않습니다. 하위 단어 토큰 "car"에는 문자 토큰 "c"보다 훨씬 더 많은 정보가 포함되어 있으므로 변환기의 주의 메커니즘에는 더 많은 정보가 실행됩니다.
문장 토큰화
문장 토큰화는 텍스트의 각 문장을 자체 토큰으로 변환합니다. 우리의 예는 다음과 같습니다:
장점은 각 토큰에 수많은 정보가 포함되어 있다는 것입니다. 그러나 몇 가지 단점이 있습니다. 문장을 작성하기 위해 단어를 결합하는 방법은 무한합니다. 따라서 어휘도 무한해야 합니다.
또한, 작은 차이(예: "and" 대신 "as also")라도 동일한 의미를 갖고 있음에도 불구하고 다른 토큰을 의미하므로 각 문장 자체는 매우 드물게 됩니다. 훈련과 추론은 악몽이 될 것입니다. 문장 토큰화는 문장 감정 분석과 같은 특수한 사용 사례에 사용되지만 그렇지 않은 경우에는 드문 광경입니다.
토큰화 트레이드오프: 효율성 대 성능
모델에 대한 토큰화의 올바른 세분성을 선택하는 것은 실제로 효율성과 성능 간의 복잡한 관계입니다. 토큰이 매우 크면(예: 문장 수준에서) 어휘가 방대해집니다. 이러한 모든 토큰을 보유하는 매트릭스가 거대하기 때문에 모델의 훈련 효율성이 떨어집니다. 관계를 의미있게 학습하기 위한 모든 고유 토큰에 대한 훈련 데이터가 충분하지 않기 때문에 성능이 급락합니다.
반면에 작은 토큰을 사용하면 어휘가 작아집니다. 훈련은 효율적이지만 각 토큰에는 모델이 토큰-토큰 관계를 학습하는 데 충분한 정보가 포함되어 있지 않기 때문에 성능이 급락할 수 있습니다.
하위 단어 토큰화가 바로 중간에 있습니다. 각 토큰에는 모델이 관계를 학습할 수 있는 충분한 정보가 있지만 어휘가 너무 크지 않아 훈련이 비효율적입니다.
토큰화 작동 방식
토큰화는 토크나이저의 교육 및 사용을 중심으로 진행됩니다. 토크나이저는 텍스트를 토큰으로 변환하고 토큰을 다시 텍스트로 변환합니다. 가장 인기 있는 유형인 하위 단어 토크나이저에 대해 여기서 논의하겠습니다.
텍스트를 효과적으로 분할하려면 하위 단어 토크나이저를 훈련해야 합니다.
"Grammarly"가 "Gr", "amm" 및 "arly"로 분리되는 이유는 무엇입니까? "Gram", "mar" 및 "ly"도 작동할 수 없나요? 인간의 눈으로는 분명히 그럴 수 있지만 가장 효율적인 표현을 학습한 토크나이저는 다르게 생각합니다. 이 표현을 학습하는 데 사용되는 일반적인 훈련 알고리즘(GPT-4o에서는 사용되지 않음)은 BPE(바이트 쌍 인코딩)입니다. 다음 섹션에서는 BPE에 대해 설명하겠습니다.
토크나이저 훈련
좋은 토크나이저를 훈련하려면 훈련할 대규모 텍스트 모음이 필요합니다. 이 코퍼스에서 BPE를 실행하는 작업은 다음과 같습니다.
- 말뭉치의 모든 텍스트를 개별 문자로 분할합니다. 이를 어휘의 시작 토큰으로 설정합니다.
- 텍스트에서 가장 빈번하게 인접한 두 개의 토큰을 하나의 새 토큰으로 병합하고 이를 어휘에 추가합니다(이전 토큰을 삭제하지 않고 이것이 중요합니다).
- 자주 발생하는 인접한 토큰 쌍이 더 이상 남아 있지 않거나 최대 어휘 크기에 도달할 때까지 이 프로세스를 반복합니다.
예를 들어, 전체 훈련 코퍼스가 "abc abcd"라는 텍스트로 구성되어 있다고 가정합니다.
- 텍스트는 [“a”, “b”, “c”, “ ”, “a”, “b”, “c”, “d”]로 분할됩니다. 해당 목록의 네 번째 항목은 공백 문자입니다. 그러면 우리의 어휘는 [“a”, “b”, “c”, “ ”, “d”]가 됩니다.
- "a"와 "b"는 텍스트에서 서로 나란히 나타나는 경우가 가장 많습니다("b" 및 "c"와 연결되어 있지만 알파벳순으로는 "a"와 "b"가 우선함). 그래서 우리는 그것들을 하나의 토큰 “ab”로 결합합니다. 이제 어휘는 [“a”, “b”, “c”, “ ”, “d”, “ab”]처럼 보이고 업데이트된 텍스트(“ab” 토큰 병합이 적용된)는 [“ab”와 같습니다. , "c", " ", "ab", "c", "d"].
- 이제 "ab"와 "c"는 텍스트에서 가장 자주 함께 나타납니다. 이를 토큰 “abc”로 병합합니다. 그러면 어휘는 [“a”, “b”, “c”, “ ”, “d”, “ab”, “abc”]처럼 보이고 업데이트된 텍스트는 [“abc”, “ ”, “abc”처럼 보입니다. ", "디"].
- 각 인접 토큰 쌍은 이제 한 번만 발생하므로 여기서 프로세스를 종료합니다. 토큰을 추가로 병합하면 결과 모델이 다른 텍스트에서 성능이 저하됩니다. 실제로는 어휘 크기 제한이 제한 요소입니다.
새로운 어휘 세트를 사용하면 텍스트와 토큰을 매핑할 수 있습니다. "cab"과 같이 이전에 본 적이 없는 텍스트도 단일 문자 토큰을 버리지 않았기 때문에 토큰화할 수 있습니다. 어휘 내에서 토큰의 위치를 확인하여 토큰 번호를 반환할 수도 있습니다.
좋은 토크나이저 교육에는 대부분의 회사가 감당할 수 있는 것보다 더 많은 양의 데이터와 많은 컴퓨팅이 필요합니다. 기업은 자체 토크나이저 교육을 건너뛰어 이 문제를 해결합니다. 대신 사전 훈련된 토크나이저(예: 위에 링크된 GPT-4o 토크나이저)를 사용하여 모델 성능 손실을 최소화하면서 시간과 비용을 절약합니다.
토크나이저 사용
따라서 우리는 BPE를 사용하여 대규모 코퍼스에 대해 훈련된 하위 단어 토크나이저를 보유하고 있습니다. 이제 새로운 텍스트에 어떻게 사용합니까?
토크나이저 훈련 과정에서 결정한 병합 규칙을 적용합니다. 먼저 입력 텍스트를 문자로 분할합니다. 그런 다음 훈련과 동일한 순서로 토큰 병합을 수행합니다.
설명을 위해 "dc abc"라는 약간 다른 입력 텍스트를 사용하겠습니다.
- 이를 문자 [“d”, “c”, “ ”, “a”, “b”, “c”]로 나눕니다.
- 훈련에서 수행한 첫 번째 병합은 "ab"이므로 여기서는 ["d", "c", " ", "ab", "c"]로 수행합니다.
- 두 번째 병합은 "abc"이므로 ["d", "c", " ", "abc"]로 수행합니다.
- 이것이 우리가 가지고 있는 유일한 병합 규칙이므로 토큰화가 완료되고 토큰 ID를 반환할 수 있습니다.
다수의 토큰 ID가 있고 이를 텍스트로 변환하려는 경우 목록에서 각 토큰 ID를 찾아 관련 텍스트를 반환하면 됩니다. LLM은 작업하는 임베딩(주변 토큰을 보고 토큰의의미를캡처하는 숫자 벡터)을 사람이 읽을 수 있는 텍스트로 다시 변환하기 위해 이 작업을 수행합니다.
토큰화 애플리케이션
토큰화는 항상 모든 NLP의 첫 번째 단계입니다. ML 모델(및 컴퓨터)이 작동할 수 있는 형식으로 텍스트를 변환하려면 토큰화가 필요합니다.
LLM의 토큰화
토큰화는 일반적으로 모든 LLM 호출의 첫 번째와 마지막 부분입니다. 텍스트가 먼저 토큰으로 변환된 다음 토큰은 임베딩으로 변환되어 각 토큰의 의미를 포착하고 모델의 주요 부분(변환기 블록)으로 전달됩니다. 변환기 블록이 실행된 후 임베딩은 다시 토큰으로 변환됩니다. 마지막으로 방금 반환된 토큰이 입력에 추가되고 모델로 다시 전달되어 프로세스가 다시 반복됩니다. LLM은 하위 단어 토큰화를 사용하여 성능과 효율성의 균형을 맞춥니다.
검색 엔진의 토큰화
검색 엔진은 사용자 쿼리를 토큰화하여 이를 표준화하고 사용자 의도를 더 잘 이해합니다. 검색 엔진 토큰화에는 텍스트를 단어로 분할하고, 필러 단어(예: "the" 또는 "and")를 제거하고, 대문자를 소문자로 바꾸고, 하이픈과 같은 문자를 처리하는 작업이 포함될 수 있습니다. 성능과 효율성이 어휘 크기에 덜 의존하기 때문에 일반적으로 하위 단어 토큰화는 필요하지 않습니다.
기계 번역의 토큰화
기계 번역 토큰화는 입력 언어와 출력 언어가 다르기 때문에 흥미롭습니다. 결과적으로 각 언어마다 하나씩 두 개의 토크나이저가 있게 됩니다. 하위 단어 토큰화는 일반적으로 모델 효율성과 모델 성능 간의 균형을 유지하므로 가장 잘 작동합니다. 그러나 중국어와 같은 일부 언어에는 단어보다 작은 언어 구성 요소가 없습니다. 여기서는 단어 토큰화가 필요합니다.
토큰화의 이점
토큰화는 모든 NLP 모델에 필수입니다. 좋은 토큰화를 통해 ML 모델은 텍스트를 효율적으로 사용하고 새로운 단어를 잘 처리할 수 있습니다.
토큰화를 통해 모델이 텍스트로 작업할 수 있습니다.
내부적으로 ML 모델은 숫자로만 작동합니다. ML 모델의 알고리즘은 전적으로 계산에 의존하며, 계산하려면 숫자가 필요합니다. 따라서 ML 모델이 작업하려면 먼저 텍스트를 숫자로 변환해야 합니다. 토큰화 후에는 어텐션이나 임베딩과 같은 기술을 숫자에 대해 실행할 수 있습니다.
토큰화는 새롭고 희귀한 텍스트로 일반화됩니다.
또는 더 정확하게 말하면좋은토큰화는 새롭고 희귀한 텍스트로 일반화됩니다. 하위 단어 및 문자 토큰화를 사용하면 새 텍스트를 기존 토큰의 시퀀스로 분해할 수 있습니다. 따라서 의미없는 단어가 포함된 기사를 ChatGPT에 붙여넣어도 기사가 깨지지 않습니다(물론 일관성 있는 응답을 제공하지 못할 수도 있음). 또한 좋은 일반화를 통해 모델은 하위 토큰의 관계를 기반으로 희귀 단어 간의 관계를 학습할 수 있습니다.
토큰화의 과제
토큰화는 훈련 코퍼스와 알고리즘에 따라 달라지므로 결과가 달라질 수 있습니다. 이는 LLM의 추론 능력과 입력 및 출력 길이에 영향을 미칠 수 있습니다.
토큰화는 LLM의 추론 능력에 영향을 미칩니다.
LLM을 종종 당황하게 만드는 쉬운 문제는 "strawberry"라는 단어에서 문자 "r"의 발생 횟수를 세는 것입니다. 모델은 2개가 있다고 잘못 말하지만 실제 대답은 3개입니다. 이 오류는 부분적으로 토큰화로 인해 발생했을 수 있습니다. 하위 단어 토크나이저는 "strawberry"를 "st", "raw" 및 "berry"로 분할합니다. 따라서 모델은 중간 토큰에 있는 하나의 "r"을 마지막 토큰에 있는 두 개의 "r"에 연결하지 못했을 수도 있습니다. 선택한 토큰화 알고리즘은 단어가 토큰화되는 방식과 각 토큰이 다른 토큰과 관련되는 방식에 직접적인 영향을 미칩니다.
토큰화는 LLM 입력 및 출력 길이에 영향을 미칩니다.
LLM은 대부분 각 토큰을 맥락화하기 위한 주의 메커니즘에 의존하는 변환기 아키텍처를 기반으로 구축되었습니다. 그러나 토큰의 수가 증가할수록 주의를 기울이는 데 필요한 시간은 2차적으로 늘어납니다. 따라서 4개의 토큰이 있는 텍스트는 16단위의 시간이 걸리지만 8개의 토큰이 있는 텍스트는 64단위의 시간이 걸립니다. 이는 LLM을 수십만 토큰의 입력 및 출력 제한으로 제한합니다. 토큰이 작을수록 모델에 제공할 수 있는 텍스트의 양이 실제로 제한되어 사용할 수 있는 작업 수가 줄어들 수 있습니다.