В языках порядок слов и их положение в предложении имеют значение. Если изменить порядок слов, смысл всего предложения изменится или предложение может стать бессмысленным после изменения порядка слов.

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

Начнем!

Что такое позиционное кодирование?

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

Здесь каждая позиция/индекс сопоставляется с вектором. Таким образом, выход слоя позиционного кодирования представляет собой матрицу, где каждая строка в матрице представляет собой закодированное слово в последовательности, суммированное с его позиционной информацией.

Пример матрицы, которая кодирует только позиционную информацию, показан на рисунке ниже.

Уровень позиционного кодирования в Transformers

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

d: размер выходного пространства для встраивания.

pos: позиция объекта во входной последовательности, 0 ≤ pos ≤ L/2.

i: используется для сопоставления с индексами столбцов 0≤i‹d/2. Одно значение I соответствует функциям синуса и косинуса.

В приведенном выше выражении мы видим, что четные позиции соответствуют функции синуса, а нечетные позиции соответствуют функции cos.

Кодирование матрицы позиционного кодирования с нуля

Вот короткий код Python для реализации позиционного кодирования с использованием NumPy. Код упрощен, чтобы облегчить понимание позиционного кодирования.

Визуализация позиционной матрицы

Давайте визуализируем позиционную матрицу на больших значениях. Мы будем использовать метод Python matshow() из библиотеки matplotlib. Установив n=10 000, как это сделано в исходной статье, мы получим следующее:

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

Написание собственного слоя позиционного кодирования в Keras

Раздел импорта:

Во-первых, давайте напишем раздел для импорта всех необходимых библиотек.

Токенизация:

В следующем фрагменте кода объект Tokenizer используется для преобразования каждого текста в последовательность целых чисел (каждое целое число является индексом токена в словаре).

Подкласс слоя внедрения Keras:

При реализации модели трансформатора вам придется написать свой собственный слой кодирования положения. Этот пример Keras показывает, как вы можете создать подкласс слоя Embedding для реализации собственной функциональности.

Использованная литература :