Позиционное кодирование в Transformer

алгоритм

Это 28-й день моего участия в августовском испытании обновлений. Ознакомьтесь с подробностями мероприятия: Испытание августовского обновления

Недавно, когда я изучал структуру Transformer, я обнаружил, что позиционное кодирование в нем очень сложно для понимания, особенно формулы.

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

Причина использования позиционного встраивания также очень проста, потому что Transformer отказывается от структуры RNN, поэтому необходима вещь, чтобы отметить временные или позиционные отношения между каждым словом, и эта вещь — позиционное встраивание.

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

Если мы разрабатываем позиционное кодирование из 0, первый метод, о котором легче думать, — это взять число между [0, 1] и присвоить его каждому слову, где 0 — для первого слова, а 1 — для последнего слова. , Конкретная формулаPE=posT1PE=\frac{pos}{T-1}. Проблема в том, что предположим, что разница между любыми двумя кодами позиций слов в более коротком тексте составляет 0,0333, а в более длинном тексте также есть два кода позиций слов, отличающиеся на 0,0333. Предполагая, что в коротком тексте всего 30 слов, два слова в более коротком тексте на самом деле являются смежными; если предположить, что в общей сложности 90 слов в более длинном тексте, то два слова в более длинном тексте фактически разделены двумя символами слов. Это явно неуместно, потому что одно и то же различие не имеет одинакового значения в разных предложениях.

Другая идея состоит в том, чтобы присвоить номер каждому временному шагу линейно, то есть первому слову присваивается 1, второму слову присваивается 2 и так далее. Этот метод также имеет большие проблемы: 1. Он имеет большее значение, чем общее встраивание слов, что неизбежно украдет «свет» встраивания слов, что может в определенной степени мешать модели; 2. Последнее слово больше, чем первое слово Символы слишком велики, и неизбежно будет перекос в значении функции после объединения с встраиванием слова.

идеальный дизайн

В идеале конструкция позиционного встраивания должна удовлетворять следующим условиям:

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

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

Предполагатьttместо слова в предложении,ptеRd\vec{p_t} \in \mathbb{R}^dУказывает местоположениеttВектор положения слова, вложенного в данный момент,pt\vec{p_t}определяется следующим образом

pt(i)=f(t)(i):={sin(юk.t),if i=2kcos(юk.t),if i=2k+1\begin{aligned} \vec{p_t}^{(i)} = f(t)^{(i)} & := \begin{cases} \sin({\omega_k} . t), & \text{if}\ i = 2k \\ \cos({\omega_k} . t), & \text{if}\ i = 2k + 1 \end{cases} \end{aligned}

в

юk=1100002k/d\omega_k = \frac{1}{10000^{2k / d}}

kkОтносится к нижнему индексу измерения в позиционном встраивании. Чтобы включить позиционное вложение и встраивание слова, размерность позиционного вложения и размерность вложения слова должны быть одинаковыми, поэтомуiе[0,d)i\in [0, d), так что естьkе[0,d12]k\in [0, \frac{d-1}{2}]

для тригонометрических функцийy=Asin(Bx+C)+Dy=A\sin(Bx+C)+DНапример, период2число ПиB\frac{2\pi}{B}, частотаB2число Пи\frac{B}{2\pi}, поэтому чем больше B, тем больше значение частоты, тем больше повторений изображения функции в одном цикле и тем короче длина волны (если вы забыли математические знания здесь, вы можете прочитать этостатья)

назадpt\vec{p_t}В определении ,kkстановится больше, поэтомуwkw_kстановится все меньше и меньше, поэтомуwk2число Пи\frac{w_k}{2\pi}Он также становится все меньше и меньше, поэтому частота уменьшается по мере увеличения индекса размерности вектора, а частота уменьшается = период становится больше. Рассчитаем минимальный период2число Пи2\pi(k=0k=0время), максимум периода100002число Пи10000·2\pi(при условииk=d2k=\frac{d}{2}Время)

ты можешь представитьttкод позиции временного словаpt\vec{p_t}содержитsin\sinиcos\cosвектор функций (при условииddДелится на 2)

pt=[sin(ю0.t)cos(ю0.t)sin(ю1.t)cos(ю1.t)sin(юd21.t)cos(юd21.t)]d×1\vec{p_t} = \begin{bmatrix} \sin({\omega_0}.t)\\ \cos({\omega_0}.t)\\ \\ \sin({\omega_1}.t)\\ \cos({\omega_1}.t)\\ \\ \vdots\\ \\ \sin({\omega_{\frac{d}{2}-1}}.t)\\ \cos({\omega_{\frac{d}{2}-1}}.t) \end{bmatrix}_{d \times 1}

Визуальный дисплей

вам может быть интересноsin\sinиcos\cosКак комбинация s представляет информацию о местоположении? На самом деле это довольно просто, предположим, вы хотите представить число в двоичном виде, что бы вы сделали?

0:    0  0  0  08:    1  0  0  01:    0  0  0  19:    1  0  0  12:    0  0  1  02:    1  0  1  03:    0  0  1  111:    1  0  1  14:    0  1  0  012:    1  1  0  05:    0  1  0  113:    1  1  0  16:    0  1  1  014:    1  1  1  07:    0  1  1  115:    1  1  1  1\begin{aligned} 0: \ \ \ \ \color{orange}{\texttt{0}} \ \ \color{green}{\texttt{0}} \ \ \color{blue}{\texttt{0}} \ \ \color{red}{\texttt{0}} & & 8: \ \ \ \ \color{orange}{\texttt{1}} \ \ \color{green}{\texttt{0}} \ \ \color{blue}{\texttt{0}} \ \ \color{red}{\texttt{0}} \\ 1: \ \ \ \ \color{orange}{\texttt{0}} \ \ \color{green}{\texttt{0}} \ \ \color{blue}{\texttt{0}} \ \ \color{red}{\texttt{1}} & & 9: \ \ \ \ \color{orange}{\texttt{1}} \ \ \color{green}{\texttt{0}} \ \ \color{blue}{\texttt{0}} \ \ \color{red}{\texttt{1}} \\ 2: \ \ \ \ \color{orange}{\texttt{0}} \ \ \color{green}{\texttt{0}} \ \ \color{blue}{\texttt{1}} \ \ \color{red}{\texttt{0}} & & 2: \ \ \ \ \color{orange}{\texttt{1}} \ \ \color{green}{\texttt{0}} \ \ \color{blue}{\texttt{1}} \ \ \color{red}{\texttt{0}} \\ 3: \ \ \ \ \color{orange}{\texttt{0}} \ \ \color{green}{\texttt{0}} \ \ \color{blue}{\texttt{1}} \ \ \color{red}{\texttt{1}} & & 11: \ \ \ \ \color{orange}{\texttt{1}} \ \ \color{green}{\texttt{0}} \ \ \color{blue}{\texttt{1}} \ \ \color{red}{\texttt{1}} \\ 4: \ \ \ \ \color{orange}{\texttt{0}} \ \ \color{green}{\texttt{1}} \ \ \color{blue}{\texttt{0}} \ \ \color{red}{\texttt{0}} & & 12: \ \ \ \ \color{orange}{\texttt{1}} \ \ \color{green}{\texttt{1}} \ \ \color{blue}{\texttt{0}} \ \ \color{red}{\texttt{0}} \\ 5: \ \ \ \ \color{orange}{\texttt{0}} \ \ \color{green}{\texttt{1}} \ \ \color{blue}{\texttt{0}} \ \ \color{red}{\texttt{1}} & & 13: \ \ \ \ \color{orange}{\texttt{1}} \ \ \color{green}{\texttt{1}} \ \ \color{blue}{\texttt{0}} \ \ \color{red}{\texttt{1}} \\ 6: \ \ \ \ \color{orange}{\texttt{0}} \ \ \color{green}{\texttt{1}} \ \ \color{blue}{\texttt{1}} \ \ \color{red}{\texttt{0}} & & 14: \ \ \ \ \color{orange}{\texttt{1}} \ \ \color{green}{\texttt{1}} \ \ \color{blue}{\texttt{1}} \ \ \color{red}{\texttt{0}} \\ 7: \ \ \ \ \color{orange}{\texttt{0}} \ \ \color{green}{\texttt{1}} \ \ \color{blue}{\texttt{1}} \ \ \color{red}{\texttt{1}} & & 15: \ \ \ \ \color{orange}{\texttt{1}} \ \ \color{green}{\texttt{1}} \ \ \color{blue}{\texttt{1}} \ \ \color{red}{\texttt{1}} \\ \end{aligned}

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

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