Як створити синусоїдальне позиційне кодування
Свайпніть щоб показати меню
Синусоїдальне позиційне кодування дозволяє моделі трансформера враховувати порядок і позицію слів, навіть якщо вона не використовує рекурентність або шари, чутливі до послідовності. Кожна позиція представлена унікальним візерунком значень синуса і косинуса, розподілених по вимірах векторного представлення.
Розглянемо наведений нижче код.
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
- Отримана матриця містить унікальне кодування для кожної позиції у вашій послідовності.
- Це кодування можна додати до векторних представлень слів, щоб модель трансформера знала порядок токенів.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Як створити синусоїдальне позиційне кодування
Синусоїдальне позиційне кодування дозволяє моделі трансформера враховувати порядок і позицію слів, навіть якщо вона не використовує рекурентність або шари, чутливі до послідовності. Кожна позиція представлена унікальним візерунком значень синуса і косинуса, розподілених по вимірах векторного представлення.
Розглянемо наведений нижче код.
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
- Отримана матриця містить унікальне кодування для кожної позиції у вашій послідовності.
- Це кодування можна додати до векторних представлень слів, щоб модель трансформера знала порядок токенів.
Дякуємо за ваш відгук!