# TokenEmbeddings - Векторные представления токенов

> **Документ актуален для Simple-LLM v1.0 (июль 2025)**

---

**Краткое summary:**
Документ описывает слой преобразования индексов токенов в плотные векторные представления (эмбеддинги). Включает алгоритм, пример использования, параметры и типовые ошибки.

---

**Структура документа:**
- Назначение
- Алгоритм работы
- Использование
- Параметры
- Особенности
- Типовые ошибки и их решения

---

## Назначение
Модуль `TokenEmbeddings` преобразует дискретные индексы токенов в плотные векторные представления (эмбеддинги). Это фундаментальный компонент большинства нейросетевых моделей для обработки естественного языка (NLP).

## Алгоритм работы

```mermaid
flowchart TD
    A[Начало] --> B[Инициализация таблицы эмбеддингов]
    B --> C[Получение индексов токенов]
    C --> D{Все ли индексы\nв пределах словаря?}
    D -->|Да| E[Поиск векторов в таблице]
    D -->|Нет| F[Ошибка: индекс вне словаря]
    E --> G[Возврат тензора эмбеддингов]
    G --> H[Обновление весов при обучении]
    H --> I[Конец]
    F --> I
```

1. **Инициализация**:
   - Создается таблица эмбеддингов размером `vocab_size x emb_size`
   - Каждая строка таблицы соответствует векторному представлению одного токена
   - Инициализация происходит случайным образом (обычно из нормального распределения)

2. **Преобразование токенов**:
   - На вход принимается тензор целых чисел (индексов токенов)
   - Для каждого индекса выполняется "lookup" в таблице эмбеддингов
   - Возвращается тензор векторных представлений

3. **Обучение**:
   - Веса эмбеддингов обновляются в процессе обучения модели
   - Сходные по значению токены получают близкие векторные представления

## Использование
```python
from simple_llm.embedding.token_embedings import TokenEmbeddings

# Инициализация
embedding_layer = TokenEmbeddings(
    vocab_size=10000,  # размер словаря
    emb_size=300       # размерность векторов
)

# Пример использования
tokens = torch.tensor([[1, 2, 3], [4, 5, 6]])  # индексы токенов
embeddings = embedding_layer(tokens)  # векторные представления
```

## Параметры
| Параметр   | Тип | Описание |
|------------|-----|----------|
| vocab_size | int | Размер словаря (количество уникальных токенов) |
| emb_size   | int | Размерность векторных представлений |

## Рекомендации
- Для больших словарей используйте размерность 256-1024
- При использовании предобученных эмбеддингов можно заморозить слой (embedding_layer.requires_grad_(False))
- Для обработки неизвестных токенов (OOV) резервируйте нулевой индекс

---

## Типовые ошибки и их решения

### Ошибка: Индекс токена вне диапазона словаря
**Возможные причины:**
- Входные индексы превышают vocab_size

**Решение:**
- Проверьте, что все индексы < vocab_size
- Добавьте обработку [UNK] токенов при необходимости

### Ошибка: Размерности не совпадают при сложении эмбеддингов с другими слоями
**Возможные причины:**
- emb_size не совпадает с размерностью других эмбеддингов

**Решение:**
- Приведите размерности к одному значению во всех слоях

### Ошибка: Эмбеддинги не обучаются
**Возможные причины:**
- Параметры слоя не добавлены в оптимизатор

**Решение:**
- Проверьте, что слой TokenEmbeddings включён в модель и его параметры передаются в оптимизатор

---

## Типичные сценарии использования
1. Первый слой в нейросетевых моделях NLP
2. Представление категориальных признаков
3. Создание плотных представлений для sparse данных

## Рекомендации
- Для больших словарей используйте размерность 256-1024
- При использовании предобученных эмбеддингов можно заморозить слой (embedding_layer.requires_grad_(False))
- Для обработки неизвестных токенов (OOV) резервируйте нулевой индекс