3. 토큰 임베딩

Tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기

토큰 임베딩

텍스트 데이터를 토크나이즈한 후, GPT 같은 LLMs를 학습시키기 위한 데이터 준비의 다음 중요한 단계는 토큰 임베딩을 생성하는 것입니다. 토큰 임베딩은 이산 토큰(단어나 서브워드 등)을 모델이 처리하고 학습할 수 있는 연속적인 수치 벡터로 변환합니다. 이 설명에서는 토큰 임베딩, 초기화 방법, 사용법, 그리고 토큰 순서에 대한 모델의 이해를 향상시키는 위치 임베딩의 역할을 분해해서 설명합니다.

Tip

이 세 번째 단계의 목표는 매우 단순합니다: 모델을 학습하기 위해 어휘의 각 토큰에 원하는 차원의 벡터를 할당하는 것. 어휘의 각 단어는 X차원 공간의 한 점이 됩니다.
초기에 이 공간에서 각 단어의 위치는 “무작위“로 초기화되며, 이 위치들은 학습 과정에서 개선되는 학습 가능한 파라미터입니다.

또한, 토큰 임베딩 과정에서는 또 다른 임베딩 레이어가 생성되며 이는 (이 경우) 학습 문장 내에서 단어의 절대 위치를 나타냅니다. 이렇게 하면 문장 내 서로 다른 위치에 있는 동일한 단어는 서로 다른 표현(의미)을 갖게 됩니다.

토큰 임베딩이란?

토큰 임베딩은 연속 벡터 공간에서 토큰을 수치적으로 표현한 것입니다. 어휘의 각 토큰은 고정 차원의 고유한 벡터와 연관됩니다. 이러한 벡터는 토큰의 의미론적 및 통사적 정보를 캡처하여 모델이 데이터 내의 관계와 패턴을 이해할 수 있게 합니다.

  • 어휘 크기: 모델의 어휘에 있는 고유 토큰의 총 개수(예: 단어, 서브워드).
  • 임베딩 차원: 각 토큰 벡터에 들어가는 수치 값(차원)의 수. 차원이 높을수록 더 미세한 정보를 포착할 수 있지만 더 많은 계산 자원이 필요합니다.

예시:

  • 어휘 크기: 6 tokens [1, 2, 3, 4, 5, 6]
  • 임베딩 차원: 3 (x, y, z)

토큰 임베딩 초기화

학습 시작 시 토큰 임베딩은 일반적으로 작은 랜덤 값으로 초기화됩니다. 이러한 초기 값들은 학습 데이터에 기반하여 토큰의 의미를 더 잘 표현하도록 학습 과정에서 조정(파인튜닝)됩니다.

PyTorch Example:

import torch

# Set a random seed for reproducibility
torch.manual_seed(123)

# Create an embedding layer with 6 tokens and 3 dimensions
embedding_layer = torch.nn.Embedding(6, 3)

# Display the initial weights (embeddings)
print(embedding_layer.weight)

원본 파일 src/AI/AI-llm-architecture/3.-token-embeddings.md의 내용이 제공되지 않았습니다. 번역하려는 해당 마크다운 내용을 붙여넣어 주시면, 요청하신 규칙(코드, 태그, 링크/경로 비번역 등)을 준수해 정확하게 한국어로 번역해 드리겠습니다.

luaCopy codeParameter containing:
tensor([[ 0.3374, -0.1778, -0.1690],
[ 0.9178,  1.5810,  1.3010],
[ 1.2753, -0.2010, -0.1606],
[-0.4015,  0.9666, -1.1481],
[-1.1589,  0.3255, -0.6315],
[-2.8400, -0.7849, -1.4096]], requires_grad=True)

설명:

  • 각 행은 어휘의 토큰에 해당합니다.
  • 각 열은 임베딩 벡터의 차원(dimension)을 나타냅니다.
  • 예를 들어, 인덱스 3의 토큰은 임베딩 벡터 [-0.4015, 0.9666, -1.1481]를 갖습니다.

토큰의 임베딩에 접근하기:

# Retrieve the embedding for the token at index 3
token_index = torch.tensor([3])
print(embedding_layer(token_index))

해당 파일의 원문 마크다운 내용을 여기에 붙여넣어 주세요. 내용을 받으면 요청하신 규칙(코드·태그·링크 비번역 등)을 지켜 한국어로 번역해 드리겠습니다.

tensor([[-0.4015,  0.9666, -1.1481]], grad_fn=<EmbeddingBackward0>)

해석:

  • 인덱스 3에 있는 토큰은 벡터 [-0.4015, 0.9666, -1.1481]로 표현된다.
  • 이 값들은 학습 중 모델이 토큰의 문맥과 의미를 더 잘 표현하도록 조정하는 학습 가능한 파라미터들이다.

학습 중 토큰 임베딩의 동작 방식

학습 동안 입력 데이터의 각 토큰은 해당 임베딩 벡터로 변환된다. 이 벡터들은 attention 메커니즘과 신경망 레이어와 같은 모델 내부의 다양한 계산에 사용된다.

예시 시나리오:

  • Batch Size: 8 (동시에 처리되는 샘플 수)
  • Max Sequence Length: 4 (샘플당 토큰 수)
  • Embedding Dimensions: 256

데이터 구조:

  • 각 배치는 형태가 (batch_size, max_length, embedding_dim)인 3D 텐서로 표현된다.
  • 예시의 경우 형태는 (8, 4, 256)가 된다.

시각화:

cssCopy codeBatch
┌─────────────┐
│ Sample 1    │
│ ┌─────┐     │
│ │Token│ → [x₁₁, x₁₂, ..., x₁₂₅₆]
│ │ 1   │     │
│ │...  │     │
│ │Token│     │
│ │ 4   │     │
│ └─────┘     │
│ Sample 2    │
│ ┌─────┐     │
│ │Token│ → [x₂₁, x₂₂, ..., x₂₂₅₆]
│ │ 1   │     │
│ │...  │     │
│ │Token│     │
│ │ 4   │     │
│ └─────┘     │
│ ...         │
│ Sample 8    │
│ ┌─────┐     │
│ │Token│ → [x₈₁, x₈₂, ..., x₈₂₅₆]
│ │ 1   │     │
│ │...  │     │
│ │Token│     │
│ │ 4   │     │
│ └─────┘     │
└─────────────┘

설명:

  • 시퀀스의 각 토큰은 256차원 벡터로 표현됩니다.
  • 모델은 이러한 임베딩을 처리하여 언어 패턴을 학습하고 예측을 생성합니다.

포지셔널 임베딩: 토큰 임베딩에 컨텍스트 추가

토큰 임베딩이 개별 토큰의 의미를 포착하지만, 시퀀스 내에서 토큰의 위치를 본질적으로 인코딩하지는 않습니다. 토큰의 순서를 이해하는 것은 언어 이해에 중요합니다. 바로 이때 포지셔널 임베딩이 필요합니다.

왜 포지셔널 임베딩이 필요한가:

  • 토큰 순서가 중요함: 문장에서는 의미가 종종 단어의 순서에 따라 달라집니다. 예: “The cat sat on the mat” vs. “The mat sat on the cat.”
  • 임베딩의 한계: 위치 정보 없이 모델은 토큰을 “bag of words“처럼 처리하여 순서를 무시합니다.

포지셔널 임베딩의 종류:

  1. 절대 포지셔널 임베딩:
  • 시퀀스의 각 위치에 고유한 위치 벡터를 할당합니다.
  • 예: 어떤 시퀀스에서든 첫 번째 토큰은 같은 포지셔널 임베딩을 가지며, 두 번째 토큰은 다른 임베딩을 가지는 식입니다.
  • Used By: OpenAI’s GPT models.
  1. 상대 포지셔널 임베딩:
  • 절대 위치 대신 토큰 간의 상대적 거리를 인코딩합니다.
  • 예: 두 토큰이 시퀀스 내에서 얼마나 떨어져 있는지를 절대 위치와 무관하게 나타냅니다.
  • Used By: Models like Transformer-XL and some variants of BERT.

포지셔널 임베딩의 통합 방법:

  • 차원 동일: 포지셔널 임베딩은 토큰 임베딩과 동일한 차원 수를 가집니다.
  • 덧셈: 토큰 임베딩에 더해져 토큰 정체성과 위치 정보를 결합하며 전체 차원 수를 늘리지 않습니다.

포지셔널 임베딩을 더한 예:

토큰 임베딩 벡터가 [0.5, -0.2, 0.1]이고 포지셔널 임베딩 벡터가 [0.1, 0.3, -0.1]이라고 가정하면, 모델에서 사용되는 결합 임베딩은 다음과 같습니다:

Combined Embedding = Token Embedding + Positional Embedding
= [0.5 + 0.1, -0.2 + 0.3, 0.1 + (-0.1)]
= [0.6, 0.1, 0.0]

포지셔널 임베딩의 장점:

  • 문맥 인식: 모델은 토큰을 위치에 따라 구별할 수 있다.
  • 시퀀스 이해: 문법, 구문, 문맥 의존적 의미를 이해할 수 있게 한다.

현대 LLM에서의 포지셔널 임베딩

Rotary Positional Embeddings (RoPE)

RoPE는 쿼리/키 벡터의 차원 쌍에 위치 의존적인 회전을 적용하여 위치를 인코딩하고, 절대 위치를 상대적 위상 차이로 바꿉니다. 이는 임베딩 차원을 변경하지 않으면서 상대적 위치 정보를 제공하며 최근의 디코더 전용(decoder-only) LLM들에서 널리 사용됩니다.

토큰과 위치 임베딩이 모델 내부에서 어떻게 결합되는지에 대해서는 the LLM architecture page을 참조하세요.

RoPE 기반 모델에서의 컨텍스트 윈도우 확장

최근 연구는 컨텍스트 길이가 종종 토큰 임베딩 행렬 자체보다 위치 인코딩 방식에 의해 제한된다는 것을 보여줍니다.

  • Position Interpolation (PI): 위치 인덱스를 재스케일하여 더 긴 시퀀스가 학습 중에 보였던 범위에 매핑되게 하며, 최소한의 미세조정으로 확장을 가능하게 합니다. 예:
# Position Interpolation (PI) intuition
orig_ctx = 2048
new_ctx = 8192
scaled_pos = pos * (orig_ctx / new_ctx)
  • YaRN: 연산 효율적인 RoPE 확장 전략으로, RoPE의 스케일링/보간을 수정하여 추가 학습 단계 수를 줄여 더 긴 컨텍스트로 외삽합니다.

Code Example

다음은 https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb:

# Use previous code...

# Create dimensional emdeddings
"""
BPE uses a vocabulary of 50257 words
Let's supose we want to use 256 dimensions (instead of the millions used by LLMs)
"""

vocab_size = 50257
output_dim = 256
token_embedding_layer = torch.nn.Embedding(vocab_size, output_dim)

## Generate the dataloader like before
max_length = 4
dataloader = create_dataloader_v1(
raw_text, batch_size=8, max_length=max_length,
stride=max_length, shuffle=False
)
data_iter = iter(dataloader)
inputs, targets = next(data_iter)

# Apply embeddings
token_embeddings = token_embedding_layer(inputs)
print(token_embeddings.shape)
torch.Size([8, 4, 256]) # 8 x 4 x 256

# Generate absolute embeddings
context_length = max_length
pos_embedding_layer = torch.nn.Embedding(context_length, output_dim)

pos_embeddings = pos_embedding_layer(torch.arange(max_length))

input_embeddings = token_embeddings + pos_embeddings
print(input_embeddings.shape) # torch.Size([8, 4, 256])

참고자료

Tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기