Понимание ML

Понимание позиционного кодирования в трансформаторах

Визуализация метода позиционного кодирования из моделей Transformer.

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

Как я объяснял в Введение в механизм внимания, внимание не заботит положение входных данных. Чтобы решить эту проблему, мы должны ввести так называемое позиционное кодирование. Эта кодировка описана в оригинальном документе Внимание - все, что вам нужно и добавляется к каждому входу (не объединяется, а добавляется).

В статье рассматривается только фиксированное (не обучаемое) позиционное кодирование, и это то, что я собираюсь объяснить. Сейчас кодировки обучаются вместе с моделью, но для этого требуется отдельная статья. Чтобы рассчитать значение позиционного кодирования, нам нужно перейти к разделу 3.5 статьи. Авторы используют функции sin и cos для вычисления значения для каждого входного вектора.

Как видите, эти значения зависят от d_ {model} (входное измерение) и i i (индекс вектора положения). Исходная статья оперирует 512-мерными векторами, но для простоты я буду использовать d_ {model} = 50 или d_ {model} = 20. Авторы также приложили комментарий о том, почему они выбрали именно такую ​​функцию:

Мы выбрали эту функцию, потому что предположили, что она позволит модели легко научиться присутствовать по относительным позициям, поскольку для любого фиксированного смещения k PE_ {pos + k} может быть представлен как линейная функция от PE_ {pos} .

Визуализация позиционного кодирования

Примечание
Это просто экран из исходной диаграммы, к сожалению, я не могу включить часть приложения на Medium. Если вы хотите поиграть с ним, перейдите прямо на https://erdem.pl/2021/05/understanding-positional-encoding-in-transformers#positional-encoding-visualization

Ценности

Мы рассчитываем значение для каждого индекса, используя формулу для данного индекса. Обратите внимание, что значение 2 i в функции cos является четным числом, поэтому для вычисления значений для 0-го и 1-го индексов мы будем использовать:

Вот почему значения для 0-го и 1-го индексов зависят только от значения pos, а не от pos и d_ {model} dmodel. Это изменяется со 2-го индекса и далее, потому что дивиденд больше не равен 0, поэтому весь делитель больше 1.

Зависимость от размеров

Если вы переключитесь на второй шаг, вы сможете сравнить, как изменение значения PE зависит от d_ {model}.

Период первых двух индексов не меняется с изменением d_ {model}, но период последующих индексов (2-й и выше) расширяется с уменьшением d_ {model} . Это может быть очевидно, но все же приятно видеть разницу.

Функциональные периоды

Когда мы наносим на график значения PE для первых 20 векторов pos, мы получаем следующий результат:

Этот график создан на основе одного из Руководств Tensorflow, и вы можете запустить его с помощью Google Colab прямо с их веб-сайта. Как видите, меньшие размеры вектора положения имеют очень короткую длину волны (расстояние между идентичными точками). Длина волны функции при индексе i = 6 имеет длину волны около 19 (2 * 10 ^ {12/25}).

Мы знаем, что периоды увеличиваются с увеличением i. Когда i достигает стороны d_ {model}, вам понадобится много векторов pos, чтобы покрыть весь период действия.

Значения первых 20 позиций по высшим индексам практически постоянны. То же самое можно увидеть на рис. 4, где цвет столбцов 30–50 существенно изменился. Чтобы увидеть это изменение, мы должны построить значения для десятков тысяч позиций:

Предупреждение. Этот график имеет встроенную иллюзию, на самом деле это не иллюзия, но поскольку он пытается напечатать 40k + значений на 670 пикселей (высота), он не может показать правильное значение чего-либо с меньшей длиной волны чем 1px. Вот почему все, что до столбца 24, визуально некорректно, даже если для построения этого графика использовались правильные значения.

Выводы

Позиционные вложения нужны, чтобы дать преобразователю информацию о положении входных векторов. Они добавляются (не объединяются) к соответствующим входным векторам. Кодировка зависит от трех значений:

  • pos - положение вектора
  • i - индекс внутри вектора
  • d_ {модель} - размер входа

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

Это всего лишь один из способов позиционного кодирования. В текущих моделях SOTA кодировщики обучаются вместе с моделью вместо использования предопределенных функций. Авторы даже упомянули этот вариант в статье, но не заметили разницы в результатах:

Мы также экспериментировали с использованием выученных позиционных встраиваний вместо этого и обнаружили, что две версии дали почти идентичные результаты (см. строку таблицы 3 (E)). Мы выбрали синусоидальную версию, потому что она может позволить экстраполировать модель на длины последовательностей, превышающие те, которые встречаются во время обучения.

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

Первоначально опубликовано на https://erdem.pl.