안녕하세요, 오늘은 대규모 언어 모델링(LLM)의 분사 기법에 대해 알아보겠습니다. 안타깝게도 현재 최고의 LLM에서 분사 기법은 더 복잡하고 까다로운 부분이지만, 많은 사람들이 신경망이나 기타 신비해 보이는 이유를 LLM의 일부 단점으로 탓하지만 실제로 이러한 문제의 원인은 분사 기법인 경우가 많으므로 세부 사항을 이해하는 것이 매우 필요합니다.
원본 텍스트:https://github.com/karpathy/minbpe
이전: 문자 기반 세분화
그렇다면 서브텍스트란 무엇일까요? 실제로 이전 동영상 [처음부터 GPT 구축앞서 [ ]에서 세마포어에 대해 이야기했지만, 이는 매우 단순하고 원시적인 형태의 캐릭터 레벨에 불과합니다. 이 [ ]의 동영상을 보시면Google 공동 작업실] 페이지에서 트레이닝 데이터([[셰익스피어의 작품], 즉 파이썬에서는 매우 긴 문자열에 불과합니다:
첫 번째 시민: 계속하기 전에 제 말을 들어주세요.
모두: 어서 말해 보세요.
퍼스트 시티즌: 여러분 모두 굶느니 차라리 죽기로 결심했나요?
모두: 결정됨. 결정됨.
퍼스트 시티즌: 우선, 가이우스 마르시우스가 국민의 가장 큰 적이라는 것을 알고 계실 겁니다.
모두: 알아요, 알아요.
그렇다면 문자 시퀀스를 언어 모델에 어떻게 공급할까요? 이를 위한 첫 번째 단계는 학습 데이터 세트 전체에서 발견되는 모든 다양한 문자를 포함하는 어휘 테이블을 구성하는 것입니다:
이것은 텍스트에 나타나는 유일한 문자입니다. chars = sorted(list(set(text)))vocab_size = len(chars)print(''.join(chars))print(vocab_size)
# !$&',-.3:;?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz# 65 ```
그 직후, 위에 나열된 어휘를 기반으로 개별 문자와 정수 단어를 변환하는 룩업 테이블을 만들겠습니다. 이 룩업 테이블은 실제로 파이썬 사전입니다:
``` pythonstoi = { ch:i for i,ch in enumerate(chars) }itos = { i:ch for i,ch in enumerate(chars) }# 인코더: 문자열을 받아 대응하는 정수 목록을 출력합니다 encode = lambda s: [stoi[c ] for c in s]# 디코더: 정수 목록을 받아 문자열로 다시 환원decode = lambda l: ''.join([itos[i] for i in l])
print(encode("hii there"))print(decode(encode("hii there")))
# [46, 47, 47, 1, 58, 46, 43, 56, 43]# 안녕 거기```.
시퀀스를 정수로 변환하면 각 정수가 2차원 훈련 가능한 임베딩 행렬의 인덱스로 사용되는 것을 볼 수 있습니다. 어휘의 크기가 `vocab_size=65`이므로 이 임베딩 행렬도 65개의 행을 갖습니다:
```파이썬 클래스 BigramLanguageModel(nn.Module).
def __init__(self, vocab_size):super(). __init__()self.token_embedding_table = nn.Embedding(vocab_size, n_embd)
def forward(self, idx, targets=None):tok_emb = self.token_embedding_table(idx) # (B,T,C) ```
여기서 '정수'는 임베딩 테이블에서 토큰을 나타내는 벡터인 행을 추출합니다. 그런 다음 이 벡터를 해당 시간 단계에 대한 입력으로 트랜스포머에 공급합니다(트랜스포머).
바이트 쌍 인코딩(BPE) 알고리즘을 사용한 '문자 블록'의 토큰화
이는 초보적인 문자 수준의 언어 모델에는 충분합니다. 그러나 실제로는 최신 언어 모델은 마크업 어휘를 구성하기 위해 더 복잡한 체계를 사용합니다. 이러한 체계는 문자 수준에서 작동하는 것이 아니라 문자 블록 수준에서 작동합니다. 이러한 문자 블록 어휘는 아래에서 자세히 설명하는 바이트 쌍 인코딩(BPE)과 같은 알고리즘을 사용하여 구성됩니다.
이 접근 방식의 역사적 발전 과정을 살펴보면, 2019년에 발표된 OpenAI의 GPT-2 논문 "비지도 멀티태스킹 학습자로서의 언어 모델"은 언어 모델 라벨링에 바이트 수준 BPE 알고리즘을 널리 사용하게 만들었습니다. 이 알고리즘에 대한 설명과 동기는 이 백서의 '입력 표현' 섹션 2.2를 참조하세요. 이 섹션의 마지막에 언급되어 있습니다:
어휘가 50,257개로 확장되었습니다. 또한 컨텍스트 크기를 512개에서 1024개로 늘리고 더 큰 배치 크기인 512개를 사용했습니다.
트랜스포머의 주의 계층에서 각 토큰은 이전 시퀀스의 유한한 수의 토큰에 대한 주의라는 점을 기억하세요. 이 논문에서는 GPT-2 모델의 컨텍스트 길이가 1024개 토큰으로 GPT-1의 512개보다 개선되었다고 언급하고 있습니다. 즉, 토큰은 언어 장기기억(LLM) 모델의 입력 역할을 하는 기본 단위입니다. 토큰화는 파이썬에서 원시 문자열을 토큰 목록으로 변환하거나 그 반대로 변환하는 프로세스입니다. 이러한 추상화의 보편성을 보여주는 또 다른 유명한 예를 하나 더 들어보면 [라마 2이 논문에서도 "마커"를 검색하면 63개의 언급이 나옵니다. 예를 들어, 이 논문에서는 2조 개의 토큰 등으로 훈련했다고 주장합니다.
구현 세부 사항을 살펴보기 전에 토큰화 프로세스를 살펴봐야 하는 이유를 간략히 살펴보겠습니다. 토큰화는 LLM의 많은 이상한 점의 핵심이며, 이를 가볍게 여기지 않는 것이 좋습니다. 신경망의 구조와 관련된 것처럼 보이는 많은 문제들이 실제로는 토큰화에서 비롯된 것입니다. 다음은 몇 가지 예시입니다:
- LLM이 단어의 철자를 정확하게 입력할 수 없는 이유는 무엇인가요?
- LLM이 문자열 반전과 같은 간단한 문자열 처리 작업을 수행할 수 없는 이유는 무엇인가요?
- 비영어권 언어(예: 일본어)를 다룰 때 LLM의 성능이 저조한 이유는 무엇인가요?
- 간단한 산술 연산을 수행할 때 LLM의 성능이 저하되는 이유는 무엇인가요?
- GPT-2는 왜 파이썬으로 프로그래밍하기가 더 어려운가요?
- LLM이 "" 문자열을 만나면 갑자기 작동이 중지되는 이유는 무엇인가요?
- '후행 공백'에 대한 이 이상한 경고는 무엇인가요?
- '솔리드골드매기카프'에 대해 문의하면 왜 LLM이 충돌하나요?
- LLM과 상호 작용할 때 JSON이 아닌 YAML을 사용해야 하는 이유는 무엇인가요?
- LLM이 실제로 진정한 엔드투엔드 언어 모델이 아닌 이유는 무엇인가요?
- 고통의 근본 원인은 정확히 무엇인가요?
이 주제는 동영상 마지막에 다시 다뤄보겠습니다.
다음으로, 이 [토큰화 온라인 도구] 이 온라인 도구의 장점은 토큰화 과정이 웹 브라우저에서 실시간으로 진행되며, 입력 상자에 텍스트 문자열을 쉽게 입력하고 오른쪽에서 토큰화 결과를 즉시 확인할 수 있다는 것입니다. 페이지 상단에는 현재 사용 중인 토큰이 표시됩니다.gpt2
토큰화기를 사용하면 예제의 문자열이 300개의 토큰으로 나뉘어져 있는 것을 볼 수 있습니다. 이러한 토큰은 서로 다른 색상으로 명확하게 표시됩니다:

예를 들어, 문자열 "토큰화"는 토큰 30642와 토큰 1634로 인코딩됩니다. 토큰의 인덱스는 "is"입니다(여기에는 앞의 공백을 포함하여 세 개의 문자가 있는데, 이는 중요합니다!). 토큰의 인덱스는 318입니다. 공백은 문자열에 실제로 존재하며 다른 모든 문자와 함께 토큰화되어야 하지만 시각적 명확성을 위해 일반적으로 생략됩니다. 도구 하단에서 공백의 시각화를 토글할 수 있습니다. 마찬가지로 "at" 토큰은 379, "the" 토큰은 262 등입니다.
다음으로 간단한 산술 예시를 살펴보겠습니다. 여기서 우리는 토큰 생성기가 일관되지 않은 방식으로 숫자를 분해할 수 있음을 알 수 있습니다. 예를 들어 숫자 127은 세 개의 문자로 구성된 단일 토큰으로 분해되는 반면, 숫자 677은 토큰 '6'(다시 한 번 앞의 공백에 유의하세요!)과 토큰 '77'의 두 가지 토큰으로 분해됩니다. 그리고 토큰 "77"입니다. 이러한 임의성을 이해하기 위해 대규모 언어 모델에 의존합니다. 모델은 매개변수와 학습 과정에서 두 토큰("6"과 "77")이 실제로 결합하여 숫자 677을 나타낸다는 것을 학습해야 합니다. 마찬가지로 LLM이 이 덧셈의 결과가 숫자 804가 될 것이라고 예측하려면 먼저 토큰 "8"을 출력하고 그 다음 토큰 "04"를 출력하는 두 단계로 숫자를 출력해야 합니다. 이러한 모든 분해는 완전히 임의적인 것처럼 보입니다. 아래 예에서 1275는 "12"와 "75"로 분해되고, 6773은 실제로 "6"과 "773" 두 개의 토큰으로, 8041은 "8"과 "041"로 분해되는 것을 볼 수 있습니다.
(계속 이어집니다...) (할 일: 동영상에서 이 콘텐츠를 자동으로 생성하는 방법을 찾지 않는 한 이 작업을 계속할 것입니다.)
© 저작권 정책
이 글은 저작권이 있으며 무단으로 복제해서는 안 됩니다.
관련 문서
댓글 없음...