Як створити синусоїдальне позиційне кодування
Свайпніть щоб показати меню
Синусоїдальне позиційне кодування дозволяє моделі трансформера враховувати порядок і позицію слів, навіть якщо вона не використовує рекурентність або шари, чутливі до послідовності. Кожна позиція представлена унікальним візерунком значень синуса і косинуса, розподілених по вимірах векторного представлення.
Розглянемо наведений нижче код.
1234567891011121314151617import numpy as np def get_sinusoidal_positional_encoding(seq_length, embed_dim): position = np.arange(seq_length)[:, np.newaxis] div_term = np.exp( np.arange(0, embed_dim, 2) * -(np.log(10000.0) / embed_dim) ) pe = np.zeros((seq_length, embed_dim)) pe[:, 0::2] = np.sin(position * div_term) pe[:, 1::2] = np.cos(position * div_term) return pe # Example usage: seq_length = 6 embed_dim = 8 encoding = get_sinusoidal_positional_encoding(seq_length, embed_dim) print(encoding)
Код для генерації синусоїдального позиційного кодування можна розібрати по кроках:
1. Створення масиву позицій
position = np.arange(seq_length)[:, np.newaxis]
- Створюється вектор-стовпець, де кожен рядок відповідає позиції у вхідній послідовності, починаючи з 0.
- Якщо у вашій послідовності шість токенів, цей масив виглядатиме як
[0, 1, 2, 3, 4, 5]у вигляді стовпця.
2. Обчислення коефіцієнта масштабування частоти
div_term = np.exp(
np.arange(0, embed_dim, 2) * -(np.log(10000.0) / embed_dim)
)
- Обчислюється коефіцієнт масштабування для кожного парного виміру векторного представлення.
- Масштабування забезпечує різну частоту для кожного виміру, що дозволяє кодуванню враховувати як коротко-, так і довгострокові позиційні шаблони.
- Використання
10000.0розтягує частоти, тому зміни позиції по-різному впливають на кожен вимір.
3. Ініціалізація матриці позиційного кодування
pe = np.zeros((seq_length, embed_dim))
- Створюється матриця, заповнена нулями, де кожен рядок відповідає позиції, а кожен стовпець — виміру векторного представлення.
4. Заповнення матриці значеннями синуса і косинуса
pe[:, 0::2] = np.sin(position * div_term)
pe[:, 1::2] = np.cos(position * div_term)
- Парні стовпці заповнюються значеннями синуса від
position * div_term. - Непарні стовпці заповнюються значеннями косинуса від
position * div_term. - Така черговість забезпечує унікальну комбінацію значень для кожної позиції, а візерунок плавно змінюється по позиціях і вимірах.
5. Повернення позиційного кодування
return pe
- Отримана матриця містить унікальне кодування для кожної позиції у вашій послідовності.
- Це кодування можна додати до векторних представлень слів, щоб модель трансформера знала порядок токенів.
Все було зрозуміло?
Дякуємо за ваш відгук!
Секція 1. Розділ 7
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Секція 1. Розділ 7