얼마 전 AI 마스터 Karpathy의 온라인 AI 강좌가 전체 네트워크에서 150,000회의 조회수를 기록했습니다.
당시 일부 네티즌들은 이 2시간 수업의 가치가 대학 4년과 맞먹는다고 말했습니다.
지난 며칠 동안 Karpathy는 새로운 아이디어를 내놓았습니다.
2시간 13분 분량의 "처음부터 GPT 토크나이저 만들기" 비디오 콘텐츠를 책 장이나 블로그로 변환하세요 기사의 형식은 "단어 분할"이라는 주제에 중점을 둡니다.
구체적인 단계는 다음과 같습니다.
-비디오에 자막이나 내레이션 텍스트를 추가합니다.
- 비디오를 일치하는 그림과 텍스트를 사용하여 여러 단락으로 자릅니다.
- 대규모 언어 모델의 신속한 엔지니어링 기술을 사용하여 문단별로 번역합니다.
- 결과를 원본 비디오의 일부에 대한 링크와 함께 웹페이지로 출력합니다.
더 광범위하게 이러한 워크플로는 모든 비디오 입력에 적용할 수 있으며, 읽기, 탐색 및 검색이 더 쉬운 형식으로 다양한 튜토리얼에 대한 "지원 가이드"를 자동으로 생성할 수 있습니다.
가능한 것처럼 들리지만 꽤 어려운 일이기도 합니다.
그는 GitHub 프로젝트 minbpe에서 자신의 상상력을 설명하기 위해 예제를 작성했습니다.
주소: https://github.com/karpathy/minbpe/blob/master/lecture.md
Karpathy는 이것이 수동 작업, 즉 비디오를 보고 번역하는 작업이라고 말했습니다. 마크다운 형식의 기사.
"영상을 4분 정도 봤을 뿐이고(즉, 3% 완료) 글을 쓰는 데 30분 정도 걸렸는데, 이런 일이 자동으로 된다면 정말 좋을 것 같아요."
다음은 수업 시간이에요!
안녕하세요 여러분, 오늘은 LLM의 "단어 분할" 문제에 대해 논의하겠습니다.
안타깝게도 "단어 분할"은 최신 대형 모델의 비교적 복잡하고 까다로운 구성 요소이지만 이를 자세히 이해하는 것이 필요합니다.
LLM의 많은 결함은 신경망이나 기타 겉보기에 알 수 없는 요인에 기인할 수 있지만 이러한 결함은 실제로 "단어 분할"로 추적될 수 있기 때문입니다.
문자별 단어 분할
그럼 단어 분할이란 무엇일까요?
사실 이전 영상 "GPT를 처음부터 새로 만들어보자"에서 이미 토큰화를 소개했지만 그건 아주 단순한 캐릭터 수준의 버전에 불과했습니다.
Google colab에 가서 해당 동영상을 확인하면 Python의 큰 문자열인 훈련 데이터(셰익스피어)로 시작하는 것을 볼 수 있습니다.
First Citizen: Before we proceed any further, hear me speak.All: Speak, speak.First Citizen: You are all resolved rather to die than to famish?All: Resolved. resolved.First Citizen: First, you know Caius Marcius is chief enemy to the people.All: We know't, we know't.
하지만 어떻게 문자열을 LLM은 어떻습니까?
먼저 전체 훈련 세트에서 가능한 모든 문자에 대한 어휘를 구축해야 한다는 것을 알 수 있습니다.
# here are all the unique characters that occur in this textchars = sorted(list(set(text)))vocab_size = len(chars)print(''.join(chars))print(vocab_size)# !$&',-.3:;?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz# 65
그런 다음 위의 어휘를 기반으로 단일 문자와 정수 사이에 대한 어휘를 생성합니다. 조회 테이블 전환을 위해. 이 조회 테이블은 단지 Python 사전입니다.
stoi = { ch:i for i,ch in enumerate(chars) }itos = { i:ch for i,ch in enumerate(chars) }# encoder: take a string, output a list of integersencode = lambda s: [stoi[c] for c in s]# decoder: take a list of integers, output a stringdecode = 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]# hii there
문자열을 정수 시퀀스로 변환하면 각 정수가 학습 가능한 매개변수의 2D 임베딩에 대한 인덱스로 사용되는 것을 볼 수 있습니다.
어휘 크기가 vocab_size=65 이므로 이 임베딩 테이블에도 65개의 행이 있습니다.
class 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(바이트 쌍 인코딩)와 같은 알고리즘을 사용하는 것입니다.
이 방법의 역사적 발전을 간략하게 검토해 보겠습니다. 언어 모델 단어 분할을 위해 바이트 수준 BPE 알고리즘을 사용하는 논문은 2019년 OpenAI에서 출판한 GPT-2 논문입니다.
문서 주소: https://d4mucfpksywv.cloudfront.net/better-언어-models/언어_models_are_unsupervised_multitask_learners.pdf
섹션 2.2 "입력 표현"까지 스크롤하여 이 알고리즘을 설명하고 동기를 부여합니다. . 이 섹션 끝에는 다음과 같은 내용이 표시됩니다.
어휘가 50,257 단어로 확장되었습니다. 또한 컨텍스트 크기를 512에서 1024 토큰으로 늘리고 더 큰 배치 크기인 512를 사용했습니다.
Transformer의 어텐션 레이어에서 각 토큰은 시퀀스의 제한된 이전 토큰 목록과 연결되어 있다는 점을 기억하세요.
이 기사에서는 GPT-2 모델의 컨텍스트 길이가 GPT-1의 512개 토큰에서 1024개 토큰으로 늘어났음을 지적합니다.
즉, 토큰은 LLM 입력의 기본 "원자"입니다.
"토큰화"는 Python의 원래 문자열을 토큰 목록으로 또는 그 반대로 변환하는 프로세스입니다.
이 추상화의 보편성을 입증하는 또 다른 인기 있는 예가 있습니다. Llama 2의 논문에서도 "token"을 검색하면 63개의 일치하는 결과를 얻을 수 있습니다.
예를 들어, 논문에서는 2조 개의 토큰 등을 교육했다고 주장합니다.
문서 주소: https://arxiv.org/pdf/2307.09288.pdf
단어 분할의 복잡성에 대한 간단한 이야기
구현을 간단히 설명하자면, "단어 분할" 과정을 자세히 이해할 필요가 있습니다.
토큰화는 LLM의 수많은 이상한 문제의 핵심이므로 이를 무시하지 않는 것이 좋습니다.
신경망 아키텍처의 겉보기에 많은 문제는 실제로 단어 분할과 관련이 있습니다. 다음은 몇 가지 예입니다.
- LLM에서는 왜 단어 철자를 입력할 수 없나요? ——단어 분할
- LLM이 문자열 반전과 같은 매우 간단한 문자열 처리 작업을 수행할 수 없는 이유는 무엇입니까? ——단어 분할
- 영어가 아닌 언어(예: 일본어) 작업에서 LLM이 더 나쁜 이유는 무엇입니까? ——분사
- LLM은 왜 간단한 연산을 잘 못하나요? ——단어 분할
- Python으로 코딩할 때 GPT-2에서 더 많은 문제가 발생하는 이유는 무엇입니까? ——단어 분할
- 문자열을 볼 때 LLM이 갑자기 중지되는 이유는 무엇입니까? ——분사
- "후행 공백"에 대해 받은 이상한 경고는 무엇입니까? ——분사
- "SolidGoldMagikarp"에 대해 LLM에 문의하면 왜 충돌이 발생하나요? ——단어 분할
- JSON 대신 LLM과 함께 YAML을 사용해야 하는 이유는 무엇입니까? ——단어 분할
- LLM이 진정한 엔드 투 엔드 언어 모델링이 아닌 이유는 무엇입니까? ——Participle
영상 마지막 부분에서 이러한 질문으로 다시 돌아오겠습니다.
단어 분할의 시각적 미리보기
다음으로 이 단어 분할 WebApp을 로드해 보겠습니다.
주소: https://tiktokenizer.vercel.app/
이 웹 애플리케이션의 장점은 토큰화가 웹 브라우저에서 실시간으로 실행되어 텍스트를 쉽게 입력할 수 있다는 것입니다. 입력 측 문자열을 확인하고 오른쪽에서 단어 분할 결과를 확인하세요.
상단에는 현재 gpt2 토크나이저를 사용하고 있는 것을 확인할 수 있으며, 이 예시에 붙여넣은 문자열이 현재 300개의 토큰으로 토큰화되고 있는 것을 확인할 수 있습니다.
여기서는 색상으로 명확하게 표시됩니다.
예를 들어 "Tokenization" 문자열은 token30642로 인코딩되고 그 뒤에 토큰 1634가 옵니다.
token "is"(앞 공백을 포함하여 3자이므로 중요합니다!)는 318입니다.
공백은 문자열에 절대적으로 존재하며 다른 모든 문자와 함께 사용해야 하므로 공백 사용에 주의하세요. 그러나 명확성을 위해 시각화 중에는 일반적으로 생략됩니다.
앱 하단에서 시각화 기능을 켜고 끌 수 있습니다. 마찬가지로 토큰 "at"은 379, "the"는 262 등입니다.
다음으로 간단한 산술 예제를 보겠습니다.
여기서 토크나이저가 숫자 분해에 일관성이 없을 수 있음을 알 수 있습니다. 예를 들어, 숫자 127은 3자 토큰이지만 숫자 677은 2개의 토큰, 즉 6(앞 공백에 주의)과 77이 있기 때문입니다.
저희는 이러한 임의성을 설명하기 위해 LLM에 의존합니다.
매개 변수 내에서 그리고 훈련 중에 이 두 토큰(실제로는 6과 77이 결합하여 숫자 677을 형성함)에 대해 학습해야 합니다.
마찬가지로 LLM이 이 합계의 결과가 숫자 804라고 예측하려는 경우 이를 두 가지 시간 단계로 출력해야 함을 알 수 있습니다.
먼저 토큰 "8"을 방출해야 합니다. , 그리고 토큰 "04"입니다.
이 모든 분할은 완전히 임의적으로 보입니다. 아래 예에서 1275는 "12"이고 그 다음은 "75"이고, 6773은 실제로 세 개의 토큰 "6", "77", "3"이고, 8041은 "8"과 "041"임을 알 수 있습니다.
(계속...)
(TODO: 텍스트 버전을 계속하고 싶다면 동영상에서 자동으로 생성하는 방법을 알아내지 않는 한)
네티즌들은 "좋아요. 사실 저는 영상을 보는 것보다 이런 게시물을 읽는 걸 더 좋아하고, 제 리듬을 조절하는 게 더 쉽다"고 말했습니다.
일부 네티즌들이 Karpathy에게 조언을 주었습니다:
"까다롭게 느껴지지만 LangChain을 사용하면 가능할 수도 있습니다. 속삭임 전사를 사용하여 명확한 챕터가 있는 높은 수준의 개요를 생성한 다음 해당 챕터 청크를 병렬로 처리하여 컨텍스트 내의 각 챕터에 집중할 수 있는지 궁금합니다. 장 블록의 특정 내용(병렬 처리된 각 장에 대해 그림도 생성됨) 그런 다음 생성된 모든 참조 표시는 LLM을 통해 기사 끝까지 편집됩니다.
누군가 이에 대한 파이프라인을 작성했으며 곧 오픈 소스가 될 것입니다.
위 내용은 유용한 정보가 가득! Master Karpathy의 2시간짜리 AI 과정의 첫 번째 텍스트 버전인 새로운 워크플로는 자동으로 비디오를 기사로 변환합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!