토크나이저가 먹는 것이 그것이 아는 것이 된다
토크나이저 다이어트: 정의
Harris 토크나이저는 코퍼스 샘플에서 훈련됩니다. 해당 샘플 전반에 분포 분석을 실행하고, 가장 강하게 반복되는 N개의 세그먼트를 선택하여 어휘에 기록합니다. 훈련 후, 이 N개의 세그먼트는 언어 모델이 훈련, 추론, 모든 입력, 모든 출력에 사용하는 고정된 알파벳이 됩니다.
토크나이저 다이어트 = 토크나이저가 훈련하는 텍스트 샘플.
훈련 식단 = 언어 모델이 훈련하는 코퍼스.
두 식단이 다를 때, 토크나이저는 모델이 절대 보지 않을 텍스트에 맞춰진 세그먼트를 학습합니다. 임베딩 용량(어휘 항목당 하나의 슬롯)은 훈련 중 보상을 받지 않는 세그먼트에 낭비됩니다.
ANDREA-12M의 실수
ANDREA-12M은 Harris 토크나이저를 megachat-v8.txt의 원시 헤드에서 훈련시켰습니다. 그 헤드에는 코드 샘플과 도구 호출 데이터가 포함되어 있었습니다. 그러나 훈련 커리큘럼은 코드와 도구 호출을 제외했습니다; ANDREA-12M은 대화 텍스트만 보았습니다.
결과: 토크나이저는 Python 키워드, JSON 중괄호, 쉘 플래그로부터 세그먼트를 학습했습니다. 사전 항목과 대화로 훈련된 모델. 커리큘럼 가중 샘플과 중복되는 세그먼트는 36.4%에 불과했습니다. 나머지 63.6%의 어휘 슬롯은 모델이 훈련 시간에 절대 만나지 못할 세그먼트에 할당되었습니다.
왜 중요한가
각 어휘 항목은 임베딩 매개변수를 소비합니다: V × d_model 모양의 임베딩 행렬의 한 행 (활동 4에서 다룸). V = 4353 & d_model = 384일 때, 모든 어휘 슬롯은 384개의 부동소수점을 비용으로 합니다. 63.6%를 낭비하는 것은 모델이 절대 보지 못할 데이터에 임베딩 행렬의 63.6%를 낭비하는 것입니다.
다이어트 규칙 제시하기
N은 얼마나 커야 하는가
어휘 과학 스윕
ANDREA-120M은 어휘 과학 실험을 실행했습니다: 동일한 1.25B 문자 파이어호스 코퍼스에서 다양한 N 값(요청된 세그먼트 수)으로 Harris 토크나이저를 훈련. 토크나이저가 실제로 발견한 세그먼트 수를 측정. 결과를 플롯.
| 요청된 N | 실제 발견된 세그먼트 수 | 상태 |
|---|---|---|
| 2,048 | 2,048 | 불포화 (성장 여지 있음) |
| 4,096 | 4,096 | 불포화 |
| 8,192 | 8,192 | 포화점 |
| 16,384 | 13,106 | 코퍼스 소진 |
포화가 의미하는 것
작은 N에서는 코퍼스가 반복되는 패턴을 많이 가지고 있어; 토크나이저가 요청하는 모든 슬롯을 채웁니다. 큰 N에서는 토크나이저가 통계적으로 의미 있는 경계를 다 소진합니다. 1.25B 문자 코퍼스는 빈도 임계값 이상의 약 13,106개의 고유 형태소 모양 세그먼트를 포함합니다. 16,384개를 요청하면 13,106개를 얻고; 나머지 3,278 슬롯은 패딩되거나 비어 있게 됩니다.
포화: 요청된 N = 발견된 N인 지점. 포화 너머에서는 토크나이저가 품질을 희석하지 않고(빈도 임계값을 낮추고 노이즈를 수용하지 않고) 더 많은 세그먼트를 발견할 수 없습니다.
8192에서의 Sweet Spot
ANDREA-120M은 N = 8192를 선택했습니다. 이유:
- 8192 미만(예: 4096): 어휘가 일반적인 형태소를 충분히 포착하지 못함; 시퀀스가 더 많은 토큰으로 분할됨; 처리량 저하.
- 8192에서: 모든 세그먼트 슬롯이 코퍼스에서 실제, 반복적인 패턴에 매핑됩니다.
- 8192 이상: 수익 체감; 13,106 < 16,384는 슬롯이 낭비됨을 의미합니다.
최종 ANDREA-120M 어휘: 256 + 8192 + 1 = 8449 토큰. 평균 압축: 토큰당 5.91 UTF-8 바이트, 이는 각 토큰이 원시 텍스트의 ~5.9 바이트를 대체함을 의미합니다. 이 비율은 모델의 효과적인 컨텍스트를 설정합니다: 1024 토큰 × 5.91 바이트/토큰에서 ANDREA-120M은 한 번의 순전파당 대략 6,050 문자를 읽습니다.
포화점 위 또는 아래
63.6%가 어디서 왔는지
낭비된 슬롯 세기
ANDREA-12M의 토크나이저는 원시 megachat-v8.txt로 훈련되었습니다 (요청된 4096 세그먼트 발견). 팀이 커리큘럼 가중치 샘플링된 부분 집합을 샘플링했습니다: 밴디트에 의해 각 소스가 끌려온 빈도에 따라 가중된 코퍼스. 그 가중 샘플에 대해 Harris 분석을 다시 실행하고 물었습니다: 원래 4096 세그먼트 중 몇 개가 여전히 나타납니까?
결과: 36.4% 중복. 4,096 세그먼트 중 1,491개가 커리큘럼 가중치와 일치. 나머지 2,605 세그먼트는 모델이 제외한 소스에서 왔습니다.
모델이 한 번도 보지 못한 바이트에 어휘 슬롯의 63.6%가 할당되었습니다.
임베딩 비용
모든 어휘 항목은 (V, d_model) 모양의 임베딩 행렬의 한 행을 차지합니다. ANDREA-12M의 경우:
- V = 4353 (256 + 4096 + 1)
- d_model = 384
- 임베딩 매개변수 = V × d_model = 4353 × 384 = 1,671,552 parameters
대화형 훈련에서 사용되지 않은 매개변수의 63.6%. 1,063,107 매개변수 할당, 0 보상 신호. ANDREA-12M은 256 기본 바이트가 항상 모든 문자를 커버하기 때문에 생존하지만, 매개변수당 용량이 급격히 감소했습니다.
ANDREA-120M이 이를 어떻게 수정했는가
ANDREA-120M의 토크나이저는 포화 N = 8192에서 전체 파이어호스(1.25B 문자, 21 소스)로 훈련되었습니다. 훈련 코퍼스 = 동일한 파이어호스. 다이어트 정렬: 100%. 채팅 가중 샘플에서의 결과 중첩: 36.5%. (참고: 36.5%는 중첩이며, 커버리지가 아닙니다; 채팅만 전체 파이어호스의 부분집합이므로 이 숫자는 12M의 36.4%와 다르게 동작합니다.)
효과적인 압축: 토큰당 5.91 UTF-8 바이트. ANDREA-120M의 임베딩 매트릭스: 8449 × 768 = 6,488,832 매개변수. 모든 매개변수가 실제로 훈련하는 텍스트에 매핑되는 모든 세그먼트 때문에 보상 신호를 받습니다.
커버리지 대 중첩
왜 5.91 Bytes Per Token이 중요한가
압축 비율
토큰당 평균 UTF-8 바이트는 각 어휘 항목이 얼마나 많은 원시 텍스트를 압축하는지를 측정합니다. ANDREA-120M은 평균 5.91입니다. 더 짧은 조각(토큰당 3바이트)의 모델은 순전파당 더 적은 맥락을 읽습니다; 더 긴 조각(토큰당 8바이트)의 모델은 더 많이 읽지만 훈련이 느립니다(각 조각이 잘 학습되려면 더 많은 샘플이 필요합니다).
효과적인 컨텍스트
| 수량 | 값 |
|---|---|
| 토큰 컨텍스트 창 | 1,024 토큰 |
| 토큰당 평균 바이트 | 5.91 |
| 효과적인 문자 컨텍스트 | 1024 × 5.91 ≈ 6,050 |
대략 6,000개의 UTF-8 문자가 하나의 ANDREA-120M 순전파에 들어갑니다. 밀도 높은 영어 산문 한 페이지는 ~3,000-4,000 문자 정도입니다. ANDREA는 한 번의 순전파당 약 페이지와 반 정도를 읽습니다.
다이어트가 압축을 강화합니다
잘 정렬된 토크나이저는 더 잘 압축합니다. 토크나이저가 훈련 코퍼스에서 반복되는 세그먼트를 학습하면, 토큰당 더 많은 텍스트가 들어갑니다. ANDREA-12M의 부정렬 토크나이저는 채팅에서 더 나쁘게 압축되었습니다(채팅 세그먼트가 어휘에서 희박했기 때문에 바이트 대체 조각에 더 많은 바이트가 소모됨). ANDREA-120M의 다이어트 정렬 토크나이저는 채팅 모양의 조각을 빠른 경로에 유지하고 드문 스크립트를 바이트 대체로 처리합니다.
활동 4 계속
Activity 4 (grow_a_language_model_embeddings)는 그 8449개의 어휘 항목에 무슨 일이 일어나는지 다룹니다: 이들은 V × d_model 모양의 임베딩 행렬의 행이 되고, 첫 번째 트랜스포머 블록으로 흐르기 전에 학습된 위치 임베딩을 더합니다.