Позиционные числа в TensorFlow
У позиционных чисел для каждого номера шага заранее считают строку из синусов и косинусов разной частоты. Эту строку прибавляют к вектору шага, и модель различает первый, второй и следующие места в цепочке, даже если сами признаки совпадают.
Для каждой позиции берут её номер и для каждой пары соседних осей считают угол через степень десяти тысяч. Чётные индексы заполняют синусом, нечётные - косинусом. Соберём таблицу на четыре шага и шесть осей и выведем её форму:
import tensorflow as tf
length = 4
depth = 6
position = tf.range(length, dtype=tf.float32)[:, tf.newaxis]
i = tf.range(depth, dtype=tf.float32)[tf.newaxis, :]
angle_rates = 1 / tf.pow(
10000.0, (2 * (i // 2)) / tf.cast(depth, tf.float32))
angle_rads = position * angle_rates
sines = tf.sin(angle_rads[:, 0::2])
cosines = tf.cos(angle_rads[:, 1::2])
encoding = tf.reshape(
tf.stack([sines, cosines], axis=-1), (length, depth))
print(encoding.shape)
# выведет (4, 6)
Первый шаг в таблице соответствует нулевому номеру и даёт простой чередующийся ряд. Дальше углы растут вместе с номером позиции. Прибавим таблицу к векторам двух шагов в одной партии:
import tensorflow as tf
length = 4
depth = 6
position = tf.range(length, dtype=tf.float32)[:, tf.newaxis]
i = tf.range(depth, dtype=tf.float32)[tf.newaxis, :]
angle_rates = 1 / tf.pow(
10000.0, (2 * (i // 2)) / tf.cast(depth, tf.float32))
angle_rads = position * angle_rates
sines = tf.sin(angle_rads[:, 0::2])
cosines = tf.cos(angle_rads[:, 1::2])
encoding = tf.reshape(
tf.stack([sines, cosines], axis=-1), (length, depth))
batch = tf.constant([[[1., 0., 1., 0., 1., 0.],
[0., 1., 0., 1., 0., 1.]]])
marked = batch + encoding[:2][tf.newaxis, :, :]
print(marked.shape)
# выведет (1, 2, 6)
Постройте таблицу позиций на пять шагов и восемь осей. Выведите форму полученного тензора.
Создайте векторы трёх шагов с длиной шесть в одной партии. Прибавьте к ним первые три строки таблицы для четырёх шагов и шести осей и выведите форму суммы.
Для шести позиций и четырёх осей
соберите таблицу синусов
и косинусов. Выведите длину
вектора для шага с номером
2.