# Working with text data

<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">이 글은 <a target="_self" rel="noopener noreferrer nofollow" href="https://www.manning.com/books/build-a-large-language-model-from-scratch" style="pointer-events: none">Build a Large Language Model</a>을 읽고 개인적으로 정리한 내용입니다.</div>
</div>

### **This chapter covers**

* 대형 언어 모델 훈련을 위한 텍스트 준비
    
* 텍스트를 단어와 서브워드 토큰으로 분할
    
* 텍스트를 토큰화하는 보다 진보된 방법인 바이트 페어 인코딩
    
* 슬라이딩 윈도우 접근 방식을 사용한 훈련 예제 샘플링
    
* 토큰을 대형 언어 모델에 입력하기 위한 벡터로 변환
    

## 2.1. Understanding word embeddings

* 데이터를 벡터 형식으로 변환하는 개념을 임베딩이라고 함
    
* [임베딩 결과 시각화](https://projector.tensorflow.org/)
    
* 다른 데이터 형식에는 각기 다른 임베딩 모델이 필요
    
    * e.g. 텍스트 임베딩 모델은 오디오 or 비디오 임베딩에 부적절
        
* Word2Vec과 같은 임베딩 모델 쓸 수도 있는데, 일반적으로 자체 임베딩을 생성함
    

## 2.2. Tokenizing text

* regex로 토크나이징
    
    ```python
    re.split(r'([,.]|\\s)', text)
    ```
    
* Input text → Tokenized text → Token IDs → Token embeddings
    

## 2.3. Converting tokens into token IDs

* 토큰 ID로 매핑하려면 어휘(vocabulary)를 만들어야 함
    
* Vocabulary: 모델이 다룰 수 있는 단어/토큰들의 전체 집합
    
    * 각 고유 단어와 특수문자를 고유한 정수에 매핑하는 방법을 정의함
        
    * 예제에서는 그냥 알파벳순으로 정렬함
        
* Dictionary: 매핑 적용 후 테이블
    
* Encoding: dictionary를 사용해 텍스트를 ID로 변환
    
* Decoding: dictionary를 사용해 ID를 텍스트로 역변환
    

## 2.4. Adding special context tokens

* 특정 문맥을 처리하기 위해 특수 토큰 추가 필요
    
* GPT 모델은 단순화를 위해 `<|endoftext|>` 토큰만 사용
    
    * 토큰들은 특정 구간의 시작이나 끝을 알리는 마커 역할
        
* GPT 모델은 단어를 하위 단어 단위로 분해하는 Byte pair encoding 사용
    

## 2.5. Byte pair encoding

* 기존에 있던 단어를 분리하는 알고리즘
    
* character 단위에서 점차적으로 vocabulary를 만들어 내는 bottom up
    
* 더 작은 하위 단어 or 개별 문자로 분해 후 vocabulary에 추가
    
* 연속적으로 가장 많이 등장한 글자 쌍을 찾아서 하나의 글자로 병합
    
* [tiktoken](https://github.com/openai/tiktoken): A fast BPE tokeniser
    

## 2.6. Data sampling with a sliding window

* 슬라이딩 윈도우: 텍스트를 일정 크기의 겹치는 구간으로 나누어 입력과 타겟을 생성
    
* `max_length`: 한 번에 처리할 토큰 수, 추론 시 컨텍스트 윈도우의 상한
    
* `stride`: 윈도우가 이동하는 간격
    
* `stride < max_length`으로 설정하여 과적합(overfitting)을 방지
    

## 2.7. Creating token embeddings

* 임베딩이 필요한 이유
    
    * 딥러닝 신경망은 연속적인 벡터 표현 필요
        
    * 역전파 알고리즘으로 훈련되기 때문
        
    * 정수형 토큰 ID로는 gradient 계산 불가
        
* 작동 메커니즘
    
    * 조회 작업(Lookup): 토큰 ID로 가중치 행렬에서 해당 행 선택
        
    * e.g. 토큰 ID 3 → 가중치 행렬의 4번째 행(0-indexed)
        
    * One-hot 인코딩 + 행렬 곱셈의 효율적 구현
        

## 2.8. Encoding word positions

* 토큰 임베딩의 한계
    
    * Self-attention 메커니즘이 토큰의 위치나 순서를 이해하지 못하는 문제가 있음
        
    * 임베딩 레이어는 토큰 ID가 어느 위치에 있든 항상 동일한 벡터로 변환
        
* 위치 임베딩의 필요성
    
    * 절대적 위치 임베딩: 시퀀스 내 특정 위치와 연결되며, 각 위치마다 고유한 임베딩을 토큰 임베딩에 더함
        
    * 상대적 위치 임베딩: 토큰 간의 상대적 거리에 중점을 두며, 훈련 중 보지 못한 길이의 시퀀스에도 잘 일반화됩니다
