Детали реализации позиционного кодирования в модели трансформатора?

Как именно рассчитывается эта позиционная кодировка?

Предположим, что это сценарий машинного перевода, и это входные предложения,

english_text = [this is good, this is bad]
german_text = [das ist gut, das ist schlecht]

Теперь размер нашего входного словаря равен 4, а размер встраивания равен 4.

#words     #embeddings
this     - [0.5, 0.2, 0.3, 0.1]
is       - [0.1, 0.2, 0.5, 0.1]
good     - [0.9, 0.7, 0.9, 0.1]
bad      - [0.7, 0.3, 0.4, 0.1]

В соответствии с инструкциями по преобразованию мы добавляем кодировку позиции каждого слова с встраиванием каждого слова, а затем передаем ее кодировщику, как показано на изображении ниже.

внимание - это все, что вам нужно

Что касается бумаги, они дали эту формулу для расчета кодировки позиции каждого слова, информационный бюллетень

Итак, вот как, я думаю, я могу это реализовать:

d_model = 4 # Embedding dimension

positional_embeddings = np.zeros((max_sentence_length, d_model))

max_sentence_length = 3 # as per my examples above

for position in range(maximum_sentence_length):
    for i in range(0, d_model, 2):
       positional_embeddings[position, i] = (
                                          sin(position / (10000 ** ( (2*i) / d_model) ) )
                                            )
       positional_embeddings[position, i + 1] = (
                                              cos(position / (10000 ** ( (2 * (i + 1) ) / d_model) ) )
                                                )

Тогда новый вектор вложения будет

[[0.5, 0.2, 0.3, 0.1], 
 [0.1, 0.2, 0.5, 0.1], 
 [0.9, 0.7, 0.9, 0.1]] + positional_embeddings = NEW EMBEDDINGS

 ## shapes
  3 x 4                + 3 x 4                 = 3 x 4     

Так будет производиться расчет в реализации? Исправьте меня, если в моей псевдо-реализации есть ошибка.

Если все верно, то у меня есть три сомнения, надеюсь, кто-то сможет их устранить,

1) Из приведенной выше реализации мы используем формулу sin для четных позиций и формулу cos для нечетных позиций, но я не мог понять причину этого? Я читал, что он использует циклические свойства, но не мог этого понять.

2) Есть ли причина для выбора 10000/(2i/d) или 10000/(2i+1/d) в качестве коэффициента масштабирования в формуле.

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


person Sai Kumar    schedule 01.05.2020    source источник


Ответы (1)


Ваша реализация в основном верна. Типичная реализация - это предварительное вычисление матрицы внедрения, создание необучаемого слоя внедрения и выполнение поиска по диапазону внедрения. См., Например, реализация в HuggingFaces.

Некоторые подсказки об интуиции, лежащей в основе уравнений, можно найти в этих обсуждениях:

Но мне кажется, что почти все решения о кодировании позиции были эмпирическими.

Под циклическими свойствами они, ИМХО, означают, что с учетом размерности встраивания разница значений встраивания между позициями с постоянным смещением одинакова независимо от позиции в последовательности. Для этого может быть достаточно использования только синуса или косинуса, но некоторые позиции будут иметь гораздо большую норму, чем другие, поэтому они чередуют синус и косинус.

Я думаю, что коэффициенты масштабирования рассчитаны эмпирически, чтобы покрыть обычную длину предложений.

С заполнением вы действительно учитываете также позиционное кодирование заполненных позиций, но поскольку они предварительно вычисляются, это означает более высокую вычислительную нагрузку, потому что вы в любом случае получаете вложения для символов заполнения.

person Jindřich    schedule 04.05.2020
comment
В последнем предложении, разве вы не имеете в виду, что это не означает более высокую вычислительную нагрузку? - person LouisB; 14.01.2021