Яке позиційне кодування в моделі трансформаторів?


23

Я новачок в ML, і це моє перше запитання тут, так що вибачте, якщо моє питання нерозумно.

Я намагаюся прочитати та зрозуміти статтю Увага. Все, що вам потрібно, і в ній є малюнок:

введіть тут опис зображення

Я не знаю, що таке кодування позицій . прослухавши кілька відео на YouTube, я виявив, що це вбудовування, яке має як значення, так і положення слова в ньому і має щось спільне з абосiн(х)cос(х)

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

Відповіді:


31

Наприклад, для слова у позиції у вхідній послідовності , з вбудованим 4-мірним , а , операцією буде шpос[0,L-1]ш=(ш0,,шL-1)ешгмогел=4

еш'=еш+[сiн(pос100000),cос(pос100000),сiн(pос100002/4),cос(pос100002/4)]=еш+[сiн(pос),cос(pос),сiн(pос100),cос(pос100)]

де формула позиційного кодування наступна з (таким чином, ) в оригінальному документі.

ПЕ(pос,2i)=сiн(pос100002i/гмогел),
ПЕ(pос,2i+1)=cос(pос100002i/гмогел).
гмогел=512i[0,255]

Цей прийом використовується тому, що в запропонованій архітектурі немає поняття про порядок слів (1-е слово, 2-е слово, ..). Усі слова вхідної послідовності подаються в мережу без особливого порядку або положення (на відміну від звичайних архітектур RNN або ConvNet), таким чином модель не має уявлення про те, як впорядковані слова. Отже, сигнал, який залежить від позиції, додається до кожного вбудовування слів, щоб допомогти моделі включити порядок слів. На основі експериментів, це доповнення не тільки уникає руйнування вбудованої інформації, але й додає важливу інформацію про положення. У випадку з RNN ми подаємо слова послідовно RNN, тобто -те слово подається на етапі , що допомагає моделі включити порядок слів.нн

Ця стаття Джея Аламмара пояснює статтю чудовою візуалізацією. На жаль, його приклад позиційного кодування на даний момент є некоректним (він використовує для першої половини вбудовування розмірів і для другої половини, замість того, щоб використовувати для парних індексів і для непарних індексів).сiнcоссiнcос


1
У вас також є ця чудова стаття, суто орієнтована на вкладення позицій: kazemnejad.com/blog/…
Йохан Обадія

6

Позиційне кодування - це повторне представлення значень слова та його положення у реченні (з огляду на те, що не те саме бути на початку, що в кінці чи середині).

Але ви повинні врахувати, що речення можуть бути будь-якої тривалості, тому сказати слово "" X "є третім у реченні" не має сенсу, якщо є речення різної довжини: 3-е у 3-словому реченні повністю відмінні від 3-го у 20-словому реченні.

Позиційний кодер - це допомогти циклічному характеру функцій та для повернення інформації про положення слова в реченні.сiн(х)cос(х)


2
Дякую тобі. Ви могли б детальніше пояснити, як цей позиційний кодер робить це з і ? сiнcос
Пейман

1

Щоб додати до інших відповідей, реалізація посилань OpenAI обчислює його в природному просторі журналу (я думаю, що для підвищення точності, я думаю. Не впевнений, чи могли вони використовувати лог у базі 2). Вони не придумали кодування. Ось генерація таблиці пошуку PE, переписана на C як цикл for-for:

int d_model = 512, max_len = 5000;
double pe[max_len][d_model];

for (int i = 0; i < max_len; i++) {
   for (int k = 0; k < d_model; k = k + 2) {
      double div_term = exp(k * -log(10000.0) / d_model);
      pe[i][k] = sin(i * div_term);
      pe[i][k + 1] = cos(i * div_term);
   }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.