mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
204 lines
12 KiB
Markdown
204 lines
12 KiB
Markdown
# 3. Token Embeddings
|
||
|
||
## Token Embeddings
|
||
|
||
Після токенізації текстових даних наступним критичним кроком у підготовці даних для навчання великих мовних моделей (LLMs), таких як GPT, є створення **token embeddings**. Token embeddings перетворюють дискретні токени (такі як слова або підслова) у безперервні числові вектори, які модель може обробляти та вчитися з них. Це пояснення розкриває токенові вектори, їх ініціалізацію, використання та роль позиційних векторів у покращенні розуміння моделі послідовностей токенів.
|
||
|
||
> [!TIP]
|
||
> Мета цього третього етапу дуже проста: **Призначити кожному з попередніх токенів у словнику вектор бажаних розмірів для навчання моделі.** Кожне слово в словнику буде точкою в просторі X вимірів.\
|
||
> Зверніть увагу, що спочатку позиція кожного слова в просторі просто ініціалізується "випадковим чином", і ці позиції є параметрами, що підлягають навчання (будуть покращені під час навчання).
|
||
>
|
||
> Більше того, під час створення токенових векторів **створюється ще один шар векторів**, який представляє (в цьому випадку) **абсолютну позицію слова в навчальному реченні**. Таким чином, слово в різних позиціях у реченні матиме різне представлення (значення).
|
||
|
||
### **What Are Token Embeddings?**
|
||
|
||
**Token Embeddings** — це числові представлення токенів у безперервному векторному просторі. Кожен токен у словнику асоціюється з унікальним вектором фіксованих розмірів. Ці вектори захоплюють семантичну та синтаксичну інформацію про токени, що дозволяє моделі розуміти відносини та шаблони в даних.
|
||
|
||
- **Vocabulary Size:** Загальна кількість унікальних токенів (наприклад, слів, підслів) у словнику моделі.
|
||
- **Embedding Dimensions:** Кількість числових значень (вимірів) у векторі кожного токена. Вищі виміри можуть захоплювати більш тонку інформацію, але вимагають більше обчислювальних ресурсів.
|
||
|
||
**Example:**
|
||
|
||
- **Vocabulary Size:** 6 tokens \[1, 2, 3, 4, 5, 6]
|
||
- **Embedding Dimensions:** 3 (x, y, z)
|
||
|
||
### **Initializing Token Embeddings**
|
||
|
||
На початку навчання токенові вектори зазвичай ініціалізуються з малими випадковими значеннями. Ці початкові значення коригуються (доладно налаштовуються) під час навчання, щоб краще представляти значення токенів на основі навчальних даних.
|
||
|
||
**PyTorch Example:**
|
||
```python
|
||
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)
|
||
```
|
||
**Вихід:**
|
||
```lua
|
||
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)
|
||
```
|
||
**Пояснення:**
|
||
|
||
- Кожен рядок відповідає токену у словнику.
|
||
- Кожен стовпець представляє вимір у векторі вбудовування.
|
||
- Наприклад, токен з індексом `3` має вектор вбудовування `[-0.4015, 0.9666, -1.1481]`.
|
||
|
||
**Доступ до вбудовування токена:**
|
||
```python
|
||
# Retrieve the embedding for the token at index 3
|
||
token_index = torch.tensor([3])
|
||
print(embedding_layer(token_index))
|
||
```
|
||
**Вихід:**
|
||
```lua
|
||
tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=<EmbeddingBackward0>)
|
||
```
|
||
**Інтерпретація:**
|
||
|
||
- Токен з індексом `3` представлений вектором `[-0.4015, 0.9666, -1.1481]`.
|
||
- Ці значення є навчальними параметрами, які модель буде коригувати під час навчання, щоб краще відобразити контекст і значення токена.
|
||
|
||
### **Як працюють токенні вбудування під час навчання**
|
||
|
||
Під час навчання кожен токен у вхідних даних перетворюється на відповідний вектор вбудування. Ці вектори потім використовуються в різних обчисленнях у моделі, таких як механізми уваги та шари нейронних мереж.
|
||
|
||
**Приклад сценарію:**
|
||
|
||
- **Розмір партії:** 8 (кількість зразків, що обробляються одночасно)
|
||
- **Максимальна довжина послідовності:** 4 (кількість токенів на зразок)
|
||
- **Розміри вбудування:** 256
|
||
|
||
**Структура даних:**
|
||
|
||
- Кожна партія представлена як 3D тензор з формою `(batch_size, max_length, embedding_dim)`.
|
||
- Для нашого прикладу форма буде `(8, 4, 256)`.
|
||
|
||
**Візуалізація:**
|
||
```css
|
||
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-вимірним вектором.
|
||
- Модель обробляє ці вектори для вивчення мовних патернів і генерації прогнозів.
|
||
|
||
## **Позиційні Вектори: Додавання Контексту до Токенів**
|
||
|
||
Хоча токенові вектори захоплюють значення окремих токенів, вони не закодовані за замовчуванням для позиції токенів у послідовності. Розуміння порядку токенів є критично важливим для розуміння мови. Тут на допомогу приходять **позиційні вектори**.
|
||
|
||
### **Чому Потрібні Позиційні Вектори:**
|
||
|
||
- **Порядок Токенів Має Значення:** У реченнях значення часто залежить від порядку слів. Наприклад, "Кіт сидів на килимку" проти "Килимок сидів на коті."
|
||
- **Обмеження Векторів:** Без позиційної інформації модель розглядає токени як "мішок слів", ігноруючи їх послідовність.
|
||
|
||
### **Типи Позиційних Векторів:**
|
||
|
||
1. **Абсолютні Позиційні Вектори:**
|
||
- Призначають унікальний вектор позиції для кожної позиції в послідовності.
|
||
- **Приклад:** Перший токен у будь-якій послідовності має один і той же позиційний вектор, другий токен має інший, і так далі.
|
||
- **Використовується:** Моделями GPT від OpenAI.
|
||
2. **Відносні Позиційні Вектори:**
|
||
- Кодують відносну відстань між токенами, а не їх абсолютні позиції.
|
||
- **Приклад:** Вказують, наскільки далеко один токен від іншого, незалежно від їх абсолютних позицій у послідовності.
|
||
- **Використовується:** Моделями, такими як Transformer-XL та деякими варіантами BERT.
|
||
|
||
### **Як Інтегруються Позиційні Вектори:**
|
||
|
||
- **Ті ж Розміри:** Позиційні вектори мають таку ж розмірність, як токенові вектори.
|
||
- **Додавання:** Вони додаються до токенових векторів, поєднуючи ідентичність токена з позиційною інформацією без збільшення загальної розмірності.
|
||
|
||
**Приклад Додавання Позиційних Векторів:**
|
||
|
||
Припустимо, вектор токену є `[0.5, -0.2, 0.1]`, а його позиційний вектор є `[0.1, 0.3, -0.1]`. Об'єднаний вектор, що використовується моделлю, буде:
|
||
```css
|
||
Combined Embedding = Token Embedding + Positional Embedding
|
||
= [0.5 + 0.1, -0.2 + 0.3, 0.1 + (-0.1)]
|
||
= [0.6, 0.1, 0.0]
|
||
```
|
||
**Переваги позиційних векторів:**
|
||
|
||
- **Контекстуальна обізнаність:** Модель може розрізняти токени на основі їхніх позицій.
|
||
- **Розуміння послідовності:** Дозволяє моделі розуміти граматику, синтаксис та значення, що залежать від контексту.
|
||
|
||
## Код приклад
|
||
|
||
Наступний код приклад з [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb):
|
||
```python
|
||
# 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])
|
||
```
|
||
## Посилання
|
||
|
||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|