Что такое sequence padding и зачем он нужен?
Sequence padding (дополнение последовательностей) — это техника, используемая в задачах обработки последовательных данных (особенно в NLP и временных рядах), чтобы привести все последовательности к одной и той же длине. Это необходимо, потому что большинство моделей машинного обучения (особенно нейросети) ожидают на вход матрицу фиксированной формы, а не список переменной длины.
Почему возникает проблема?
Последовательности, с которыми мы работаем в NLP, обычно имеют разную длину:
sent1 = \["I", "like", "cats"\]
sent2 = \["He", "loves", "reading", "books", "every", "day"\]
Первая последовательность — длиной 3, вторая — длиной 6. Если мы хотим подать это в нейронную сеть, то нужно представить это как одну матрицу размером (batch_size, sequence_length). Для этого нужно сделать все строки одинаковой длины.
Что такое padding?
Padding — это добавление специальных "пустых" значений (обычно нулей) к последовательности до определённой длины.
Например:
\# max_len = 6
\["I", "like", "cats"\] → \["I", "like", "cats", 0, 0, 0\]
\["He", "loves", "reading", "books", "every", "day"\] → остаётся без изменений
Это позволяет нам получить однородную матрицу:
\[
\["I", "like", "cats", 0, 0, 0 \],
\["He", "loves", "reading", "books", "every", "day"\]
\]
Обычно padding добавляется в начале (pre-padding) или в конце (post-padding). Способ выбирается в зависимости от модели (например, для RNN может быть удобнее pre-padding, а для CNN — post-padding).
Зачем нужен padding?
-
Унификация размера:
-
Нейронные сети не могут работать с разными длинами входов в одном батче.
-
Без padding мы не сможем сформировать одну входную тензорную матрицу для батча.
-
-
Эффективная обработка батчей:
- Благодаря padding можно применять параллельную обработку на GPU.
-
Стабильное обучение:
- Если батчи будут иметь одинаковую форму, обучение модели будет проще и быстрее.
Использование в библиотеках
Пример с Keras:
from tensorflow.keras.preprocessing.sequence import pad_sequences
sequences = \[\[1, 2, 3\], \[4, 5, 6, 7, 8\]\]
padded = pad_sequences(sequences, maxlen=6, padding='post', truncating='post', value=0)
Результат:
[[1 2 3 0 0 0]
[4 5 6 7 8 0]]
Параметры:
-
maxlen — до какой длины приводим последовательности.
-
padding='post' — добавляем padding в конец. pre — в начало.
-
truncating — если последовательность длиннее maxlen, обрезаем спереди (pre) или сзади (post).
-
value — что использовать в качестве паддинга (обычно 0).
Как модели обрабатывают padding?
Большинство современных моделей умеют игнорировать padding при обучении, благодаря masking.
Masking:
Это техника, позволяющая модели понимать, какие элементы в последовательности являются паддингом и не учитывать их при обучении или расчёте потерь.
Пример:
Если padded-последовательность:
\["I", "like", "cats", 0, 0, 0\]
То mask будет:
[1, 1, 1, 0, 0, 0]
В Keras:
from tensorflow.keras.layers import Embedding, LSTM
model = Sequential()
model.add(Embedding(input_dim=10000, output_dim=64, mask_zero=True)) # mask_zero=True включает маскирование паддингов
model.add(LSTM(64))
В трансформерах (например, в BERT, GPT) padding тоже маскируется с помощью attention mask — бинарного вектора, указывающего, какие токены обрабатывать, а какие — игнорировать.
Последствия неправильного использования padding
-
Невключение маскировки может привести к тому, что модель начнёт "учиться" на паддингах — что приведёт к деградации качества.
-
Неправильная длина padding'а (слишком большая maxlen) увеличивает вычислительные затраты без пользы.
-
Слишком маленькая maxlen приведёт к усечению важных токенов и потере информации.
Padding и скорость обучения
Если в батче есть одна длинная последовательность, а остальные короткие, то вся матрица будет дополняться до максимальной длины. Это приводит к зря потраченным вычислениям на паддинговые токены. Решения:
-
Использовать bucketed batching (группировка по длине).
-
Сортировать по длине и использовать pack_padded_sequence (в PyTorch).
-
Использовать динамическую длину последовательностей (некоторые модели поддерживают).
Альтернативы padding
-
Truncated BPTT (Backprop Through Time):
- Применяется в RNN: модель "забывает" паддинг при обучении с помощью обрезки градиентов.
-
Transformer-модели с attention masks:
- Не полагаются на padding напрямую, а используют маски внимания для точного контроля.
-
Packed sequences (PyTorch):
- Используется pack_padded_sequence для эффективной работы с последовательностями переменной длины, избегая пустых токенов.
Применение за пределами NLP
Padding используется не только в NLP, но и в:
-
временных рядах (финансовые данные, датчики)
-
обработке жестов и **видео
** - **музыкальных последовательностях
** - **сериях кликов в рекомендательных системах
**
Во всех этих случаях последовательности могут иметь переменную длину, и padding помогает обрабатывать их пакетно.
Sequence padding — фундаментальная операция в работе с последовательностями, обеспечивающая структурную совместимость с нейронными сетями и стабильность при обучении и инференсе.