Что такое 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?

  1. Унификация размера:

    • Нейронные сети не могут работать с разными длинами входов в одном батче.

    • Без padding мы не сможем сформировать одну входную тензорную матрицу для батча.

  2. Эффективная обработка батчей:

    • Благодаря padding можно применять параллельную обработку на GPU.
  3. Стабильное обучение:

    • Если батчи будут иметь одинаковую форму, обучение модели будет проще и быстрее.

Использование в библиотеках

Пример с 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

  1. Truncated BPTT (Backprop Through Time):

    • Применяется в RNN: модель "забывает" паддинг при обучении с помощью обрезки градиентов.
  2. Transformer-модели с attention masks:

    • Не полагаются на padding напрямую, а используют маски внимания для точного контроля.
  3. Packed sequences (PyTorch):

    • Используется pack_padded_sequence для эффективной работы с последовательностями переменной длины, избегая пустых токенов.

Применение за пределами NLP

Padding используется не только в NLP, но и в:

  • временных рядах (финансовые данные, датчики)

  • обработке жестов и **видео
    **

  • **музыкальных последовательностях
    **
  • **сериях кликов в рекомендательных системах
    **

Во всех этих случаях последовательности могут иметь переменную длину, и padding помогает обрабатывать их пакетно.

Sequence padding — фундаментальная операция в работе с последовательностями, обеспечивающая структурную совместимость с нейронными сетями и стабильность при обучении и инференсе.