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

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

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

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

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

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)

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

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

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

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

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

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

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)

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

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
some-alt