mirror of
https://github.com/pese-git/simple-llm.git
synced 2026-01-23 21:14:17 +00:00
116 lines
5.9 KiB
Markdown
116 lines
5.9 KiB
Markdown
# 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) резервируйте нулевой индекс |