HeadlinesBriefing favicon HeadlinesBriefing.com

Почему трансформерам нужны позиционные кодирования

Towards Data Science •
×

Углубляясь в фундаментальные модели для временных рядов, я понял, что не смогу по-настоящему понять их без предварительного понимания трансформеров. Я не хотел использовать эти модели как чёрные ящики, поэтому начал прослеживать идеи в обратном порядке, от фундаментальных моделей к трансформерам, и от трансформеров к самовниманию. Что сделало этот переход интересным, так это то, что хотя трансформеры изначально были созданы для языка, основная идея естественным образом переносится на временные ряды. Две модальности очень разные, но они имеют нечто фундаментальное: обе являются последовательностями, и в обоих случаях порядок меняет смысл. В языке собака кусает человека очень отличается от человек кусает собаку. Временные ряды не отличаются. Температура 30° вчера и 20° сегодня рассказывает другую историю, чем 20° вчера и 30° сегодня. Значения могут быть одинаковыми, но их порядок меняет смысл последовательности. Вопрос в том, что если самовнимание смотрит на все наблюдения одновременно, как трансформер узнаёт, какое наблюдение было первым, какое позже, или насколько далеко друг от друга находятся два наблюдения? Этот вопрос привёл меня к позиционному кодированию. Больше всего меня удивило то, как такая простая математическая идея может дать трансформеру чувство порядка. Точные методы с тех пор значительно развились, но основная проблема осталась прежней. Эта статья — моя попытка построить эту интуицию с нуля, начиная с простого временного ряда и следуя пути от необработанных наблюдений к самовниманию и, наконец, к позиционному кодированию.

От скалярных наблюдений к векторным представлениям Рассмотрим простой временной ряд, содержащий температуру, зафиксированную за пять рабочих дней: Пример временного ряда: история температуры за 5 дней Каждое наблюдение x_t — это только скаляр. Однако трансформер работает с векторами размерности d_model. Поэтому скалярные наблюдения нужно сначала отобразить в это пространство представлений. Простой способ сделать это — через обученную линейную проекцию, т.е. встраивание: e_t = W_e x_t + b_e что даёт нам последовательность векторных представлений: e_1, e_2, e_3, e_4, e_5 Встраивание — это глубокое, абстрактное представление ряда в форме многомерного числового вектора, который кодирует его признаки и который модель понимает. Каждый токен временного ряда представлен обученным встраиванием. Каждое e_t фиксирует информацию о наблюдаемом значении на этом временном шаге, но на данном этапе это просто представление наблюдения. Важное слово здесь — обученное. Модели не даётся предопределённое векторное представление для температуры, такой как 18°. Параметры W_e и b_e изучаются во время обучения, чтобы результирующие представления стали полезными для задачи. На данном этапе e_t представляет то, что было наблюдено. Он ещё не говорит модели, где это наблюдение произошло в последовательности.

Как самовнимание строит контекст? Самовнимание позволяет каждому наблюдению использовать информацию из остальной части последовательности. Предположим, мы хотим обновить представление пятницы. Модель сначала создаёт три обученные проекции из каждого e_t: q_t = W_Q e_t, k_t = W_K e_t, v_t = W_V e_t Векторы запроса, ключа и значения изучаются в блоке самовнимания. Матрицы W_Q, W_K и W_V также изучаются во время обучения. Модели заранее не говорят, как должен выглядеть полезный запрос, ключ или значение. Для пятницы её запрос q_5 сравнивается с ключами всех наблюдений: k_1, k_2, k_3, k_4, k_5. Каждое сравнение производит...