Stanford CS336 Language Modeling from Scratch | Lecture 1: Overview and Tokenization

곽태욱·2025년 6월 9일

LLM 이론

Stanford CS336 Language Modeling from Scratch | Spring 2025 | Lecture 1: Overview and Tokenization (YouTube)

  • Tokenizer
    • LLM은 사용자가 입력한 글을 받아 답변을 생성해 제공하는 AI 모델
    • 사용자의 입력을 새로운 글로 변환해야 함
      • 입력을 통째로 인식해서 답변을 예측하기엔 입력의 경우의 수가 너무 많음
    • 그래서 입력을 토큰 단위로 잘개 쪼개서 답변을 예측함
      • 입력을 그냥 유니코드로 쪼개서 넣어줄 수 있지만 이럼 토큰 수가 너무 많아짐 (유니코드 15만개)
    • 그래서 사용자 입력을 “Byte-Pair Encoding (BPE)” 방식으로 우리가 지정한 토큰으로 바꿈
      • 토큰 경우의 수
        • GPT-2 5만개 < 유니코드 15만개
      • 문자 1개당 토큰 길이 (작을 수록 좋음)
        • BPE 1개 < 유니코드 1~4개(알파벳 1개, 라틴어 2개, 한글 3개 등)

BPE

  • BPE는 학습, 인코딩, 디코딩 기능이 있음
  • 학습은 초기 1번만 하면 되고, 학습이 끝나면 어휘 맵이 생성됨
  • ASCII 코드만 지원한다면 어휘 맵을 정수 배열이 아니라 byte 배열로도 구성할 수 있음
  • 모든 문자를 지원하려면 유니코드 방식으로 구현해야 함
  • 학습 (유니코드 지원 방식)
    • 테스트 커버리지는 다음과 같이 측정합니다. 입력 문자열

    • ["테스트", " 커버리지는", " 다음과", " 같이", " 측정합니다."] Pretoken

    • [[237, 133, 140, 236, 138, 164, 237, 138, 184], [32, 236, 187, 164, 235, 178, 132, 235, 166, ...], ...] UTF-8 (정수 표현)

    • byte-pair 빈도 계산

      // 빈도를 계산하기 위한 임시 맵
      {
        (237, 133): 4,
        (236, 138): 3,
        ...
      }
    • 가장 많이 나타나는 byte-pair를 새로운 토큰으로 대치

      // 어휘 맵
      {
        ...             // 0 ~ 255 기존 ASCII 코드
        256: (237, 133) // 새로운 커스텀 토큰
        257: (256, 124) // 커스텀 토큰도 byte-pair에 들어갈 수 있음 -> 디코딩 시 DFS 사용
      }
    • [[256, 140, 236, 138, 164, 237, 138, 184], [32, 236, 187, 164, 235, 178, 132, 235, 166, ...], ...] ( 237, 133256 으로 대치됨)

    • byte-pair 빈도를 계산하고 새로운 토큰으로 대치하는 과정을 반복함

      • 정해진 횟수, 최소 byte-pair 빈도수, 최대 어휘 맵 크기 등의 조건을 만족할 때까지
  • 인코딩
    • 테스트 커버리지는 다음과 같이 측정합니다. 입력 문자열
    • [237, 133, 140, 236, 138, 164, 237, 138, 184, 32, 236, 187, 164, 235, 178, 132, 235, 166, ...] UTF-8 (정수 표현)
    • reversed(key-value 반대) 어휘 맵에서 byte-pair를 token으로 변환함
      • 토큰을 앞에서부터 스택에 넣어가면서 상위 2개 정수를 어휘 맵에 매칭된 토큰으로 변환함
    • [256, 140, 236, 138, 164, 237, 138, 184, 32, 236, 187, 164, 235, 178, 132, 235, 166, ...] 결과 토큰 배열 ( 237, 133256 으로 대치됨)
  • 디코딩
    • [256, 140, 236, 138, 164, 237, 138, 184, 32, 236, 187, 164, 235, 178, 132, 235, 166, ...] 입력 토큰 배열
    • 주어진 토큰을 어휘 맵에서 DFS 알고리즘으로 탐색하여 최종 정수 배열로 변환함
    • [237, 133, 140, 236, 138, 164, 237, 138, 184, 32, 236, 187, 164, 235, 178, 132, 235, 166, ...] (모든 토큰이 255 이하 = UTF-8 정수 표현형)
    • 테스트 커버리지는 다음과 같이 측정합니다. 결과 문자열

과제

profile
이유와 방법을 알려주는 메모장 겸 블로그 (Frontend, AI, 경제, 책)

0개의 댓글