Все задачи
Средне Решено: 0 Процент решений: 0%

Синусоидальное позиционное кодирование

Вычислите синусные и косинусные векторы позиций, которые Transformer добавляет к эмбеддингам токенов.

Чему вы научитесь

  • Вычислять синусные и косинусные векторы позиций
  • Использовать разные частоты для разных измерений
  • Понять, как Transformer узнаёт порядок слов

Условие

Механизм внимания не учитывает порядок слов, поэтому оригинальный Transformer добавляет к эмбеддингу каждого токена позиционное кодирование. Для позиции pos и измерения j (оба с 0) в модели размера d_model:

  • 'чётное j: PE[pos][j] = sin(pos / 10000^(j / d_model))'
  • 'нечётное j: PE[pos][j] = cos(pos / 10000^((j - 1) / d_model))'

Так, измерения 0 и 1 имеют общую частоту, измерения 2 и 3 — следующую, и так далее.

Реализуйте positional_encoding(length, d_model).

Входные данные

length: Число позиций (от 0 до length - 1).

d_model: Размер эмбеддинга.

Выходные данные

Верните матрицу length × d_model.

Ограничения

1 ≤ length ≤ 200, 1 ≤ d_model ≤ 128

Примеры

Пример 1
Ввод:
length = 2
d_model = 4

Ожидаемый вывод:
expected = [
    [0.0, 1.0, 0.0, 1.0],
    [0.841471, 0.540302, 0.01, 0.99995]
]
Ввод:
long long length = 2;
long long d_model = 4;

Ожидаемый вывод:
std::vector<std::vector<double>> expected = {
    {0.0, 1.0, 0.0, 1.0},
    {0.841471, 0.540302, 0.01, 0.99995}
};
Ввод:
long length = 2;
long d_model = 4;

Ожидаемый вывод:
double[][] expected = new double[][] {
    new double[] {0.0, 1.0, 0.0, 1.0},
    new double[] {0.841471, 0.540302, 0.01, 0.99995}
};

Пояснение

Позиция 0 — это sin(0) = 0 и cos(0) = 1 для каждой пары: [0, 1, 0, 1]. Позиция 1 использует частоты 1 и 1 / 10000^(2/4) = 0.01: [sin 1, cos 1, sin 0.01, cos 0.01] ≈ [0.841471, 0.540302, 0.01, 0.99995].

Пример 2
Ввод:
length = 3
d_model = 1

Ожидаемый вывод:
expected = [
    [0.0],
    [0.841471],
    [0.909297]
]
Ввод:
long long length = 3;
long long d_model = 1;

Ожидаемый вывод:
std::vector<std::vector<double>> expected = {
    {0.0},
    {0.841471},
    {0.909297}
};
Ввод:
long length = 3;
long d_model = 1;

Ожидаемый вывод:
double[][] expected = new double[][] {
    new double[] {0.0},
    new double[] {0.841471},
    new double[] {0.909297}
};

Пояснение

При одном измерении используется только sin(pos): [[0], [0.841471], [0.909297]].

Ссылки

Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.

Учитесь у других

Решения сообщества

Пока нет опубликованных решений. Решите задание, чтобы поделиться первым.