Детали реализации позиционного кодирования в модели трансформатора? - PullRequest
0 голосов
/ 02 мая 2020

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

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

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]

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

attention is all you need

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

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

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 для нечетных позиций, но я не мог понять причину этого? Я читал, что он использует свойства cycli c, но не может его понять.

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

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

1 Ответ

1 голос
/ 04 мая 2020

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

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

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

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

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

...