Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Як створити синусоїдальне позиційне кодування | Основи Розуміння Transformer
Трансформери для обробки природної мови

bookЯк створити синусоїдальне позиційне кодування

Свайпніть щоб показати меню

Синусоїдальне позиційне кодування дозволяє моделі трансформера враховувати порядок і позицію слів, навіть якщо вона не використовує рекурентність або шари, чутливі до послідовності. Кожна позиція представлена унікальним візерунком значень синуса і косинуса, розподілених по вимірах векторного представлення.

Розглянемо наведений нижче код.

1234567891011121314151617
import 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)
copy

Код для генерації синусоїдального позиційного кодування можна розібрати по кроках:

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
  • Отримана матриця містить унікальне кодування для кожної позиції у вашій послідовності.
  • Це кодування можна додати до векторних представлень слів, щоб модель трансформера знала порядок токенів.
question mark

Які з наступних тверджень про синусоїдальне позиційне кодування є правильними?

Виберіть усі правильні відповіді

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 1. Розділ 7

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Секція 1. Розділ 7
some-alt