[강의 정리] Let's build the GPT Tokenizer (by. Andrej Karpathy) - (1)

Taekyung Ahn·2024년 3월 17일

강연모음

목록 보기
2/6

동영상 원본 : https://youtu.be/zduSFxRajkE?si=qR88n9wmarjPcAWA

colab 원본 : https://colab.research.google.com/dri...

게시글 내 모든 이미지의 출처는 위 영상과 colab 주소에 있습니다:)

3주 전에 카파씨 선생님께서 깜짝선물로 올린 영상을 이제서야 보기 시작했습니다. 2시간 13분짜리 영상인지라 시작할 엄두가 나지 않았는데, 비슷한 마음으로 시청을 미뤄둔 분들에게 공유하고 싶어 정리하기 시작했습니다. 이번 포스팅은 강의 영상 43분까지(decoding 설명 전)의 내용을 다루려고 합니다. 각 내용을 다루는 타임 스탬프 url도 설명과 함께 넣었습니다.

카파씨 선생님은 tokenization이 본인의 페이보릿 파트라고 말합니다. 강의 자료인 코랩에 들어가시면 약간의 광기가 느껴지는 tokenziation 사랑을 볼 수 있습니다.

과장이라고 하기엔 tokenization은 언어모델 훈련에 있어서 아주 중요한 역할을 하는 건 사실입니다. 글자 그대로 언어모델이기 때문이죠. 사람이 사용하는 (자)연어의 의미나 규칙, 문맥 등을 기계가 학습할 수 있도록 숫자로 변환하는 것이 언어모델의 첫 번째 단계인데, 여기서 어떤 기준으로 사람의 언어를 쪼갤 것인지 판단해서 변환하는 과정이 tokenization이죠. 이 기준에 따라 기계가 언어를 학습하는 수준이 천차만별로 달라지게 됩니다.

https://youtu.be/zduSFxRajkE?t=518

카파씨 선생님은 tokenization을 시각화한 페이지인 tiktokenizer을 직접 사용하면서 tokenization의 예시를 보여줍니다. Egg라는 동일한 단어가 문장을 시작할 때 올 때, 문장의 마지막에 올 때, 소문자로만 쓸 때 그리고 대문자로만 쓸 때에 따라 tokenization이 달라지는 것을 확인할 수 있습니다.

또 GPT2 모델을 기준으로 영어와 한국어(갑자기 등장하는 한국어에 조금 당황했습니다)의 tokenization 결과가 어떻게 다른지 직접 한국어를 구사(!)하시면서(쑥스러워하는 모습은 덤입니다) 예시를 들어줍니다. 영상에서 “Chunks here are lot more broken up”이라고 설명하듯, 영어가 아닌 언어는 영어에 비해 의미상 확연히 비효율적으로 쪼개지는 모습을 확인할 수 있습니다. 이는 tokenizer가 언어를 쪼개는 기준을 학습할 데이터가 영어에 비해 상대적으로 적기 때문이라고 합니다. 이런 이유로 영어와 똑같은 분량의 계산을 수행한다고 했을 때, 의미를 학습할 기회가 적어지기 때문에 영어에 비해서 언어를 학습하는 성능이 다소 떨어지게 됩니다.

https://youtu.be/zduSFxRajkE?t=726

또 GPT2 모델이 Python 코드를 제대로 작성하지 못했던 원인 중 하나로 인덴테이션에 대한 tokenization을 이야기하며 실제 Python 코드의 tokenization 결과를 보여주었습니다. 구분된 색상으로 알 수 있듯이 인덴테이션에 쓰이는 space들을 각각 별개의 token으로 인식하고 있습니다. 이로 인해 앞서 이야기한 영어 외 언어처럼 tokenization의 비효율이 생겼고 결국 이러한 tokenization 결과물을 학습한 언어모델은 코드를 제대로 구사하는데에 어려움을 겪을 수밖에 없죠.

https://youtu.be/zduSFxRajkE?t=753

하지만 GPT4 훈련에 사용했던 cl100k_base tokenizer로 교체하면 인덴테이션을 하나의 토큰으로 인식하는 것을 확인할 수 있습니다. 눈으로 보기에도 이전보다 편안하네요. 카파씨 선생님이 입력한 예시 텍스트의 토큰 수도 300토큰에서 185토큰으로 줄어들었습니다.

카파씨 선생님의 설명에 따르면 이는 GPT4에 사용한 토큰이 GPT2에 사용한 토큰보다 약 2배 정도 많다는 뜻입니다. 이는 동일한 텍스트가 주어졌을 때 언어모델이 좀 더 압축적으로 이해할 수 있다는 뜻이기도 합니다. 즉 언어모델 내부의 transformer가 동일한 조건에서 2배 더 많은 양의 텍스트를 context로서 계산할 수 있다는 뜻이죠. 물론 토큰이 많아질수록 embedding table이 커지기 때문에 토큰 수가 늘어난다고 무조건 좋다고 할 수는 없습니다. 그리고 언어모델의 output은 결국 softmax 값으로 다음 토큰을 예측하는 것이기 때문에 토큰이 많다고 좋을 수만은 없습니다. 그래도 토큰 수를 늘리는 건 텍스트들을 의미론적으로 밀도있게 만드는 효율적인 과정이라는 것은 확실합니다.

https://youtu.be/zduSFxRajkE?t=1426

이후 카파씨 선생님은 BPE(Byte Pair Encoding) 방법을 설명합니다. 앞서 tokenization을 설명한 것과 동일하게 예시를 하나하나 보여주면서 친절하게 설명해주십니다. BPE는 글자 그대로 byte의 연쇄를 압축하는(“Compress the byte sequences”)과정입니다. Byte pair중 가장 자주 등장하는 pair부터 차례대로 하나의 문자로 압축해버리는 것이죠. 자주 등장하는 문자 연쇄는 의미론적으로 묶일 수 있을 거라는 전제로 계산되는 방식인 것입니다. Tokenization에서 BPE를 사용하게 된다면 독립적인 문자들은 데이터에서 같이 자주 등장하는 짝꿍과 하나의 토큰으로 묶일 수 있게 됩니다. 예를 들어 데이터에서 ‘안’과 ‘녕’이 같이 자주 등장한다면, tokenizer는 ‘안녕’을 하나의 토큰으로 추가할 수 있게 됩니다. BPE를 tokenizer에 적용하는 코드는 colab의 get_stats() 함수와 merge() 함수에서 찾아보실 수 있습니다.

profile
정리좋아휴먼의 기록

0개의 댓글